国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Flask狼書筆記 | 04_表單

這篇具有很好參考價(jià)值的文章主要介紹了Flask狼書筆記 | 04_表單。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

Flask狼書筆記 | 04_表單,學(xué)而時(shí)習(xí)之,flask,筆記,python,程序人生,學(xué)習(xí)

4 表單

表單是和用戶交互最常見的方式之一,本章涉及的Python包由WTForms、Flask-WTF、Flask-CKEditor。(p104)

4.1 HTML表單

通過<form>標(biāo)簽創(chuàng)建表單,<input>標(biāo)簽創(chuàng)建字段。

<form method="post">
    <input type="text" name="username" placeholder="用戶名">
</form>

WTForms:支持在Python中使用類定義表單,然后通過類定義生成對應(yīng)的HTML代碼。

4.2 使用Flask-WTF

Flask-WTF在Flask中集成了表單數(shù)據(jù)解析、CSRF保護(hù)、文件上傳等功能。

# 設(shè)置密鑰,flask-wtf使用程序密鑰來對csrf令牌進(jìn)行簽名(?)
app.secret_key = 'secret string'

定義表單類

from wtforms import From

class LoginForm(Form):
    ...
  • 常用的WTForms字段、實(shí)例化字段常用參數(shù)、常用的WTForms驗(yàn)證器,見(p107)。

輸出HTML代碼

>>> form = LoginForm()
>>> form.username()  # 假設(shè)在類中定義了username字段
>>> form.username.label()
  • 添加額外屬性:輸出的字段HTML代碼默認(rèn)只包含idname屬性,其他屬性可以:
    • 1、使用render_kw屬性(p109)
    • 2、在調(diào)用時(shí)傳入

在模板中渲染表單:我們需要把表單類實(shí)例傳入模板,然后再模板中調(diào)用表單類的屬性即可獲取字段對應(yīng)的HTML代碼。

return render_template('basic.html', form=form)
<form method="post">
    {{ form.csrf_token }}
    {{ form.username.label }}
    {{ form.username(class='form-contorl') }} <!-- 調(diào)用時(shí)傳入額外屬性值 -->
</form>
  • CSRF字段:在提交表單后會自動驗(yàn)證該字段,為使驗(yàn)證通過,需渲染。

  • 可以手動編寫HTML表單的代碼,name屬性與表單類保持一致。

4.3 處理表單數(shù)據(jù)

1 過程:解析請求 --> 轉(zhuǎn)換為Python數(shù)據(jù)類型 --> 驗(yàn)證 --> 處理。

2 提交表單:在HTML中,當(dāng)<form>標(biāo)簽聲明的表單中類型為submit的提交字段被點(diǎn)擊時(shí),就會創(chuàng)建一個(gè)提交表單的HTTP請求。

HTML表單中控制提交行為的屬性:action(目標(biāo)URL),method(HTTP請求方法),enctype(表單數(shù)據(jù)編碼類型)。(p112)

3 驗(yàn)證表單數(shù)據(jù)

  • 客戶端驗(yàn)證:可以實(shí)時(shí)動態(tài)提示用戶的輸入是否正確,降低服務(wù)器負(fù)載。可以通過HTML5內(nèi)置的驗(yàn)證屬性,或Javascript實(shí)現(xiàn)。
  • 服務(wù)器端驗(yàn)證:必須的,因?yàn)榭蛻舳瞬豢煽俊?/li>
<!-- 使用html5屬性 -->
<input type="text" name=username" required>
  • WTForms驗(yàn)證機(jī)制:實(shí)例化表單類時(shí)傳入數(shù)據(jù),然后調(diào)用實(shí)例的validate()方法,錯(cuò)誤消息會存儲到實(shí)例的errors屬性對應(yīng)的字典中。
>>> form.errors # 錯(cuò)誤消息字典
  • 獲取數(shù)據(jù)data屬性是一個(gè)匹配所有字段與對應(yīng)數(shù)據(jù)的字典。
