成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Flask Web Development —— Web表單(下)

yeooo / 1650人閱讀

摘要:局部變量用于保存從表單中接收到的名字,初始化時(shí)變量為。在語句中,這個(gè)名字被賦值給局部變量且表單域的數(shù)據(jù)屬性通過賦值為空字符串而被清除。示例重定向和用戶會(huì)話在上一個(gè)版本中,局部變量用于保存用戶在表單中輸入的姓名。

4、視圖函數(shù)中的表單操作

在新版本的hello.py中,index()視圖函數(shù)渲染表單并接收其數(shù)據(jù)。示例4-4展示更新后的index()視圖函數(shù)。

示例4-4. hello.py:路由方法

@app.route("/", methods=["GET", "POST"]) 
def index():
    name = None
    form = NameForm()
    if form.validate_on_submit():
        name = form.name.data
        form.name.data = ""
    return render_template("index.html", form=form, name=name)

methods參數(shù)被添加到app.route裝飾器中,目的是讓Flask注冊(cè)視圖函數(shù)為GETPOST請(qǐng)求處理程序到URL映射中。若methods參數(shù)未給出,視圖函數(shù)將只注冊(cè)為GET請(qǐng)求。

添加POST到方法列表中是有必要的,因?yàn)楸韱翁峤皇褂?b>POST請(qǐng)求操作會(huì)更方便。使用GET請(qǐng)求提交表單也行,只是GET請(qǐng)求沒有body部分,數(shù)據(jù)是追加到URL上作為返回字符串且可以在瀏覽器的地址欄中看到。由于這個(gè)和其他一些原因,表單提交通常使用POST請(qǐng)求。

局部變量name用于保存從表單中接收到的名字,初始化時(shí)變量為None。視圖函數(shù)創(chuàng)建一個(gè)NameForm實(shí)例來表示一個(gè)表單。表單的validate_on_submit()方法會(huì)在表單被提交且數(shù)據(jù)通過了所有驗(yàn)證的時(shí)候返回True。其他情況下validate_on_submit()返回False。該方法的返回值有效的決定了表單是需要渲染還是其他處理。

當(dāng)用戶第一次訪問應(yīng)用程序,服務(wù)器會(huì)收到一個(gè)沒有表單數(shù)據(jù)的GET請(qǐng)求,這個(gè)時(shí)候validate_on_submit()會(huì)返回False。if語句中的代碼將被略過直接進(jìn)行渲染模板處理,這個(gè)時(shí)候render_template()函數(shù)將獲取表單對(duì)象和已經(jīng)被設(shè)置為Nonename變量作為參數(shù)。用戶則可以在瀏覽器上看到表單的顯示。

當(dāng)用戶提交表單,服務(wù)器會(huì)收到一個(gè)帶有數(shù)據(jù)的POST請(qǐng)求。validate_on_submit()調(diào)用Required()驗(yàn)證程序驗(yàn)證相應(yīng)的表單域。如果name不為空,驗(yàn)證程序接收它同時(shí)validate_on_submit()返回True?,F(xiàn)在用戶輸入的名字已經(jīng)是作為表單域可訪問的數(shù)據(jù)屬性。在if語句中,這個(gè)名字被賦值給局部變量name且表單域的數(shù)據(jù)屬性通過賦值為空字符串而被清除。調(diào)用最后一行的render_template()來渲染模板,但是這次name參數(shù)包含了來自表單的名字,所以可以看到一個(gè)個(gè)性化的打招呼頁面。

  

建議:如果你有克隆在GitHub上的應(yīng)用程序,你現(xiàn)在可以運(yùn)行git checkout 4a來切換到這個(gè)版本的應(yīng)用程序。

圖像4-1展示用戶初次進(jìn)入網(wǎng)站在瀏覽器窗口看到的表單是怎樣的。當(dāng)用戶提交名字,應(yīng)用程序收到一個(gè)個(gè)性化的打招呼響應(yīng)。下面的表單仍然出現(xiàn),所以只要愿意用戶可以提交一個(gè)新的名字。圖像4-2展示用戶輸入名字后的狀態(tài)。

圖像4-1. Flask-WTF的web表單

如果用戶提交一個(gè)空名字的表單,Required()驗(yàn)證程序捕捉到錯(cuò)誤,就像圖像4-3那樣。注意這些功能都是自動(dòng)提供的。這是一個(gè)很好的例子,精心設(shè)計(jì)的Flask-WTF和Flask-Bootstrap擴(kuò)展能讓您的應(yīng)用程序更強(qiáng)大。

