簡(jiǎn)介:Flask-WTF是集成WTForms,并帶有 csrf 令牌的安全表單和全局的 csrf 保護(hù)的功能。
每次我們?cè)诮⒈韱嗡鶆?chuàng)建的類都是繼承與flask_wtf中的FlaskForm,而FlaskForm是繼承WTForms中forms。
用法
-
創(chuàng)建基礎(chǔ)表單:
class LoginForm(FlaskForm): username = StringField() password = PasswordField() remember_me = BooleanField(label='Keep me logged in') -
CSRF保護(hù)
任何使用FlaskForm創(chuàng)建的表單發(fā)送請(qǐng)求,都會(huì)有CSRF的全部保護(hù),在對(duì)應(yīng)的template中HTML渲染表單時(shí),可以加入form.csrf_token:
<form method="post"> {{ form.csrf_token }} </form>如果模板中沒(méi)有表單,則可以使用一個(gè)隱藏的input標(biāo)簽加入csrf_token。
<form method="post"> <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/> </form> -
表單驗(yàn)證:
def login(): form = LoginForm() if form.validate_on_submit(): return redirect('/success') return render_template('login.html', form=form)使用
validate_on_submit來(lái)檢查是否是一個(gè) POST 請(qǐng)求并且請(qǐng)求是否有效。 -
文件上傳:
Flask-WTF 提供
FileField來(lái)處理文件上傳,它在表單提交后,自動(dòng)從flask.request.files中抽取數(shù)據(jù)。FileField的data屬性是一個(gè) Werkzeug FileStorage 實(shí)例。from werkzeug import secure_filename from flask_wtf.file import FileField class PhotoForm(Form): photo = FileField('Your photo') @app.route('/upload/', methods=('GET', 'POST')) def upload(): form = PhotoForm() if form.validate_on_submit(): filename = secure_filename(form.photo.data.filename) form.photo.data.save('uploads/' + filename) else: filename = None return render_template('upload.html', form=form, filename=filename)
-
驗(yàn)證碼:
Flask-WTF 通過(guò) RecaptchaField 也提供對(duì)驗(yàn)證碼的支持:
from flask_wtf import Form, RecaptchaField from wtforms import TextField class SignupForm(Form): username = TextField('Username') recaptcha = RecaptchaField()還需要配置一下信息:
字段 配置 RECAPTCHA_PUBLIC_KEY 必須 公鑰 RECAPTCHA_PRIVATE_KEY 必須 私鑰 RECAPTCHA_API_SERVER 可選 驗(yàn)證碼 API 服務(wù)器 RECAPTCHA_PARAMETERS 可選 一個(gè) JavaScript(api.js)參數(shù)的字典 RECAPTCHA_DATA_ATTRS 可選 一個(gè)數(shù)據(jù)屬性項(xiàng)列表 https://developers.google.com/recaptcha/docs/display
總結(jié)
? Flask-WTF提供了創(chuàng)建表單、csrf保護(hù)、表單請(qǐng)求驗(yàn)證、文件上傳、驗(yàn)證碼等功能。
參考鏈接:http://www.itdecent.cn/p/7e16877757f8
每天多努力那么一點(diǎn)點(diǎn),積少成多