在我们日常实现flask的form表单提交的功能时, 经常会遇到一个这个比较尴尬的问题,就是关于csrf保护的问题, 由于跟我一样的初学者在学习flask的时候,很多都是直接从网上copy的,俗称代码搬运工,但是由于很多博客的内容良莠不齐,或者缺胳膊短腿的, 所以很多时候我们按照对方的要求写出来的代码却无法成功执行, 其中csrf就是一个案例
两个Form引入的区别
针对这个问题,我们首先需要了解两个Form的区别(wtforms or flask_wtf)
from wtforms import Form
from flask_wtf import Form, FlaskForm
在个人的使用中,我发现最大的一个区别就是关于CSRF_TOKEN的支持区别,
从wtforms引入的Form,在我们提交前台form时,是不需要设置csrf相关内容的,它等于是不进行相关保护的form提交
而从flask_wtf 引入到得Form, 在提交前台form时,必须设置相关csrf_token值,跟form一起提交,否则会报错
那么对于第二种情况下的设置csrf_token,我们有哪些办法呢?
第一种,使用CsrfProtect(app)的方式来进行
# 前端引用csrf_token
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
# app 加载
CsrfProtect(app)
# 配置
SECRET_KEY = ''
第二种, 使用Form自带的渲染功能进行
# 在前端直接
{{ form.csrf_token }}
注意: 该情况下,必须在视图函数去主动声明Form,并将form渲染给前端如下图
image.png
网友评论