创建表单

这部分文档涉及表单(Form)信息。

安全表单

无需任何配置,Form 是一个带有 CSRF 保护的并且会话安全的表单。我们鼓励你什么都不做。

但是如果你想要禁用 CSRF 保护,你可以这样:

  1. form = Form(csrf_enabled=False)

如果你想要全局禁用 CSRF 保护,你真的不应该这样做。但是你要坚持这样做的话,你可以在配置中这样写:

  1. WTF_CSRF_ENABLED = False

为了生成 CSRF 令牌,你必须有一个密钥,这通常与你的 Flask 应用密钥一致。如果你想使用不同的密钥,可在配置中指定:

  1. WTF_CSRF_SECRET_KEY = 'a random string'

文件上传

Flask-WTF 提供 FileField 来处理文件上传,它在表单提交后,自动从 flask.request.files 中抽取数据。FileFielddata 属性是一个 Werkzeug FileStorage 实例。

例如:

  1. from werkzeug import secure_filename
  2. from flask_wtf.file import FileField
  3. class PhotoForm(Form):
  4. photo = FileField('Your photo')
  5. @app.route('/upload/', methods=('GET', 'POST'))
  6. def upload():
  7. form = PhotoForm()
  8. if form.validate_on_submit():
  9. filename = secure_filename(form.photo.data.filename)
  10. form.photo.data.save('uploads/' + filename)
  11. else:
  12. filename = None
  13. return render_template('upload.html', form=form, filename=filename)

Note

记得把你的 HTML 表单的 enctype 设置成 multipart/form-data,既是:

  1. <form action="/upload/" method="POST" enctype="multipart/form-data">
  2. ....
  3. </form>

此外,Flask-WTF 支持文件上传的验证。提供了 FileRequiredFileAllowed

FileAllowed 能够很好地和 Flask-Uploads 一起协同工作, 例如:

  1. from flask.ext.uploads import UploadSet, IMAGES
  2. from flask_wtf import Form
  3. from flask_wtf.file import FileField, FileAllowed, FileRequired
  4. images = UploadSet('images', IMAGES)
  5. class UploadForm(Form):
  6. upload = FileField('image', validators=[
  7. FileRequired(),
  8. FileAllowed(images, 'Images only!')
  9. ])

也能在没有 Flask-Uploads 下挑大梁。这时候你需要向 FileAllowed 传入扩展名即可:

  1. class UploadForm(Form):
  2. upload = FileField('image', validators=[
  3. FileRequired(),
  4. FileAllowed(['jpg', 'png'], 'Images only!')
  5. ])

HTML5 控件

Note

自 wtforms 1.0.5 版本开始,wtforms 就内嵌了 HTML5 控件和字段。如果可能的话,你可以考虑从 wtforms 中导入它们。

我们将会在 0.9.3 版本后移除 html5 模块。

你可以从 wtforms 中导入一些 HTML5 控件:

  1. from wtforms.fields.html5 import URLField
  2. from wtforms.validators import url
  3. class LinkForm(Form):
  4. url = URLField(validators=[url()])

验证码

Flask-WTF 通过 RecaptchaField 也提供对验证码的支持:

  1. from flask_wtf import Form, RecaptchaField
  2. from wtforms import TextField
  3. class SignupForm(Form):
  4. username = TextField('Username')
  5. recaptcha = RecaptchaField()

这伴随着诸多配置,你需要逐一地配置它们。

RECAPTCHA_PUBLIC_KEY必须 公钥
RECAPTCHA_PRIVATE_KEY必须 私钥
RECAPTCHA_API_SERVER可选 验证码 API 服务器
RECAPTCHA_PARAMETERS可选 一个 JavaScript(api.js)参数的字典
RECAPTCHA_DATA_ATTRS可选 一个数据属性项列表 https://developers.google.com/recaptcha/docs/display

RECAPTCHA_PARAMETERS 和 RECAPTCHA_DATA_ATTRS 的示例:

  1. RECAPTCHA_PARAMETERS = {'hl': 'zh', 'render': 'explicit'}
  2. RECAPTCHA_DATA_ATTRS = {'theme': 'dark'}

对于应用测试时,如果 app.testingTrue ,考虑到方便测试,Recaptcha 字段总是有效的。

在模板中很容易添加 Recaptcha 字段:

  1. <form action="/" method="post">
  2. {{ form.username }}
  3. {{ form.recaptcha }}
  4. </form>

我们为你提供了例子: [email protected]