Python3 Flask-WTFのテストのCSRFトークンの扱い

Flask-WTFを使用しつつ、テストする。

  • Flask==0.11.1
  • Flask-Login==0.4.1
  • Flask-WTF==0.14.2

Flask-WTFで使用されているwtformsは、CSRF対策が施されている。ビュー関数内で検証するのだが、トークンが必要である。 テスト環境では、トークンを利用する方法がわからない。

調べてみたところ、 python - Flask-WTF / WTForms with Unittest fails validation, but works without Unittest - Stack Overflow が参考になった。

テスト時に、appconfigWTF_CSRF_ENABLEDFalseに設定すればいいようだ。

app.config['WTF_CSRF_ENABLED'] = False

キーの名前の通り、CSRFが無効になり、トークンが使われなくなる。テストは次のように、

def login(self, username, password):
    return self.client.post('/login', data=dict(
        username=username,
        password=password,
    ), follow_redirects=True)

必要なパラメータを渡せば良い。

CSRF対策を有効にしたままテストする

Flask-WTFのドキュメントDeveloper Interface — Flask-WTF 0.14によると、

During testing, it might be useful to access the signed token in g.csrftoken and the raw token in session['csrftoken'].

と述べている。g変数にトークンが格納されているようだ。そして、セッション内ではcsrf_tokenをキーとしている。なので、テストスクリプト内で、

from flask import g

def login(self, username, password):
    return self.client.post('/login', data=dict(
        username=username,
        password=password,
        csrf_token=g.csrf_token,
    ), follow_redirects=True)

のようにして、トークンをビュー関数に渡せば、CSRF対策を無効にせずとも、テストを行える。

タイトルとURLをコピーしました