圖像4-2. 提交后的web表單

圖像4-3. 驗(yàn)證錯(cuò)誤后的web表單

5、重定向和用戶sessions

上個(gè)版本的hello.py有個(gè)問題。如果你輸入你的名字并提交它,然后單擊瀏覽器中刷新按鈕,你將得到一個(gè)警告要求再次確認(rèn)之前提交的表單。因?yàn)檎?qǐng)求刷新頁面的時(shí)候?yàn)g覽器重復(fù)了上一次發(fā)送的請(qǐng)求。當(dāng)上一次發(fā)送的是一個(gè)帶有表單數(shù)據(jù)的POST請(qǐng)求,刷新頁面會(huì)導(dǎo)致重復(fù)的表單提交,事實(shí)上這些并不是我們想看到的。

許多用戶不能理解來自瀏覽器的這些警告。出于這個(gè)原因,對(duì)web應(yīng)用程序來說,一種不錯(cuò)的方法是永遠(yuǎn)不將POST請(qǐng)求作為瀏覽器最后發(fā)送的請(qǐng)求。

這個(gè)方法可以使用redirect響應(yīng)POST請(qǐng)求來代替常規(guī)的響應(yīng)來實(shí)現(xiàn)。重定向是一個(gè)特殊類型的響應(yīng),使用URL來代替HTML代碼字符串。當(dāng)瀏覽器收到這個(gè)響應(yīng),它就會(huì)給重定向URL發(fā)出一個(gè)GET請(qǐng)求,然后顯示頁面。頁面也許需要幾毫秒的時(shí)間來加載,因?yàn)樾枰l(fā)送第二個(gè)請(qǐng)求給服務(wù)器,除此之外用戶不會(huì)看到任何不同?,F(xiàn)在最后一次請(qǐng)求為GET,所以刷新會(huì)像預(yù)期的那樣。這個(gè)方法被稱為Post/Redirect/Get模式

但是這個(gè)方法帶來了第二個(gè)問題。當(dāng)應(yīng)用程序處理POST請(qǐng)求,需要訪問用戶輸入并保存在form.name.data中的名字,但是一旦該請(qǐng)求結(jié)束表單數(shù)據(jù)就會(huì)丟失。因?yàn)?b>POST請(qǐng)求是通過重定向來處理,應(yīng)用程序需要存儲(chǔ)名字,以便重定向后的請(qǐng)求可以得到它并使用它來創(chuàng)建真實(shí)的響應(yīng)。

應(yīng)用程序可以“記住”一些變量從一個(gè)請(qǐng)求到另一個(gè)請(qǐng)求通過將變量保存到用戶會(huì)話中,對(duì)于每一個(gè)連接過來的客戶端它都是一個(gè)私有存儲(chǔ)區(qū)域。作為一個(gè)與請(qǐng)求上下文關(guān)聯(lián)的變量之一,用戶會(huì)話已經(jīng)在第二章中介紹過了。它被稱為會(huì)話并可以像Python標(biāo)準(zhǔn)字典那樣訪問。

  

注:默認(rèn)情況下,用戶會(huì)話被存放于客戶端的cookies,使用配置的SECRET_KEY來加密簽名。任何篡改cookie內(nèi)容將會(huì)使簽名無效,從而使會(huì)話失效。

示例4-5展示實(shí)現(xiàn)重定向和用戶會(huì)話的index()視圖函數(shù)。

示例4-5. hello.py:重定向和用戶會(huì)話

from flask import Flask, render_template, session, redirect, url_for

@app.route("/", methods=["GET", "POST"]) 
def index():
    form = NameForm()
    if form.validate_on_submit():
        session["name"] = form.name.data
        return redirect(url_for("index"))
    return render_template("index.html", form=form, name=session.get("name"))

在上一個(gè)版本中,局部變量name用于保存用戶在表單中輸入的姓名。這個(gè)變量位于用戶會(huì)話中的session["name"]中,因此可以保存很長(zhǎng)時(shí)間。

現(xiàn)在請(qǐng)求來自表單的合法數(shù)據(jù)都會(huì)以redirect()調(diào)用來結(jié)束,生成HTTP重定向響應(yīng)。redirect()函數(shù)把URL作為重定向的參數(shù)。這個(gè)例子中使用的重定向URL是一個(gè)根URL,所以響應(yīng)可以寫成redirect("/")這樣簡(jiǎn)潔,但是我們通常使用Flask的URL生成器函數(shù)url_for()來代替。我們鼓勵(lì)使用url_for()函數(shù)來生成URLs,因?yàn)樵摵瘮?shù)使用URL映射來生成URLs,所以生成的URLs保證與定義的路由兼容,并且使用這個(gè)函數(shù)任何路由名發(fā)生變化都會(huì)自動(dòng)變得有效,路由功能不受影響。

