稍微看了一下flask form的验证源码
@app.route('/form', methods=['POST', 'GET'])
def form():
form = EntriesForm()//1
if request.method == 'GET':
return render_template('hello.html', form=form)
elif request.method == 'POST':
if form.validate_on_submit():
return "success"
return render_template('hello.html', form=form)
简单看一段代码,第一处明明没有从request中获取form数据为什么就可以直接拿到数据了呢。我看了一下源码和其他人的解释,原因是这样的在使用之前flask已经将环境中的表单数据放到了全局request中,当你调用路由的时候flask已经把数据传入你的form中了。具体解释请看: 点击打开链接
然后是表单验证的过程,首先回去调用FlaskForm中的validate_on_submit方法。
然后回去调用父类Form的validate方法
继续去调用父类BaseForm的validate方法
意思就是去调用每一个字段的validate方法,这里举例一个StringField,去调用父类的validate方法
最后点一下csrf_token,如果这个在模板中提交的话那么,会作为隐藏字段传到表单中
默认使用的字段是CSRFTokenField,它使用的验证方法是调用_FlaskFormCSRF中的验证方法
_FlaskFormCSRF而是去调用validate_csrf_token方法
最后的最后这个方法回去使用itsdangerous的URLSafeTimedSerializer做token验证