摘要:特別是可以訪問(wèn)請(qǐng)求提交的表單數(shù)據(jù)。表單的代碼生成和驗(yàn)證提交的表單數(shù)據(jù)就是兩個(gè)很好的例子。優(yōu)勢(shì)擴(kuò)展使得處理表單能獲得更愉快的體驗(yàn)。設(shè)計(jì)了表單庫(kù)來(lái)使可以更加簡(jiǎn)便地管理操作表單數(shù)據(jù)。
1. 為什么使用Flask-WTF?
request對(duì)象公開(kāi)了所有客戶端發(fā)送的請(qǐng)求信息。特別是request.form可以訪問(wèn)POST請(qǐng)求提交的表單數(shù)據(jù)。 盡管Flask的request對(duì)象提供的支持足以處理web表單,但依然有許多任務(wù)會(huì)變得單調(diào)且重復(fù)。 表單的HTML代碼生成和驗(yàn)證提交的表單數(shù)據(jù)就是兩個(gè)很好的例子。
優(yōu)勢(shì):
Flask-WTF擴(kuò)展使得處理web表單能獲得更愉快的體驗(yàn)。該擴(kuò)展是一個(gè)封裝了與框架無(wú)關(guān)的WTForms包的Flask集成。2. 什么是表單處理?
在網(wǎng)頁(yè)中,為了和用戶進(jìn)行信息交互總是不得不出現(xiàn)一些表單。 flask設(shè)計(jì)了WTForm表單庫(kù)來(lái)使flask可以更加簡(jiǎn)便地管理操作表單數(shù)據(jù)。 WTForm中最重要的幾個(gè)概念如下: 1). Form類,開(kāi)發(fā)者自定義的表單必須繼承自Form類或者其子類。 Form類最主要的功能是通過(guò)其所包含的Field類提供對(duì)表單內(nèi)數(shù)據(jù)的快捷訪問(wèn)方式。 2). 各種Field類,即字段。一般而言每個(gè)Field類都對(duì)應(yīng)一個(gè)input的HTML標(biāo)簽。 比如WTForm自帶的一些Field類比如BooleanField就對(duì)應(yīng), SubmitField就對(duì)應(yīng)等等。 3). Validator類。這個(gè)類用于驗(yàn)證用戶輸入的數(shù)據(jù)的合法性。 比如Length驗(yàn)證器可以用于驗(yàn)證輸入數(shù)據(jù)的長(zhǎng)度, FileAllowed驗(yàn)證上傳文件的類型等等。
另外,flask為了防范csfr(cross-site request forgery)攻擊, 默認(rèn)在使用flask-wtf之前要求app一定要設(shè)置過(guò)secret_key。 最簡(jiǎn)單地可以通過(guò)app.config["SECRET_KEY"] = "xxxx"來(lái)配置。
3. 常見(jiàn)的Field類PasswordField 密碼字段,自動(dòng)將輸入轉(zhuǎn)化為小黑點(diǎn)
DateField 文本字段,格式要求為datetime.date一樣
IntergerField 文本字段,格式要求是整數(shù)
DecimalField 文本字段,格式要求和decimal.Decimal一樣
FloatField 文本字段,值是浮點(diǎn)數(shù)
BooleanField 復(fù)選框,值為True或者False
RadioField 一組單選框
SelectField 下拉列表,需要注意一下的是choices參數(shù)確定了下拉選項(xiàng),
但是和HTML中的
MultipleSelectField 可選多個(gè)值的下拉列表
Validator驗(yàn)證函數(shù)Validator是驗(yàn)證函數(shù),把一個(gè)字段綁定某個(gè)驗(yàn)證函數(shù)之后,flask會(huì)在接收表單中的數(shù)據(jù)之前對(duì)數(shù)據(jù)做一個(gè)驗(yàn)證, 如果驗(yàn)證成功才會(huì)接收數(shù)據(jù)。驗(yàn)證函數(shù)Validator如下,具體的validator可能需要的參數(shù)不太一樣,這里只給出 一些常用的,更多詳細(xì)的用法可以參見(jiàn)wtforms/validators.py文件的源碼,參看每一個(gè)validator類需要哪些參數(shù):
*基本上每一個(gè)validator都有message參數(shù),指出當(dāng)輸入數(shù)據(jù)不符合validator要求時(shí)顯示什么信息。
Email 驗(yàn)證電子郵件地址的合法性,要求正則模式是^.+@(12+)$
EqualTo 比較兩個(gè)字段的值,通常用于輸入兩次密碼等場(chǎng)景,可寫參數(shù)fieldname,不過(guò)注意其是一個(gè)字符串變量,指向同表單中的另一個(gè)字段的字段名
IPAddress 驗(yàn)證IPv4地址,參數(shù)默認(rèn)ipv4=True,ipv6=False。如果想要驗(yàn)證ipv6可以設(shè)置這兩個(gè)參數(shù)反過(guò)來(lái)。
Length 驗(yàn)證輸入的字符串的長(zhǎng)度,可以有min,max兩個(gè)參數(shù)指出要設(shè)置的長(zhǎng)度下限和上限,注意參數(shù)類型是字符串,不是INT!!
NumberRange 驗(yàn)證輸入數(shù)字是否在范圍內(nèi),可以有min和max兩個(gè)參數(shù)指出數(shù)字上限下限,注意參數(shù)類型是字符串,不是INT!!然后在這個(gè)validator的message參數(shù)里可以設(shè)置%(min)s和%(max)s兩個(gè)格式化部分,來(lái)告訴前端這個(gè)范圍到底是多少。其他validator也有這種類似的小技巧,可以參看源碼。
Optional 無(wú)輸入值時(shí)跳過(guò)同字段的其他驗(yàn)證函數(shù)
Required 必填字段
Regexp 用正則表達(dá)式驗(yàn)證值,參數(shù)regex="正則模式"
URL 驗(yàn)證URL,要求正則模式是^[a-z]+://(?P
AnyOf 確保值在可選值列表中。參數(shù)是values(一個(gè)可選值的列表)。特別提下,和SelectField進(jìn)行配合使用時(shí),不知道為什么SelectField的choices中項(xiàng)的值不能是數(shù)字。。否則AnyOf的values參數(shù)中即使有相關(guān)數(shù)字也無(wú)法識(shí)別出當(dāng)前選項(xiàng)是合法選項(xiàng)。我懷疑NoneOf可能也是一樣的套路。
NoneOf 確保值不在可選值列表中
#forms.py文件:用來(lái)設(shè)定規(guī)則 from flask_wtf import FlaskForm from flask_wtf.file import FileRequired, FileAllowed from wtforms import StringField, PasswordField, SubmitField, FileField from wtforms.validators import DataRequired, Length class LoginForm(FlaskForm): name = StringField( label="用戶名/郵箱/手機(jī)號(hào)", validators=[ # DataRequired("請(qǐng)輸入用戶名"), Length(3, 20, message="長(zhǎng)度不符"), ] ) passwd = PasswordField( label="密碼", validators=[ # DataRequired("請(qǐng)輸入密碼"), Length(3, 20), ], ) file = FileField( label="簡(jiǎn)歷", validators=[ FileRequired(), FileAllowed(["pdf", "txt"], "pdf 能被接收") ] )
#templates/demo/login.htmlTitle
#主程序 import random from flask import Flask, redirect, render_template from forms import LoginForm from flask_bootstrap import Bootstrap app = Flask(__name__) bootstrap = Bootstrap(app) app.config["SECRET_KEY"] = random._urandom(24) @app.route("/success/") def success(): return "success" @app.route("/login/", methods=("GET", "POST")) def submit(): # 實(shí)例化表單對(duì)象; form = LoginForm() if form.validate_on_submit(): print(form.data) return redirect("/success/") return render_template("demo/login.html", form=form) app.run()
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/44866.html
摘要:是一個(gè)編寫的微框架,讓我們可以使用語(yǔ)言快速實(shí)現(xiàn)一個(gè)網(wǎng)站或服務(wù)。使用當(dāng)你編寫一個(gè)函數(shù)時(shí),要想每個(gè)人都可以使用,需要用到來(lái)實(shí)現(xiàn)這個(gè)目標(biāo)。 flask flask是一個(gè)Python編寫的Web 微框架,讓我們可以使用Python語(yǔ)言快速實(shí)現(xiàn)一個(gè)網(wǎng)站或Web服務(wù)。 使用flask 當(dāng)你編寫一個(gè)函數(shù)時(shí),要想每個(gè)人都可以使用,需要用到flask來(lái)實(shí)現(xiàn)這個(gè)目標(biāo)。 導(dǎo)入falsk.Flask類 實(shí)...
摘要:并且只有數(shù)據(jù)庫(kù)中存在用戶可以登陸網(wǎng)頁(yè)。目前,對(duì)于用戶注冊(cè),不返回?cái)?shù)據(jù)庫(kù)。用戶注冊(cè)時(shí),添加信息到數(shù)據(jù)庫(kù)中存放表單操作每個(gè)表單都由一個(gè)繼承自的類表示類表示的是屬性為的元素。當(dāng)注冊(cè)表單某一項(xiàng)不滿足程序定義的規(guī)則時(shí)當(dāng)注冊(cè)成功時(shí),返回 flask_bootstrap Bootstrap 是 Twitter 開(kāi)發(fā)的一個(gè)開(kāi)源框架,它提供的用戶界面組件可用于創(chuàng)建整潔且具有吸引力的網(wǎng)頁(yè),而且這些網(wǎng)頁(yè)還能...
閱讀 3996·2021-11-22 15:31
閱讀 2540·2021-11-18 13:20
閱讀 3118·2021-11-15 11:37
閱讀 7053·2021-09-22 15:59
閱讀 750·2021-09-13 10:27
閱讀 3787·2021-09-09 09:33
閱讀 1450·2019-08-30 15:53
閱讀 2572·2019-08-29 15:37