>>> form.username.data
  • PRG模式:(Post/Redirect/Get),在瀏覽器中,刷新頁面時(shí)的默認(rèn)行為是發(fā)送上一個(gè)請求,會導(dǎo)致重復(fù)提交表單。因此在處理表單后應(yīng)返回一個(gè)重定向響應(yīng)(GET)。

4 渲染錯(cuò)誤消息:WTForms會把錯(cuò)誤消息添加到表單類的errors屬性中,這是一個(gè)匹配作為表單字段的類屬性到對應(yīng)的錯(cuò)誤消息列表的字典。

>>> form.username.errors

4.4 表單進(jìn)階實(shí)踐

簡化表單處理過程的技巧,以及表單的一些非常規(guī)應(yīng)用。

1 設(shè)置錯(cuò)誤消息語言:如下,所有繼承MyBaseForm的表單類,將使用新設(shè)置的錯(cuò)誤消息默認(rèn)語言。

from flask_wtf import FlaskForm 

app = Flask(__name__)
app.config['WTF_I18N_ENABLED'] = False

class MyBaseForm(FlaskForm):
    class Meta:
        locals = ['zh']
    
class HelloFrom(MyBaseForm):
    ...

疑惑:類內(nèi)部再定義一個(gè)Meta類是什么操作?

2 使用宏渲染表單:在模板中渲染表單時(shí),存在大量的重復(fù)工作:獲取<input>定義、獲取<label>定義、渲染錯(cuò)誤消息。為了避免每一個(gè)字段重復(fù)這些代碼,可以創(chuàng)建一個(gè)宏。(p120)

{% macro form_field(field) %}
	{{ field.label}}<br>
	{{ field(**kwargs) }}<br>
	{% if field.errors %}
		{% for error in field.errors %}
			{{ error }}
		{% endfor %}
	{% endif %}
{% end macro %}

3 自定義驗(yàn)證器:驗(yàn)證器是指在定義字段時(shí)傳入validators參數(shù)列表的可調(diào)用對象,接受formfield(字段)兩個(gè)位置參數(shù)。(p121)

  • 行內(nèi)驗(yàn)證器:在表單類中定義,用來驗(yàn)證某個(gè)特定的字段。
  • 全局驗(yàn)證器:可重用。定義一個(gè)函數(shù),在驗(yàn)證不通過時(shí)拋出ValidateionError異常。若需支持參數(shù),可用工廠函數(shù)形式。

工廠函數(shù):返回一個(gè)可調(diào)用對象的函數(shù)。

4 文件上傳

  • 渲染字段:在HTML中,渲染一個(gè)文件上傳字段只需要將<input字段的type屬性值設(shè)置為file。
<input type="file">

可以使用Flask-WTF提供的FileField類創(chuàng)建文件上傳字段,驗(yàn)證器包括FileRequired(是否包含文件對象)和FileAllowed(驗(yàn)證文件類型)。此外,可以通過限制請求報(bào)文的最大長度來限制文件大?。?/p>

app.config['MAX_CONTENT_LENGTH'] = 3 * 1024 * 1024
  • 獲取文件:可以在request.files中獲取,解析為Werkzeug中的FileStorage對象。不過Flask-WTF會自動獲取
request.files.get('photo')

# 在Flask-WTF中
f = form.photo.data
  • 處理文件名:可以過濾文件名中的危險(xiǎn)字符,或統(tǒng)一重命名(使用uuid)。
  • 其它:還有保存文件、獲取保存后的文件、多文件上傳等問題,此處省略,用到的時(shí)候再細(xì)看吧!

疑惑:使用uuid重命名了文件,后續(xù)如何找到這個(gè)文件呢,將文件名保存到數(shù)據(jù)庫?(畢竟文件名是隨機(jī)生成的)

多文件:單擊一次按鈕,可以一次性選擇多個(gè)文件并上傳。


心得筆記:感覺文件上傳這一塊彎彎繞繞挺多的,一時(shí)間看得有點(diǎn)懵。

5 使用Flask-CKEditor集成富文本編輯器:對我也是一個(gè)黑盒子 的感覺(p129)

疑惑:文本應(yīng)該以什么形式保存?

6 單個(gè)表單多個(gè)提交按鈕

