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
対策を無効にせずとも、テストを行える。
コメント