最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python中進行表單處理的方法詳解

 更新時間:2023年12月13日 13:59:26   作者:dulu~dulu  
這篇文章主要為大家詳細(xì)介紹了Python中進行表單處理的方法,分別是利用Flask和Flask-WTF處理表單,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下

通過Flask處理表單

表單是在網(wǎng)頁中搜集用戶信息的各種表單控件的集合區(qū)域,表單控件包括文本框、單選框、復(fù)選框、提交按鈕等,用于實現(xiàn)客戶端和服務(wù)器端之間的數(shù)據(jù)交互。

利用Flask內(nèi)置的功能對表單進行處理的過程:

首先在模板文件中通過HTML代碼創(chuàng)建表單,然后通過請求上下文中的request.form對象獲取以及驗證表單數(shù)據(jù),最后通過消息閃現(xiàn)給用戶反饋正確或錯誤提示。

例如用戶注冊的案例:

(1)創(chuàng)建一個Flask項目,在項目中新建templates文件夾,在該文件夾下創(chuàng)建模板文件register.html,在該模板文件中使用<form>標(biāo)簽創(chuàng)建表單。

 <h1>注冊頁面</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=注冊></p>
    </form>

(2)在app.py文件中定義視圖函數(shù)register(),該視圖函數(shù)用于展示注冊頁面以及驗證用戶輸入的注冊數(shù)據(jù)是否符合要求。

@app.route('/register', methods=['GET', 'POST'])
def register():
    if request.method == 'POST':    # 判斷請求方式
        username = request.form.get('username')  # 獲取表單數(shù)據(jù)
        password = request.form.get('password')
        password2 = request.form.get('password2')
        if not all([username, password, password2]): # 驗證數(shù)據(jù)的完整性
            flash('請?zhí)钊胪暾畔?, category='message')
        # 驗證輸入的數(shù)據(jù)是否符合要求
        elif len(username) < 3 and len(username) > 0 or len(username) > 15:
            flash('用戶名長度大于3且小于15', category='info')
        elif password != password2: # 驗證兩次輸入的密碼是否一致
            flash('密碼不一致', category='error')
        else:
            return '注冊成功'
    return render_template('register.html')

通過Flask-WTF處理表單

處理表單涉及創(chuàng)建表單、驗證表單數(shù)據(jù)、獲取和保存表單數(shù)據(jù)、反饋錯誤提示等諸多操作,為了降低處理表單的難度,F(xiàn)lask提供了專門負(fù)責(zé)處理表單的擴展包——Flask-WTF。

Flask-WTF的安裝

pip install flask-wtf

Flask-WTF是構(gòu)建于 WTFForms之上的,所以引用的時候:

from flask_wtf import FlaskForm

常用字段類與表單控件的映射關(guān)系:

補充:datetime.date和datetime.datetime的區(qū)別

datetime.date類代表日期,它包含年、月和日的信息,但不包含具體的時間(小時、分鐘和秒)信息。

datetime.date(year, month, day)構(gòu)造函數(shù)創(chuàng)建一個日期對象,其中year、month和day分別表示年、月和日的整數(shù)值。

datetime.datetime類則代表日期和時間,它包含年、月、日以及具體的時間(小時、分鐘和秒)信息。

datetime.datetime(year, month, day, hour=0, minute=0, second=0)構(gòu)造函數(shù)創(chuàng)建一個日期時間對象,其中year、month、day、hour、minute和second分別表示年、月、日、小時、分鐘和秒的整數(shù)值。

常用的字段類都繼承自WTForms庫的Field類,可以通過Field類的構(gòu)造方法實例化所有字段類,以下是一些可配置的參數(shù):

參數(shù)validators的值是一個列表,包含了一系列用于驗證表單數(shù)據(jù)是否有效的驗證器,只有當(dāng)表單數(shù)據(jù)滿足驗證器的規(guī)則時,數(shù)據(jù)才能成功提交到服務(wù)器。

- 在使用驗證器之前需要先從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='長度應(yīng)該為3~15')])
    password = PasswordField('密碼:',
                    validators=[DataRequired(message='密碼不能為空')])
    password2 = PasswordField('確認(rèn)密碼:',
                    validators=[DataRequired(message='密碼不能為空'),
                        EqualTo('password', message='兩次密碼不一致')])
    submit = SubmitField('注冊')