如“發(fā)布文章”和“保存草稿”,需根據(jù)按鈕做出不同的處理??稍诒韱晤悇?chuàng)建多個(gè)SubmitField類型的字段,只有被點(diǎn)擊的字段才會出現(xiàn)在reqeust.form字典中,而調(diào)用data屬性時(shí)則會被處理為TrueFalse。

if form.validata_on_submit():
    if form.save.data:
        ...
    if form.publish.data:
        ...

7 單個(gè)頁面多個(gè)表單

問題是判斷當(dāng)前被提交的是哪個(gè)表單。

  • 單視圖處理:為兩個(gè)表單的提交字段設(shè)置不同的名稱。
  • 多視圖處理:通常在一個(gè)處理表單的視圖函數(shù)內(nèi)包含了兩類工作:渲染(GET)、處理提交的表單(POST)。因此可以單獨(dú)創(chuàng)建一個(gè)渲染的視圖函數(shù),再為兩個(gè)表單分別創(chuàng)建提交的視圖函數(shù)。

:表單提交請求的目標(biāo)URL通過action屬性設(shè)置。

小記

表單這一節(jié)的內(nèi)容比較豐富、繁雜,涉及的調(diào)包操作也較多,看完后仍有不少細(xì)節(jié)之處理解模糊。偶爾會體會到,之前看過的《Python工匠》對于我理解本書內(nèi)容的幫助。

學(xué)這節(jié)的時(shí)候,我看得多,動手少,難免看了后面忘前面。一節(jié)書看完,再去看相關(guān)的源代碼時(shí)卻仍有些看不懂。文章來源地址http://www.zghlxwxcb.cn/news/detail-675563.html

