Flask-WTF 创建表单P2
表单安全
无需任何配置,FlaskForm将提供具有CSRF(Cross-site request forgery,也被称为one-click attack 或者session riding,通常缩写为CSRF 或者XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。)保护的会话安全表单,我们鼓励你什么都不用修改。
但是如果你想要禁用csrf保护,可以这样做:
form = FlaskForm(csrf_enabled=False)
您可以全局禁用它 -- 但是强烈不推荐您使用这样的配置:
WTF_CSRF_ENABLED = False
为了生成csrf令牌,你必须有一个秘密密钥,这通常与你的Flask应用程序密钥(SECREY_KEY)相同。 如果要使用另一个密钥,请单独配置它:
WTF_CSRF_SECRET_KEY = 'a random string'
文件上传
Flask-WTF提供的FileField与WTForms提供的字段不同。 它将检查文件是FileStorage的非空实例,否则数据将为None。
from flask_wtf import FlaskForm
from flask_wtf.file import FileField, FileRequired
from werkzeug.utils import secure_filename
class PhotoForm(FlaskForm):
photo = FileField(validators=[FileRequired()])
@app.route('/upload', methods=['GET', 'POST'])
def upload():
if form.validate_on_submit():
f = form.photo.data
filename = secure_filename(f.filename)
f.save(os.path.join(
app.instance_path, 'photos', filename
))
return redirect(url_for('index'))
return render_template('upload.html', form=form)
记住将HTML表单的enctype设置为multipart / form-data,否则request.files将为空。
<form method="POST" enctype="multipart/form-data">
...
</form>
Flask-WTF处理将表单数据传递给您的表单。 如果您准确的传递数据,请记住request.form必须与request.files结合使用,才能查看文件数据。
form = PhotoForm()
# is equivalent to:
from flask import request
from werkzeug.datastructures import CombinedMultiDict
form = PhotoForm(CombinedMultiDict((request.files, request.form)))
验证
Flask-WTF支持使用FileRequired和FileAllowed验证文件上传,它们可以与Flask-WTF和WTForms的FileField类一起使用。
FileAllowed也适用于Flask-Uploads。
from flask_uploads import UploadSet, IMAGES
from flask_wtf import FlaskForm
from flask_wtf.file import FileField, FileAllowed, FileRequired
images = UploadSet('images', IMAGES)
class UploadForm(FlaskForm):
upload = FileField('image', validators=[
FileRequired(),
FileAllowed(images, 'Images only!')
])
他也可以不使用Flask-Uploads,而是通过直接传递扩展名来使用。
class UploadForm(FlaskForm):
upload = FileField('image', validators=[
FileRequired(),
FileAllowed(['jpg', 'png'], 'Images only!')
])
验证码
Flask-WTF还提供了通过Recaptcha对RecaptchaField进行校验:
from flask_wtf import FlaskForm, RecaptchaField
from wtforms import TextField
class SignupForm(FlaskForm):
username = TextField('Username')
recaptcha = RecaptchaField()
这可以个一些配置共同使用,不过必须配置它们。
RECAPTCHA_PUBLIC_KEY | 需要一个公钥. |
---|---|
RECAPTCHA_PRIVATE_KEY | 需要一个私钥. |
RECAPTCHA_API_SERVER | 可选择设定的Recaptcha API服务器. |
RECAPTCHA_PARAMETERS | 可设定JavaScript (api.js) 参数. |
RECAPTCHA_DATA_ATTRS | 可设定数据属性选项. 参考链接 |
RECAPTCHA_PARAMETERS和RECAPTCHA_DATA_ATTRS的示例如下:
RECAPTCHA_PARAMETERS = {'hl': 'zh', 'render': 'explicit'}
RECAPTCHA_DATA_ATTRS = {'theme': 'dark'}
为了方便测试您的应用程序,如果app.testing为True,recaptcha字段将始终为您方便可见。
并且可以轻松地在模板中设置:
<form action="/" method="post">
{{ form.username }}
{{ form.recaptcha }}
</form>