日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Flask-WTF

發布時間:2025/7/25 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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-wtf

Wtforms 表單驗證:

安裝完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

總結

以上是生活随笔為你收集整理的Flask-WTF的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。