到了這里,關(guān)于Flask狼書筆記 | 04_表單的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Flask狼書筆記 | 07_留言板

    Flask狼書筆記 | 07_留言板

    這是一個(gè)簡單的程序,涉及到的大部分是之前所學(xué)習(xí)到的基礎(chǔ)知識。新涉及的python包: BootStrap-Flask , Flask-Moment , Faker , Flask-Debug Toolbar 。 Git : 將大量代碼放到 app.py 一個(gè)文件里,代碼的管理會不太方便,可讀性也差。本節(jié)將使用一種新的代碼結(jié)構(gòu) 導(dǎo)入配置 :可以從pyt

    2024年02月09日
    瀏覽(43)
  • Flask狼書筆記 | 05_數(shù)據(jù)庫

    Flask狼書筆記 | 05_數(shù)據(jù)庫

    這一章學(xué)習(xí)如何在Python中使用DBMS(數(shù)據(jù)庫管理系統(tǒng)),來對數(shù)據(jù)庫進(jìn)行管理和操作。本書使用 SQLite 作為示例。 注 :按下 Ctrl+F5 ,或 Shift+F5 可以清除瀏覽器緩存。 分為SQL(Structured Query Language)數(shù)據(jù)庫和NoSQL(Not Only SQL)數(shù)據(jù)庫。 SQL :稍顯復(fù)雜,但不容易出錯(cuò),可以適應(yīng)大

    2024年02月09日
    瀏覽(48)
  • Flask Web開發(fā)實(shí)戰(zhàn)(狼書)| 筆記第1、2章

    Flask Web開發(fā)實(shí)戰(zhàn)(狼書)| 筆記第1、2章

    2023-8-11 以前對網(wǎng)站開發(fā)萌生了想法,又有些急于求成,在B站照著視頻敲了一個(gè)基于flask的博客系統(tǒng)。但對于程序的代碼難免有些囫圇吞棗,存在許多模糊或不太理解的地方,只會照葫蘆畫瓢。 而當(dāng)自己想開發(fā)一個(gè)什么網(wǎng)站的時(shí),就如同摸著石頭過河,常在許多小問題上卡住

    2024年02月12日
    瀏覽(22)
  • flask web學(xué)習(xí)之flask與http(四)

    一、重定向進(jìn)階功能 1.1 重定向回上一個(gè)頁面 有時(shí)候,我們在某些界面執(zhí)行操作一些操作后,不希望界面跳轉(zhuǎn)到其他指定網(wǎng)頁上,而希望網(wǎng)頁能重定向?yàn)橛脩魟偛艦g覽的界面,以便繼續(xù)完成操作,例如在某個(gè)頁面需要登錄后才能進(jìn)行操作,我們希望登錄后不跳轉(zhuǎn)到主頁界面,

    2024年02月03日
    瀏覽(19)
  • 一、Flask學(xué)習(xí)之HTML

    一、Flask學(xué)習(xí)之HTML

    首先需要搭建環(huán)境: app = Flask(__name__) : 創(chuàng)建了一個(gè)Flask應(yīng)用實(shí)例, __name__ 參數(shù)表示當(dāng)前模塊的名稱,通常用于確定資源的位置。 @app.route(\\\'/show/info\\\') : 這是一個(gè)裝飾器,將下面的 index() 函數(shù)與指定的路由 /show/info 關(guān)聯(lián)起來。當(dāng)用戶訪問這個(gè)路由時(shí),將執(zhí)行 index() 函數(shù)。 運(yùn)行會

    2024年01月21日
    瀏覽(21)
  • 二、Flask學(xué)習(xí)之CSS

    二、Flask學(xué)習(xí)之CSS

    1.1 直接在標(biāo)簽中添加 1.2 在頭部添加 1.3 單獨(dú)在文件添加 mycss.css html文件: 上面三種表示的結(jié)果是一樣的。 CSS有多種選擇器: ID選擇器(使用#) 類選擇器(使用.) 標(biāo)簽選擇器 效果: 屬性選擇器 后代選擇器 3.1高度和寬度 寬度是可以支持百分比的 div 等塊級標(biāo)簽?zāi)J(rèn)是有效

    2024年01月20日
    瀏覽(19)
  • 四、Flask學(xué)習(xí)之JavaScript

    四、Flask學(xué)習(xí)之JavaScript

    JavaScript ,作為一種前端腳本語言,賦予網(wǎng)頁生動的交互性和動態(tài)性。通過它,開發(fā)者能夠操作DOM(文檔對象模型)實(shí)現(xiàn)頁面元素的動態(tài)改變、響應(yīng)用戶事件,并借助AJAX技術(shù)實(shí)現(xiàn)異步數(shù)據(jù)請求,為用戶提供更流暢的瀏覽體驗(yàn)。在現(xiàn)代Web開發(fā)中,JavaScript不僅是構(gòu)建豐富用戶界面

    2024年01月24日
    瀏覽(22)
  • flask處理表單數(shù)據(jù)

    flask處理表單數(shù)據(jù)

    flask處理表單數(shù)據(jù) 處理表單數(shù)據(jù)在任何 web 應(yīng)用開發(fā)中都是一個(gè)常見的需求。在 Flask 中,你可以使用 request 對象來獲取通過 HTTP 請求發(fā)送的數(shù)據(jù)。對于 POST 請求,可以通過 request.form 訪問表單數(shù)據(jù)。例如: 然而,上述方法只提供了基本的表單處理能力,如果你需要更復(fù)雜的功

    2024年02月14日
    瀏覽(21)
  • flask web學(xué)習(xí)之模板(二)

    一、模板結(jié)構(gòu)組織 1.1 局部模板 當(dāng)多個(gè)獨(dú)立模板中都會使用同一塊HTML代碼時(shí),我們可以把這部分代碼抽離出來,存儲到局部模板中。這樣,既可以避免重復(fù),也可以方便統(tǒng)一管理。 1.2 宏 宏是Jinja2提供的一個(gè)非常有用的特性,它類似Python的函數(shù)。使用宏可以把一部分代碼封裝

    2024年01月15日
    瀏覽(14)
  • Python Flask 表單的使用

    Python Flask 表單的使用

    新建templ;ates/index.html 內(nèi)容如下 在 ?針對這個(gè)templates目錄需要做一下模板設(shè)置? 選擇 jinja2 新建 main_from.py 效果 如果針對post提交可以修改 main_from.py代碼 和修改index.html

    2024年03月23日
    瀏覽(72)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包