Flask-WTF
Flask-WTF?提供了簡單地?WTForms?的集成。
官方文檔:http://www.pythondoc.com/flask-wtf/index.html
功能
- 集成 wtforms。
- 帶有 csrf 令牌的安全表單。
- 全局的 csrf 保護。
- 支持驗證碼(Recaptcha)。
- 與 Flask-Uploads 一起支持文件上傳。
- 國際化集成。
WTForms表單的兩個主要功能是驗證用戶提交數據的合法性以及渲染模板。當然還包括一些其他的功能:CSRF保護,文件上傳等。安裝Flask-WTF默認也會安裝WTForms,因此使用以下命令來安裝Flask-WTF:
pip install flask-wtfWtforms 表單驗證:
安裝完Flask-WTF后。來看下第一個功能,就是用表單來做數據驗證,現在有一個forms.py文件,然后在里面創建一個RegistForm的注冊驗證表單:
from wtforms import Form,StringField from wtforms.validators import Length,EqualToclass RegisterForm(Form):name = StringField(validators=[Length(min=3,max=10,message='用戶名為3~10個字符')])password1= StringField(validators=[Length(min=6,max=10,message='密碼為3~10個字符')])password2 = StringField(validators=[EqualTo("password1",message='兩次密碼不一致')]) form = RegisterForm(request.form)if form.validate():RegistForm傳遞的是request.form進去進行初始化,并且判斷form.validate會返回用戶提交的數據是否滿足表單的驗證。?
Wtf常用驗證器?
數據發送過來,經過表單驗證,因此需要驗證器來進行驗證,以下對一些常用的內置驗證器進行講解:
?
- Email:驗證上傳的數據是否為郵箱。
- EqualTo:驗證上傳的數據是否和另外一個字段相等,常用的就是密碼和確認密碼兩個字段是否相等。
- InputRequired:原始數據的需要驗證。如果不是特殊情況,應該使用InputRequired。
- Length:長度限制,有min和max兩個值進行限制。
- NumberRange:數字的區間,有min和max兩個值限制,如果處在這兩個數字之間則滿足。
- Regexp:自定義正則表達式。
- URL:必須要是URL的形式。
- UUID:驗證UUID。
自定義驗證字段:
使用validate_fieldname(self,field)可以對某個字段進行更加詳細的驗證,如下:
class ProfileForm(Form):name = wtforms.StringField('name',[validators.InputRequired()])def validate_name(self,field):#獲取值:field.dataif len(field.data) > 5:raise wtforms.ValidationError(u'超過5個字符')?field就是傳入 的表單提交name值
?
Field常用參數:
在使用Field的時候,經常需要傳遞一些參數進去,以下將對一些常用的參數進行解釋:
?
- label(第一個參數):Field的label的文本。
- validators:驗證器。
- id:Field的id屬性,默認不寫為該屬性名。
- default:默認值。
- widget:指定的html控件。
常用Field:
- BooleanField:布爾類型的Field,渲染出去是checkbox。
-
FileField:文件上傳Field。
# forms.pyfrom flask_wtf.file import FileField,FileAllowed,FileRequiredclass UploadForm(FlaskForm):avatar = FileField(u'頭像:',validators=[FileRequired(),FileAllowed([])])# app.py@app.route('/profile/',methods=('POST','GET'))def profile():form = ProfileForm()if form.validate_on_submit():filename = secure_filename(form.avatar.data.filename)form.avatar.data.save(os.path.join(app.config['UPLOAD_FOLDER'],filename))return u'上傳成功'return render_template('profile.html',form=form) -
FloatField:浮點數類型的Field,但是渲染出去的時候是text的input。
-
IntegerField:整形的Field。同FloatField。
-
RadioField:radio類型的input。表單例子如下:
# form.pyclass RegistrationForm(FlaskForm):gender = wtforms.RadioField(u'性別:',validators=[DataRequired()])模板文件代碼如下:
<tr><td>{{ form.gender.label }}</td><td>{% for gender in form.gender %}{{ gender.label }}{{ gender }}{% endfor %}</td></tr>app.py文件的代碼如下,給gender添加了choices:
@app.route('/register/',methods=['POST','GET'])def register():form = RegistrationForm()form.gender.choices = [('1',u'男'),('2',u'女')]if form.validate_on_submit():return u'success'return render_template('register.html',form=form) -
SelectField:類似于RadioField。看以下示例:
# forms.pyclass ProfileForm(FlaskForm):language = wtforms.SelectField('Programming Language',choices=[('cpp','C++'),('py','python'),('text','Plain Text')],validators=[DataRequired()])再來看app.py文件:
@app.route('/profile/',methods=('POST','GET'))def profile():form = ProfileForm()if form.validate_on_submit():print form.language.datareturn u'上傳成功'return render_template('profile.html',form=form)模板文件為:
<form action="/profile/" method="POST">{{ form.csrf_token }}{{ form.language.label }}{{ form.language() }}<input type="submit"></form> -
StringField:渲染到模板中的類型為<input type='text'>,并且是最基本的文本驗證。
-
PasswordField:渲染出來的是一個password的input標簽。
-
TextAreaField:渲染出來的是一個textarea。
文件上傳:
from werkzeug.datastructures import FileStorage from werkzeug.utils import secure_filename@app.route('/upload/',methods=['GET','POST']) def upload():if request.method == 'GET':return render_template('upload.html')else:file = request.files.get('avatar')file.save(dst=secure_filename(file.filename))pass?
?訪問上傳文件:
@app.route('/images/<filename>/') def images(filename):return send_from_directory(directory=os.path.dirname(__file__),filename=filename)?
拾遺:
from werkzeug.datastructures import FileStorage,ImmutableDict,CombinedMultiDict from werkzeug.utils import secure_filename from flask_wtf.file import FileField,FileAllowed,FileRequiredclass UploadForm(Form):avatar = FileField(validators=[FileAllowed(['png','jpg','jpeg']),FileRequired()])desc = StringField(validators=[Required()])@app.route('/upload/',methods=['GET','POST']) def upload():if request.method == 'GET':return render_template('upload.html')else:form = UploadForm(CombinedMultiDict([request.form,request.files]))if form.validate():desc = form.desc.datafile = request.files.get('avatar')# file.save(dst=secure_filename(file.filename))?
?
轉載于:https://www.cnblogs.com/donghaoblogs/p/10389688.html
總結
- 上一篇: 【JavaScript基础笔记】模块化、
- 下一篇: Flask之DButils