url_for()唯一必須的參數(shù)就是endpoint名,也是每個(gè)路由的內(nèi)部名。默認(rèn)情況下,路由的endpoint是一個(gè)附加到視圖函數(shù)的名稱。在這個(gè)示例中,處理根URL的視圖函數(shù)為index(),所以給url_for()的名稱為index。

最后一個(gè)改動(dòng)是在render_template()函數(shù)中,使用session.get("name")從會(huì)話中獲取name參數(shù)。和使用普通字典一樣,使用get()去請(qǐng)求字典key來避免發(fā)生找不到key異常,因?yàn)閷?duì)于沒有的keyget()返回默認(rèn)值None。

  

建議:如果你有克隆在GitHub上的應(yīng)用程序,你現(xiàn)在可以運(yùn)行git checkout 4b來切換到這個(gè)版本的應(yīng)用程序。

這個(gè)版本的應(yīng)用程序,你可以在你的瀏覽器中刷新頁面看到你預(yù)期的行為。

6、消息提示

有時(shí)候在請(qǐng)求完成后給用戶一個(gè)提示消息是非常有用的。可以是一個(gè)確認(rèn)消息、警告消息或錯(cuò)誤消息。典型的示例就是當(dāng)你在網(wǎng)站提交登錄表單出現(xiàn)錯(cuò)誤的時(shí)候服務(wù)器響應(yīng)渲染登錄表單并伴隨一條消息,告知你的用戶名或密碼無效。

作為核心特性Flask具有這樣的功能。示例4-6展示如何使用flash()函數(shù)來實(shí)現(xiàn)這一目的。

示例4-6. hello.py:消息提示

from flask import Flask, render_template, session, redirect, url_for, flash

@app.route("/", methods=["GET", "POST"]) 
def index():
    form = NameForm()
    if form.validate_on_submit():
        old_name = session.get("name")
        if old_name is not None and old_name != form.name.data:
            flash("Looks like you have changed your name!") 
        session["name"] = form.name.data
        form.name.data = ""
        return redirect(url_for("index"))
    return render_template("index.html",
        form = form, name = session.get("name"))

在這個(gè)示例中,每次提交一個(gè)名字都會(huì)和用戶會(huì)話中保存的名字進(jìn)行比較。如果兩個(gè)名字不一樣,flash()函數(shù)會(huì)被調(diào)用,消息會(huì)在下一次發(fā)回客戶端的響應(yīng)中顯示。

調(diào)用flash()還不能獲取并顯示消息;應(yīng)用程序使用的模板需要渲染這些消息。渲染消息最好的地方是在基礎(chǔ)模板中,因?yàn)檫@可以使得所有頁面都可以使用這些消息。Flask提供get_flashed_messages()函數(shù)給模板去接收消息并渲染它們,就像4-7展示的那樣。

示例4-7. templates/base.html:消息渲染

{% block content %}


{% for message in get_flashed_messages() %}
{{ message }}
{% endfor %} {% block page_content %}{% endblock %}
{% endblock %}

在這個(gè)示例中,使用Bootstrap的警告CSS樣式做警告消息渲染(展示在圖像4-4中就是之一)。

圖像4-4. 消息提示

這里需要使用循環(huán)因?yàn)榭赡軙?huì)有多個(gè)消息排隊(duì)顯示,在前面的請(qǐng)求周期中每次都會(huì)調(diào)用flash()。

get_flashed_messages()中檢索到的消息在下次調(diào)用這個(gè)函數(shù)時(shí)是不會(huì)返回的。所以消息只顯示一次然后丟棄。

  

建議:如果你有克隆在GitHub上的應(yīng)用程序,你現(xiàn)在可以運(yùn)行git checkout 4c來切換到這個(gè)版本的應(yīng)用程序。

能夠接收用戶通過web表單發(fā)送的數(shù)據(jù)是大多數(shù)應(yīng)用程序的基本功能,同樣將數(shù)據(jù)到永久存儲(chǔ)到媒介上也是必須的。下一章的主題是Flask和數(shù)據(jù)庫的使用。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/37475.html

