我重置了本地flask环境,但是没有通过捕获它的依赖项,pip freeze然后再将其删除。因此,我不得不重新安装整个堆栈的最新版本。
现在,我突然无法使用表单进行验证了。Flask声称CSRF将丢失。
def register():
form = RegisterForm()
if form.validate_on_submit():
...
return make_response("register.html", form=form, error=form.errors)
第一次发送Get邮件时,我form.errors按预期检索了一个空邮件。现在,我填写表格并提交并form.errors显示:{'csrf_token': [u'CSRF token missing']}
真奇怪 我想知道Flask-WTF是否已更改,并且使用错误。
我可以清楚地看到form.CSRF_token存在,那么为什么声称它不存在呢?
CSRFTokenField:
我从没有接触过工作模板,但是仍然将其张贴在这里:
{% from "_formhelpers.html" import render_field %}
{% extends "base.html" %}
{% block body %}
Register
{% if error %}
Error: {{ error }}{% endif %}
{{form.hidden_tag()}}
{{ render_field(form.name) }}
{{ render_field(form.email) }}
{{ render_field(form.password) }}
{{ render_field(form.confirm) }}
{% endblock %}
这是一个新错误吗?
更新:
我已经重新安装了一切,问题仍然存在。
正如Martijn建议的那样,我正在调试以下方法flask_wtf:
def validate_csrf_token(self, field):
if not self.csrf_enabled:
return True
if hasattr(request, 'csrf_valid') and request.csrf_valid:
# this is validated by CsrfProtect
return True
if not validate_csrf(field.data, self.SECRET_KEY, self.TIME_LIMIT):
raise ValidationError(field.gettext('CSRF token missing'))
最后一个条件是引发验证错误。
field.data = "1391296243.8##1b02e325eb0cd0c15436d0384f981f06c06147ec"
self.SECRET_KEY = None (? Is this the problem)
self.TIME_LIMIT = 3600
你是对的,HMAC比较失败。…两个值每次都不同。
return hmac_compare == hmac_csrf
我在配置中同时定义了SECRET_KEY和CSRF_SESSION_KEY。