使用Flask-WTF創(chuàng)建了注冊表單,但此時在模板文件中還無法渲染創(chuàng)建的表單。

- 如果希望在模板文件中渲染通過Flask-WTF創(chuàng)建的表單:

 ① 需要在視圖函數(shù)中將表單類的對象傳遞到模板文件中。

 ②在模板文件中獲取表單字段,將表單字段渲染到HTML頁面進行呈現(xiàn)。

#在項目的app.py文件中定義用于傳遞表單類對象的視圖函數(shù)
from flask import render_template
#,默認(rèn)情況下Flask-WTF為每個表單啟用CSRF保護,因此需要在程序中設(shè)置密鑰,
這樣可以讓Flask-WTF通過該密鑰生成CSRF令牌,以便用CSRF令牌驗證請求中表單數(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>注冊頁面</h1>
    <form method="post">
         {#獲取username對應(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='長度應(yīng)該為3~15')])
    password = PasswordField('密碼:',
                    validators=[DataRequired(message='密碼不能為空')])
    password2 = PasswordField('確認(rèn)密碼:',
                    validators=[DataRequired(message='密碼不能為空'),
                        EqualTo('password', message='兩次密碼不一致')])
    submit = SubmitField('注冊')
 
 
if __name__ == '__main__':
    app.run()

register的完整代碼如下:

<body>
    <h1>注冊頁面</h1>
    <form method="post">
         {#獲取username對應(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>

得到注冊頁面為:

通過Flask-WTF驗證表單

表單數(shù)據(jù)驗證分為客戶端驗證和服務(wù)端驗證

客戶端驗證是指客戶端(瀏覽器)對用戶提交的數(shù)據(jù)進行校驗??蛻舳蓑炞C可以通過多種方式進行驗證,包括使用HTML5內(nèi)置的驗證屬性、JavaScript表單驗證庫等??蛻舳蓑炞C可以實時動態(tài)提示用戶輸入是否正確,只有用戶輸入正確后才會將表單數(shù)據(jù)發(fā)送給服務(wù)器。

服務(wù)器端驗證是指用戶把表單數(shù)據(jù)提交到服務(wù)器端,由服務(wù)器端對表單數(shù)據(jù)進行校驗。在服務(wù)器端校驗時,若出現(xiàn)錯誤,則會將錯誤信息加入到響應(yīng)進行返回,待用戶修改后再次提交表單數(shù)據(jù),直至通過校驗為止。

- Flask-WTF的FlaskForm類中提供了用于驗證表單數(shù)據(jù)的validate_on_submit()方法,該方法內(nèi)部會調(diào)用表單驗證器對表單數(shù)據(jù)進行驗證,具體看如下示例:

(1)app.py創(chuàng)建表單

class RegisterForm(FlaskForm):
    username = StringField(label='用戶名:', render_kw={'required': False},
                           validators=[DataRequired(message='用戶名不能為空'),
                                       Length(3, 15, message='長度應(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('注冊')

(2)通過validate_on_submit()對表單數(shù)據(jù)進行驗證

validate_on_submit()方法的返回值是一個布爾值,若返回值為True,則表示用戶提交的表單數(shù)據(jù)符合驗證器定義的規(guī)則,說明通過驗證;若返回值為False,則用戶提交的表單數(shù)據(jù)不符合驗證器定義的規(guī)則,說明未通過驗證。

針對未通過驗證的情況,F(xiàn)laskForm會將錯誤消息添加到表單類的errors屬性中,errors屬性的值是一個匹配表單字段類屬性到錯誤信息列表的字典。若需要獲取具體的錯誤信息列表,則可以在模板文件中通過“form.字段名. errors”進行獲取。

app = Flask(__name__)
app.secret_key = '34sdfji9453#$@'
@app.route('/register', methods=['GET', 'POST'])
def register():
    form = RegisterForm()
    if form.validate_on_submit():
        return '注冊成功!'
    return render_template('register_verification.html', form=form)
if __name__ == '__main__':
    app.run()

(3) 在templates文件夾中創(chuàng)建模板文件register.html,并在該模板文件中獲取表單字段

<form method="post">
        {# 定義宏循環(huán)遍歷錯誤信息列表#}
        {% 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中進行表單處理的方法詳解的文章就介紹到這了,更多相關(guān)Python表單處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python實現(xiàn)列表推導(dǎo)式與生成器

    python實現(xiàn)列表推導(dǎo)式與生成器

    列表推導(dǎo)式和生成器都是Python中處理集合的強大工具,列表推導(dǎo)式用于快速生成列表,而生成器表達式則提供了一種節(jié)約內(nèi)存的方式來處理大型數(shù)據(jù)集,下面就來介紹一下python實現(xiàn)列表推導(dǎo)式與生成器,感興趣的可以了解一下
    2024-09-09
  • OpenCV2.3.1+Python2.7.3+Numpy等的配置解析

    OpenCV2.3.1+Python2.7.3+Numpy等的配置解析

    這篇文章主要介紹了OpenCV2.3.1+Python2.7.3+Numpy等的配置解析,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • python中time、datetime模塊的使用

    python中time、datetime模塊的使用

    這篇文章主要介紹了python中time、datetime模塊的使用,幫助大家更好的利用python處理時間,感興趣的朋友可以了解下
    2020-12-12
  • jupyter閃退的解決方法及卸載與安裝教程

    jupyter閃退的解決方法及卸載與安裝教程

    如果Anaconda的Jupyter Notebook無法打開并且頻繁閃退,可能是由于一些配置問題或者軟件沖突引起的,本文就來介紹一下jupyter閃退的解決方法及卸載與安裝教程,感興趣的可以了解一下
    2023-11-11
  • Django實現(xiàn)從數(shù)據(jù)庫中獲取到的數(shù)據(jù)轉(zhuǎn)換為dict

    Django實現(xiàn)從數(shù)據(jù)庫中獲取到的數(shù)據(jù)轉(zhuǎn)換為dict

    這篇文章主要介紹了Django實現(xiàn)從數(shù)據(jù)庫中獲取到的數(shù)據(jù)轉(zhuǎn)換為dict,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • Django request.META.get()獲取不到header頭的原因分析

    Django request.META.get()獲取不到header頭的原因分析

    這篇文章主要介紹了Django request.META.get()獲取不到header頭的原因分析,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • 基于python實現(xiàn)垂直爬蟲系統(tǒng)的方法詳解

    基于python實現(xiàn)垂直爬蟲系統(tǒng)的方法詳解

    這篇文章主要為大家詳細(xì)介紹了python實現(xiàn)垂直爬蟲系統(tǒng)的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • Python中的?enumerate和zip詳情

    Python中的?enumerate和zip詳情

    這篇文章主要介紹了Python中的?enumerate和zip,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-05-05
  • 如何用Python 加密文件

    如何用Python 加密文件

    這篇文章主要介紹了如何用Python 加密文件,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-09-09
  • python框架django項目部署相關(guān)知識詳解

    python框架django項目部署相關(guān)知識詳解

    這篇文章主要介紹了python框架django項目部署相關(guān)知識詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11

最新評論

永登县| 南雄市| 长寿区| 巴青县| 达州市| 罗平县| 陆良县| 望江县| 兴城市| 阿拉善右旗| 桓仁| 宁乡县| 龙海市| 庐江县| 辽源市| 伽师县| 西充县| 砀山县| 股票| 新绛县| 荥经县| 滦平县| 利津县| 长顺县| 富蕴县| 平昌县| 潞西市| 津南区| 额尔古纳市| 贵港市| 偏关县| 曲阳县| 阜康市| 金昌市| 波密县| 都兰县| 曲沃县| 定结县| 万盛区| 西畴县| 商城县|