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 が参考になった。
テスト時に、appのconfigでWTF_CSRF_ENABLEDをFalseに設定すればいいようだ。
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対策を無効にせずとも、テストを行える。


コメント