关于WTForms 进行表单验证的一个问题

先上代码吧:

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.']
但是还是有问题了,我是必填项,但是没有内容应该不提交到后台的。应该是这样的

clipboard.png

但是现在不填了还是提交到后台,

模板里尝试了以下方式,都不管用:

 {{ form.hidden_tag() }}

 <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>

  {{ form.csrf_token }} 
阅读 13.7k
6 个回答
新手上路,请多包涵

当你定义你的表单的时候,如果出现上面的错误,表示你的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 }}

是不是中文编码问题?尝试加unicode:

pythonclass PostForm(Form):
    title = StringField(u'标题',validators=[Required()])
    body = PageDownField(u'正文',validators=[Required()])
    submit = SubmitField(u'提交')

你可以把form.errors输出,看看是什么原因

为啥我validate_on_submit()不能用啊

新手上路,请多包涵

都1年了,不知道还有用不?这个明显是csrf的问题。
1、关闭csrf验证
2、在<fomr></form>中间,增加{{ form.hidden_tag() }}

推荐#2