先上代码吧:
class PostForm(Form):
title = StringField('标题',validators=[Required()])
body = PageDownField("正文",validators=[Required()])
submit = SubmitField('提交')
<form action="{{ url_for('.post') }}" method=POST>
标题:{{ form.title(size=140) }}<br/>
正文:{{ form.body(rows = 15,cols=140) }}
{{ form.submit }}
</form>
视图函数如下:
form = PostForm(request.form)
if request.method == 'POST' and form.validate():
现在的问题是构造form成功,title和body能得到值,request.method 也是等于'POST',但是form.validate()结果为False,我尝试了form.validate_on_submit()也是False,所以现在无法进行验证,但是按照道理应该是True啊,不知道是怎么回事,求解答
经过提醒,打印错误输出是flask CSRF token missing
,查了一下,初始化的时候加入了flask_wtf.CsrfProtect(app)
在未填写的时候提交输出errors:{'body': [u'This field is required.'], 'title': [u'This field is required.']
但是还是有问题了,我是必填项,但是没有内容应该不提交到后台的。应该是这样的
但是现在不填了还是提交到后台,
模板里尝试了以下方式,都不管用:
{{ form.hidden_tag() }}
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
{{ form.csrf_token }}
当你定义你的表单的时候,如果出现上面的错误,表示你的Form对象是从 flask_wtf 中导入 Form,而不是从wtforms 中导入的。从flask_wtf 导入的Form 导致CSRF 保护的大部分功能都不能能工作,除了可以使用form.validate_on_submit()外。这个错误的出现就是因为你的导入错误,而不是你的代码问题。
解决这个错误的办法就是
from flask_wtf import Form 替换成下面的
from wtforms import Form
然后在有表单的地方加上{{ form.csrf_token }}