表單驗證(WTF)

官方文檔
在Flask項目開發(fā)中針對提交表單的校驗伺通,可以使用Flask-WTF擴展庫進行快速的字段校驗箍土,也可以進行頁面快速渲染,并提供跨站請求偽造的保護功能罐监。

安裝Flask-WTF

pip install flask-wtf

實現(xiàn)注冊功能

注冊表單模型定義

在定義的表單類中定義需要驗證的username吴藻、password和password2字段,并實現(xiàn)如下校驗:
校驗密碼password2和password相等
校驗用戶名是否存在
校驗用戶名的長度是否符合規(guī)范

 # 導(dǎo)入擴展類
 from flask_wtf import FlaskForm
 # 導(dǎo)入驗證字段
 from wtforms import StringField, SubmitField, ValidationError
 # 導(dǎo)入表單驗證
 from wtforms.validators import DataRequired, EqualTo
 
 from user.models import User
 
 
 class UserRegisterForm(FlaskForm):
     """
     登錄注冊表單驗證
     """
     username = StringField('用戶名', validators=[DataRequired()])
     password = StringField('密碼', validators=[DataRequired()])
     password2 = StringField('確認密碼', validators=[DataRequired(),
                                                 EqualTo('password', '密碼不一致')]
                             )
     submit = SubmitField('注冊')
 
     def validate_username(self, field):
         # 驗證用戶名是否重復(fù)
         if User.query.filter(User.username == field.data).first():
             raise ValidationError('用戶名已存在')
 
         # 對用戶名的長度進行判斷
         if len(field.data) < 3:
             raise ValidationError('用戶名長度不能少于3個字符')
 
         if len(field.data) > 6:
             raise ValidationError('用戶名長度不能大于6個字符')

注意: 驗證字段的方法名為: validate_字段(self, field)

定義注冊視圖函數(shù)
當(dāng)HTTP請求為GET時弓柱,將表單驗證對象返回給頁面沟堡。
當(dāng)HTTP請求為POST時,通過方法validate_on_submit()方法進行字段校驗和提交判斷矢空,如果校驗失敗航罗,則可以從form.errors中獲取錯誤信息。
如果驗證通過妇多,則從form.字段.data中獲取到字段的值伤哺。

@user_blueprint.route('/register/', methods=['GET', 'POST'])
def register():
    form = UserRegisterForm()
    if request.method == 'GET':
        return render_template('register.html',form=form)

    if request.method == 'POST':
        # 驗證提交的字段信息
        if form.validate():
            username = form.username.data
            password = form.password.data
            # 實現(xiàn)注冊,保存用戶信息到User模型中
            user = User()
            user.username = username
            user.password = generate_password_hash(password)
            user.save()
            return redirect(url_for('user.login'))        
        # 驗證失敗者祖,from.errors中存在錯誤信息
        return render_template('register.html',form=form)

模板展示

注冊模板采用繼承父模板base.html的形式。在register.html模壓中分析如下:

  1. 定義字段名: {{ form.字段.label }}
  2. 定義input輸入框: {{ form.字段 }}
  3. 展示錯誤信息: {{ form.errors.字段 }}
  4. 跨站請求偽造: {{ form.csrf_token }}
    注冊register.html頁面如下:
{% extends 'base.html' %}

{% block content %}
    <form action="" method="post">
        {{ form.csrf_token }}
        {{ form.username.label }} : {{ form.username }}
        {% if form.errors %}
            {{ form.errors.password2[0] }}
        {% endif %}<br>
        {{ form.password.label }} : {{ form.password }}<br>
        {{ form.password2.label }} : {{ form.password2 }}
        {% if form.errors %}
            {{ form.errors.password2[0] }}
        {% endif %}<br>
        {{ form.submit() }}
    </form>

{% endblock %}

注意: 通過form.字段解析的input標(biāo)簽中可以自定義樣式绢彤,如{{ form.字段(class='xxx'七问, style='color:red') }}

常見字段類型

字段類型 說明
StringField 普通文本字段
PasswordField 密碼文本字段
SubmitField 提交按鈕
HiddenField 隱藏文本字段
TextAreaField 多行文本字段
DateField 文本字段,datetime.date格式
DateTimeField 文本字段茫舶,datetime.datetime格式
IntegerField 文本字段械巡,整數(shù)類型
FloatField 文本字段,小數(shù)類型
BooleanField 復(fù)選框饶氏,值為True或False
RadioField 單選框
SelectField 下拉列表
FileField 文件上傳字段

驗證器

驗證器 說明
DataRequired 確保字段有值(并且if判斷為真)
Email 郵箱地址
IPAddress IPv4的IP地址
Length 規(guī)定字符長度
NumberRange 輸入數(shù)值的范圍
EqualTo 驗證兩個字段的一致性
URL 有效的URL
Regexp 正則驗證
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末讥耗,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子疹启,更是在濱河造成了極大的恐慌古程,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件喊崖,死亡現(xiàn)場離奇詭異挣磨,居然都是意外死亡,警方通過查閱死者的電腦和手機荤懂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門茁裙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人节仿,你說我怎么就攤上這事晤锥。” “怎么了廊宪?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵矾瘾,是天一觀的道長女轿。 經(jīng)常有香客問我,道長霜威,這世上最難降的妖魔是什么谈喳? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮戈泼,結(jié)果婚禮上婿禽,老公的妹妹穿的比我還像新娘。我一直安慰自己大猛,他們只是感情好扭倾,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著挽绩,像睡著了一般膛壹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上唉堪,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天模聋,我揣著相機與錄音,去河邊找鬼唠亚。 笑死链方,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的灶搜。 我是一名探鬼主播祟蚀,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼割卖!你這毒婦竟也來了前酿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤鹏溯,失蹤者是張志新(化名)和其女友劉穎罢维,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體剿涮,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡言津,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了取试。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片悬槽。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖瞬浓,靈堂內(nèi)的尸體忽然破棺而出初婆,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布磅叛,位于F島的核電站屑咳,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏弊琴。R本人自食惡果不足惜兆龙,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望敲董。 院中可真熱鬧紫皇,春花似錦、人聲如沸腋寨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽萄窜。三九已至铃剔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間查刻,已是汗流浹背键兜。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留穗泵,地道東北人蝶押。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像火欧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子茎截,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348