相關(guān)文章

  • Flask Web Development —— Web表單(上)

    摘要:每個(gè)表單域都可以連接到一個(gè)或多個(gè)是一個(gè)用于檢查用戶提交的輸入是否合法的函數(shù)。表單域構(gòu)造函數(shù)的第一個(gè)參數(shù)是一個(gè),在渲染表單到時(shí)會(huì)使用。驗(yàn)證確保提交的表單域不為空。表單域驗(yàn)證都是直接從包中導(dǎo)入。表格展示了一組支持的標(biāo)準(zhǔn)表單域。 第二章中介紹的request對(duì)象公開了所有客戶端發(fā)送的請(qǐng)求信息。特別是request.form可以訪問POST請(qǐng)求提交的表單數(shù)據(jù)。 盡管Flask的request...

    CODING 評(píng)論0 收藏0
  • Flask Web Development —— 模板(上)

    摘要:用真實(shí)的值替換變量并返回最終響應(yīng)字符串,這個(gè)過程稱為渲染。示例展示模板實(shí)現(xiàn)該響應(yīng)。控制結(jié)構(gòu)提供一些控制結(jié)構(gòu)用于改變模板流。這個(gè)示例展示如何使用循環(huán)做到這些同樣支持宏,這和代碼中的函數(shù)很像。 寫代碼最關(guān)鍵的是要易于維護(hù)且結(jié)構(gòu)清晰整潔。目前為止,你看到的例子都過于簡(jiǎn)單從而沒有做這方面的要求。Flask視圖函數(shù)希望將兩個(gè)應(yīng)該完全獨(dú)立的任務(wù)一并處理,兩個(gè)任務(wù)有兩種代碼,一并處理勢(shì)必會(huì)引發(fā)問題。...

    fizz 評(píng)論0 收藏0
  • Flask Web Development —— 模板(

    摘要:如果路由重組,模板中的鏈接將被打斷而變得無法訪問。靜態(tài)文件應(yīng)用程序不僅僅是由代碼和模板組成。當(dāng)服務(wù)器收到來自之前示例的,它會(huì)產(chǎn)生一個(gè)響應(yīng)包含的文件內(nèi)容。一個(gè)優(yōu)雅的解決方案是允許服務(wù)器只發(fā)送時(shí)間給瀏覽器,由瀏覽器轉(zhuǎn)為當(dāng)?shù)貢r(shí)間并渲染。 4、鏈接 任何應(yīng)用程序都有多個(gè)路由,必然需要包含鏈接來連接不同的頁面,例如導(dǎo)航欄。 在模板中,對(duì)于簡(jiǎn)單的路由直接寫URLs做鏈接是非常瑣碎麻煩的,而給帶...

    raoyi 評(píng)論0 收藏0
  • Flask Web Development —— Email

    摘要:函數(shù)攜帶目的地址主題郵件體模板和一組關(guān)鍵字參數(shù)。許多擴(kuò)展操作是在假設(shè)有活動(dòng)的應(yīng)用程序和請(qǐng)求上下文的情況下進(jìn)行的。但是當(dāng)函數(shù)在一個(gè)不同的線程上執(zhí)行,應(yīng)用程序上下文需要人為地創(chuàng)建使用。例如,執(zhí)行函數(shù)可以將郵件發(fā)送到的任務(wù)隊(duì)列中。 許多類型的應(yīng)用程序都會(huì)在某些事件發(fā)生的時(shí)候通知用戶,常用的溝通方法就是電子郵件。盡管在Flask應(yīng)用程序中,可以使用Python標(biāo)準(zhǔn)庫中的smtplib包來發(fā)送電...

    SKYZACK 評(píng)論0 收藏0
  • Flask Web Development —— 基本應(yīng)用程序結(jié)構(gòu)(

    摘要:有兩類應(yīng)用級(jí)和請(qǐng)求級(jí)。一個(gè)響應(yīng)中非常重要的部分是狀態(tài)碼,默認(rèn)設(shè)置來指示請(qǐng)求已經(jīng)成功處理。重定向通常由響應(yīng)狀態(tài)碼注明并且重定向的由頭部的給出。因?yàn)檫@些變化,應(yīng)用程序獲得一組基本的命令行選項(xiàng)。運(yùn)行顯示可用信息在應(yīng)用程序上下文的內(nèi)部運(yùn)行一個(gè)。 5、請(qǐng)求-響應(yīng)循環(huán) 現(xiàn)在你已經(jīng)玩過一個(gè)基本的Flask應(yīng)用程序,你也許想要知道更多關(guān)于Flask如何施展魔力。下面章節(jié)描述了一些框架設(shè)計(jì)方面的特點(diǎn)。...

    caohaoyu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

yeooo

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<