Flask-WTF 提供了對 WTForms 的集成, 從 0.9.0 版本開始匆绣,F(xiàn)lask-WTF 不再從 WTforms 中導(dǎo)入任何東西最盅,你需要從 WTForms 導(dǎo)入字段突雪。表單字段的定義需要去WTForms中參考:http://wtforms.readthedocs.io/en/latest/
默認(rèn)情況下,F(xiàn)lask-WTF為避免CSRF攻擊涡贱,需要程序設(shè)置一個密鑰咏删。
app = Flask(__name__)
app.config['SECRET_KEY'] = 'xcxxxx'
定義表達(dá)類:使用Flask-WTF,每個表達(dá)都由一個繼承Form的類表示
from flask_wtf import Form
from wtforms import TextField, SubmitField
from wtforms.validators import DataRequired
class MyForm(Form):
name = StringField('name', validators=[DataRequired()])
submit = SubmitField('Submit')
模版中渲染
<form method="POST" action="/">
{{ form.csrf_token }}
{{ form.name.label }} {{ form.name(size=20) }}
</form>
或配合flaks-bootstarp直接生成
{% import "bootstarp/wtf.html" as wtf%}
{{ wtf.quick_form(form) }}
視圖中驗(yàn)證表達(dá)
@app.route('/submit', methods=('GET', 'POST'))
def submit():
form = MyForm()
if form.validate_on_submit():
return redirect('/success')
return render_template('submit.html', form=form)
上傳文件
定義表單類
from flask_wtf.file import FileField, FileAllowed, FileRequired
class MyForm(Form):
name = StringField('name', validators=[DataRequired()])
photo = FileField('Your photo', validators=[FileRequired(), FileAllowed(['jpg', 'png'], 'Image Only')])
submit = SubmitField('Submit')
試圖函數(shù)中處理
from flask import request
from werkzeug.utils import secure_filename
@main.route('/myform', methods=['GET', 'POST'])
def myform():
form = MyForm()
if form.validate_on_submit():
uploadFile = request.files['photo'] # 獲取上傳文件句柄
uploadFile.save('/tmp/%s' %secure_filename(uploadFile.filename)) # secure_filenamed檢測并過濾用戶的輸入
return redirect('/')
return render_template('myform.html', form=form)
模版中注意
注解
請記得設(shè)置 HTML 表單的 enctype 為 multipart/form-data 问词, 即:
<form action="/upload/" method="POST" enctype="multipart/form-data">
....
</form>
wtforms SelectField 動態(tài)添加option項(xiàng)
很多情況下我們使用<select>
表單的時候會動態(tài)從數(shù)據(jù)庫中加載值, 修改實(shí)例化form類對象的屬性督函;
例如:在用戶注冊頁面可能需要選擇角色
Form類
class AddUserForm(Form):
name = StringField('Username', validators=[DataRequired()])
role_id = SelectField('role', choices=[], coerce=int)
submit = SubmitField(u'提交')
Views
form = AddUserForm()
form.role_id.choices += [(r.id, r.name) for r in Role.query.order_by('name').all() ]