Python中進(jìn)行表單處理的方法詳解
通過(guò)Flask處理表單
表單是在網(wǎng)頁(yè)中搜集用戶信息的各種表單控件的集合區(qū)域,表單控件包括文本框、單選框、復(fù)選框、提交按鈕等,用于實(shí)現(xiàn)客戶端和服務(wù)器端之間的數(shù)據(jù)交互。
利用Flask內(nèi)置的功能對(duì)表單進(jìn)行處理的過(guò)程:
首先在模板文件中通過(guò)HTML代碼創(chuàng)建表單,然后通過(guò)請(qǐng)求上下文中的request.form對(duì)象獲取以及驗(yàn)證表單數(shù)據(jù),最后通過(guò)消息閃現(xiàn)給用戶反饋正確或錯(cuò)誤提示。
例如用戶注冊(cè)的案例:
(1)創(chuàng)建一個(gè)Flask項(xiàng)目,在項(xiàng)目中新建templates文件夾,在該文件夾下創(chuàng)建模板文件register.html,在該模板文件中使用<form>標(biāo)簽創(chuàng)建表單。
<h1>注冊(cè)頁(yè)面</h1> {#給用戶展示不同的消息閃現(xiàn)#} {% macro print_error(type) %} {% for message in get_flashed_messages(category_filter = (type)) %} <p class="error" style="color: red; display:inline;">{{ message }}</p> {% endfor %} {% endmacro %} <form action="" method=post> <span>用戶名:</span><br> <input type=text name=username>{{ print_error('message') }} {{ print_error('info') }}<br> <span>密碼:</span><br> <input type=password name=password><br> <span>確認(rèn)密碼:</span><br> <input type=password name=password2>{{ print_error('error') }}<br> <p><input type=submit value=注冊(cè)></p> </form>
(2)在app.py文件中定義視圖函數(shù)register(),該視圖函數(shù)用于展示注冊(cè)頁(yè)面以及驗(yàn)證用戶輸入的注冊(cè)數(shù)據(jù)是否符合要求。
@app.route('/register', methods=['GET', 'POST']) def register(): if request.method == 'POST': # 判斷請(qǐng)求方式 username = request.form.get('username') # 獲取表單數(shù)據(jù) password = request.form.get('password') password2 = request.form.get('password2') if not all([username, password, password2]): # 驗(yàn)證數(shù)據(jù)的完整性 flash('請(qǐng)?zhí)钊胪暾畔?, category='message') # 驗(yàn)證輸入的數(shù)據(jù)是否符合要求 elif len(username) < 3 and len(username) > 0 or len(username) > 15: flash('用戶名長(zhǎng)度大于3且小于15', category='info') elif password != password2: # 驗(yàn)證兩次輸入的密碼是否一致 flash('密碼不一致', category='error') else: return '注冊(cè)成功' return render_template('register.html')
通過(guò)Flask-WTF處理表單
處理表單涉及創(chuàng)建表單、驗(yàn)證表單數(shù)據(jù)、獲取和保存表單數(shù)據(jù)、反饋錯(cuò)誤提示等諸多操作,為了降低處理表單的難度,F(xiàn)lask提供了專門負(fù)責(zé)處理表單的擴(kuò)展包——Flask-WTF。
Flask-WTF的安裝
pip install flask-wtf
Flask-WTF是構(gòu)建于 WTFForms之上的,所以引用的時(shí)候:
from flask_wtf import FlaskForm
常用字段類與表單控件的映射關(guān)系:
補(bǔ)充:datetime.date和datetime.datetime的區(qū)別
datetime.date類代表日期,它包含年、月和日的信息,但不包含具體的時(shí)間(小時(shí)、分鐘和秒)信息。
datetime.date(year, month, day)構(gòu)造函數(shù)創(chuàng)建一個(gè)日期對(duì)象,其中year、month和day分別表示年、月和日的整數(shù)值。
datetime.datetime類則代表日期和時(shí)間,它包含年、月、日以及具體的時(shí)間(小時(shí)、分鐘和秒)信息。
datetime.datetime(year, month, day, hour=0, minute=0, second=0)構(gòu)造函數(shù)創(chuàng)建一個(gè)日期時(shí)間對(duì)象,其中year、month、day、hour、minute和second分別表示年、月、日、小時(shí)、分鐘和秒的整數(shù)值。
常用的字段類都繼承自WTForms庫(kù)的Field類,可以通過(guò)Field類的構(gòu)造方法實(shí)例化所有字段類,以下是一些可配置的參數(shù):
參數(shù)validators的值是一個(gè)列表,包含了一系列用于驗(yàn)證表單數(shù)據(jù)是否有效的驗(yàn)證器,只有當(dāng)表單數(shù)據(jù)滿足驗(yàn)證器的規(guī)則時(shí),數(shù)據(jù)才能成功提交到服務(wù)器。
- 在使用驗(yàn)證器之前需要先從wtforms.validators模塊中導(dǎo)入相應(yīng)的類:
用Flask-WTF創(chuàng)建表單:
from flask import Flask, render_template from flask_wtf import FlaskForm from wtforms import StringField, PasswordField, SubmitField from wtforms.validators import DataRequired, Length, EqualTo app = Flask(__name__) class RegisterForm(FlaskForm): username = StringField(label='用戶名:', validators=[DataRequired(message='用戶名不能為空'), Length(3, 15, message='長(zhǎng)度應(yīng)該為3~15')]) password = PasswordField('密碼:', validators=[DataRequired(message='密碼不能為空')]) password2 = PasswordField('確認(rèn)密碼:', validators=[DataRequired(message='密碼不能為空'), EqualTo('password', message='兩次密碼不一致')]) submit = SubmitField('注冊(cè)')
使用Flask-WTF創(chuàng)建了注冊(cè)表單,但此時(shí)在模板文件中還無(wú)法渲染創(chuàng)建的表單。
- 如果希望在模板文件中渲染通過(guò)Flask-WTF創(chuàng)建的表單:
① 需要在視圖函數(shù)中將表單類的對(duì)象傳遞到模板文件中。
②在模板文件中獲取表單字段,將表單字段渲染到HTML頁(yè)面進(jìn)行呈現(xiàn)。
#在項(xiàng)目的app.py文件中定義用于傳遞表單類對(duì)象的視圖函數(shù) from flask import render_template #,默認(rèn)情況下Flask-WTF為每個(gè)表單啟用CSRF保護(hù),因此需要在程序中設(shè)置密鑰, 這樣可以讓Flask-WTF通過(guò)該密鑰生成CSRF令牌,以便用CSRF令牌驗(yàn)證請(qǐng)求中表單數(shù)據(jù)的真?zhèn)巍? app.secret_key = '34sdfji9453#$@' @app.route('/register', methods=['GET', 'POST']) def register(): form = RegisterForm() return render_template('register_wtf.html', form=form)
在templates文件夾中創(chuàng)建模板文件register_wtf.html,并在該模板文件中獲取表單字段
<body> <h1>注冊(cè)頁(yè)面</h1> <form method="post"> {#獲取username對(duì)應(yīng)的標(biāo)簽名稱#} <span>{{ form.username.label }}</span><br> {{ form.username }}<br> {#調(diào)用表單字段渲染為HTML#} <span>{{ form.password.label }}</span><br> {{ form.password }}<br> <span>{{ form.password2.label }}</span><br> {{ form.password2 }}<br> <p>{{ form.submit }}</p> </form> </body>
則:app.py的完整代碼如下:
from flask import Flask, render_template from flask_wtf import FlaskForm from wtforms import StringField, PasswordField, SubmitField from wtforms.validators import DataRequired, Length, EqualTo from flask import render_template app = Flask(__name__) app.secret_key = '34sdfji9453#$@' @app.route('/register', methods=['GET', 'POST']) def register(): form = RegisterForm() return render_template('register.html', form=form) class RegisterForm(FlaskForm): username = StringField(label='用戶名:', validators=[DataRequired(message='用戶名不能為空'), Length(3, 15, message='長(zhǎng)度應(yīng)該為3~15')]) password = PasswordField('密碼:', validators=[DataRequired(message='密碼不能為空')]) password2 = PasswordField('確認(rèn)密碼:', validators=[DataRequired(message='密碼不能為空'), EqualTo('password', message='兩次密碼不一致')]) submit = SubmitField('注冊(cè)') if __name__ == '__main__': app.run()
register的完整代碼如下:
<body> <h1>注冊(cè)頁(yè)面</h1> <form method="post"> {#獲取username對(duì)應(yīng)的標(biāo)簽名稱#} <span>{{ form.username.label }}</span><br> {{ form.username }}<br> {#調(diào)用表單字段渲染為HTML#} <span>{{ form.password.label }}</span><br> {{ form.password }}<br> <span>{{ form.password2.label }}</span><br> {{ form.password2 }}<br> <p>{{ form.submit }}</p> </form> </body>
得到注冊(cè)頁(yè)面為:
通過(guò)Flask-WTF驗(yàn)證表單
表單數(shù)據(jù)驗(yàn)證分為客戶端驗(yàn)證和服務(wù)端驗(yàn)證
客戶端驗(yàn)證是指客戶端(瀏覽器)對(duì)用戶提交的數(shù)據(jù)進(jìn)行校驗(yàn)??蛻舳蓑?yàn)證可以通過(guò)多種方式進(jìn)行驗(yàn)證,包括使用HTML5內(nèi)置的驗(yàn)證屬性、JavaScript表單驗(yàn)證庫(kù)等??蛻舳蓑?yàn)證可以實(shí)時(shí)動(dòng)態(tài)提示用戶輸入是否正確,只有用戶輸入正確后才會(huì)將表單數(shù)據(jù)發(fā)送給服務(wù)器。
服務(wù)器端驗(yàn)證是指用戶把表單數(shù)據(jù)提交到服務(wù)器端,由服務(wù)器端對(duì)表單數(shù)據(jù)進(jìn)行校驗(yàn)。在服務(wù)器端校驗(yàn)時(shí),若出現(xiàn)錯(cuò)誤,則會(huì)將錯(cuò)誤信息加入到響應(yīng)進(jìn)行返回,待用戶修改后再次提交表單數(shù)據(jù),直至通過(guò)校驗(yàn)為止。
- Flask-WTF的FlaskForm類中提供了用于驗(yàn)證表單數(shù)據(jù)的validate_on_submit()方法,該方法內(nèi)部會(huì)調(diào)用表單驗(yàn)證器對(duì)表單數(shù)據(jù)進(jìn)行驗(yàn)證,具體看如下示例:
(1)app.py創(chuàng)建表單
class RegisterForm(FlaskForm): username = StringField(label='用戶名:', render_kw={'required': False}, validators=[DataRequired(message='用戶名不能為空'), Length(3, 15, message='長(zhǎng)度應(yīng)該為3~15')]) password = PasswordField('密碼:', render_kw={'required': False}, validators=[DataRequired(message='密碼不能為空')]) password2 = PasswordField('確認(rèn)密碼:', render_kw={'required': False}, validators=[DataRequired(message='密碼不能為空'), EqualTo('password', message='兩次密碼不一致')]) submit = SubmitField('注冊(cè)')
(2)通過(guò)validate_on_submit()對(duì)表單數(shù)據(jù)進(jìn)行驗(yàn)證
validate_on_submit()方法的返回值是一個(gè)布爾值,若返回值為True,則表示用戶提交的表單數(shù)據(jù)符合驗(yàn)證器定義的規(guī)則,說(shuō)明通過(guò)驗(yàn)證;若返回值為False,則用戶提交的表單數(shù)據(jù)不符合驗(yàn)證器定義的規(guī)則,說(shuō)明未通過(guò)驗(yàn)證。
針對(duì)未通過(guò)驗(yàn)證的情況,F(xiàn)laskForm會(huì)將錯(cuò)誤消息添加到表單類的errors屬性中,errors屬性的值是一個(gè)匹配表單字段類屬性到錯(cuò)誤信息列表的字典。若需要獲取具體的錯(cuò)誤信息列表,則可以在模板文件中通過(guò)“form.字段名. errors”進(jìn)行獲取。
app = Flask(__name__) app.secret_key = '34sdfji9453#$@' @app.route('/register', methods=['GET', 'POST']) def register(): form = RegisterForm() if form.validate_on_submit(): return '注冊(cè)成功!' return render_template('register_verification.html', form=form) if __name__ == '__main__': app.run()
(3) 在templates文件夾中創(chuàng)建模板文件register.html,并在該模板文件中獲取表單字段
<form method="post"> {# 定義宏循環(huán)遍歷錯(cuò)誤信息列表#} {% macro print_error(form_fields) %} {% for error_message in form_fields %} <p class="error" style="color: red; display:inline;" >{{ error_message }}</p> {% endfor %} {% endmacro %} <span>{{ form.username.label }}</span><br> {{ form.username }}{{ print_error(form.username.errors) }}<br> <span>{{ form.password.label }}</span><br> {{ form.password }}{{ print_error(form.password.errors) }}<br> <span>{{ form.password2.label }}</span><br> {{ form.password2 }}{{ print_error(form.password2.errors) }}<br> <p>{{ form.submit }}</p> </form>
到此這篇關(guān)于Python中進(jìn)行表單處理的方法詳解的文章就介紹到這了,更多相關(guān)Python表單處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python實(shí)現(xiàn)將pvr格式轉(zhuǎn)換成pvr.ccz的方法
這篇文章主要介紹了python實(shí)現(xiàn)將pvr格式轉(zhuǎn)換成pvr.ccz的方法,涉及Python實(shí)現(xiàn)格式轉(zhuǎn)換的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-04-04服務(wù)器端jupyter notebook映射到本地瀏覽器的操作
這篇文章主要介紹了服務(wù)器端jupyter notebook映射到本地瀏覽器的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04使用Python實(shí)現(xiàn)MP4轉(zhuǎn)GIF
在日常生活中,我們經(jīng)常會(huì)遇到需要將 MP4 文件轉(zhuǎn)換為 GIF 文件的需求,本文將介紹一種使用 Python 實(shí)現(xiàn) MP4 轉(zhuǎn) GIF 程序的方法,這種方法簡(jiǎn)單易學(xué),而且完全免費(fèi),需要的可以參考下2023-12-12使用Python進(jìn)行數(shù)據(jù)備份的指南大全
利用Python進(jìn)行數(shù)據(jù)備份與恢復(fù)是一種常見的做法,對(duì)于數(shù)據(jù)庫(kù),你可以使用Python中的數(shù)據(jù)庫(kù)連接庫(kù)(如sqlite3、SQLAlchemy等)連接到數(shù)據(jù)庫(kù),然后執(zhí)行備份操作,將數(shù)據(jù)庫(kù)的內(nèi)容保存到一個(gè)備份文件中,本文給大家介紹了使用Python進(jìn)行數(shù)據(jù)備份的指南大全,需要的朋友可以參考下2024-05-05