国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Flask Web Development —— Web表單(下)

yeooo / 1627人閱讀

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

4、視圖函數中的表單操作

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

示例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參數被添加到app.route裝飾器中,目的是讓Flask注冊視圖函數為GETPOST請求處理程序到URL映射中。若methods參數未給出,視圖函數將只注冊為GET請求。

添加POST到方法列表中是有必要的,因為表單提交使用POST請求操作會更方便。使用GET請求提交表單也行,只是GET請求沒有body部分,數據是追加到URL上作為返回字符串且可以在瀏覽器的地址欄中看到。由于這個和其他一些原因,表單提交通常使用POST請求。

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

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

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

  

建議:如果你有克隆在GitHub上的應用程序,你現在可以運行git checkout 4a來切換到這個版本的應用程序。

圖像4-1展示用戶初次進入網站在瀏覽器窗口看到的表單是怎樣的。當用戶提交名字,應用程序收到一個個性化的打招呼響應。下面的表單仍然出現,所以只要愿意用戶可以提交一個新的名字。圖像4-2展示用戶輸入名字后的狀態。

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

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

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

圖像4-3. 驗證錯誤后的web表單

5、重定向和用戶sessions

上個版本的hello.py有個問題。如果你輸入你的名字并提交它,然后單擊瀏覽器中刷新按鈕,你將得到一個警告要求再次確認之前提交的表單。因為請求刷新頁面的時候瀏覽器重復了上一次發送的請求。當上一次發送的是一個帶有表單數據的POST請求,刷新頁面會導致重復的表單提交,事實上這些并不是我們想看到的。

許多用戶不能理解來自瀏覽器的這些警告。出于這個原因,對web應用程序來說,一種不錯的方法是永遠不將POST請求作為瀏覽器最后發送的請求。

這個方法可以使用redirect響應POST請求來代替常規的響應來實現。重定向是一個特殊類型的響應,使用URL來代替HTML代碼字符串。當瀏覽器收到這個響應,它就會給重定向URL發出一個GET請求,然后顯示頁面。頁面也許需要幾毫秒的時間來加載,因為需要發送第二個請求給服務器,除此之外用戶不會看到任何不同。現在最后一次請求為GET,所以刷新會像預期的那樣。這個方法被稱為Post/Redirect/Get模式

但是這個方法帶來了第二個問題。當應用程序處理POST請求,需要訪問用戶輸入并保存在form.name.data中的名字,但是一旦該請求結束表單數據就會丟失。因為POST請求是通過重定向來處理,應用程序需要存儲名字,以便重定向后的請求可以得到它并使用它來創建真實的響應。

應用程序可以“記住”一些變量從一個請求到另一個請求通過將變量保存到用戶會話中,對于每一個連接過來的客戶端它都是一個私有存儲區域。作為一個與請求上下文關聯的變量之一,用戶會話已經在第二章中介紹過了。它被稱為會話并可以像Python標準字典那樣訪問。

  

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

示例4-5展示實現重定向和用戶會話的index()視圖函數。

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

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"))

在上一個版本中,局部變量name用于保存用戶在表單中輸入的姓名。這個變量位于用戶會話中的session["name"]中,因此可以保存很長時間。

現在請求來自表單的合法數據都會以redirect()調用來結束,生成HTTP重定向響應。redirect()函數把URL作為重定向的參數。這個例子中使用的重定向URL是一個根URL,所以響應可以寫成redirect("/")這樣簡潔,但是我們通常使用Flask的URL生成器函數url_for()來代替。我們鼓勵使用url_for()函數來生成URLs,因為該函數使用URL映射來生成URLs,所以生成的URLs保證與定義的路由兼容,并且使用這個函數任何路由名發生變化都會自動變得有效,路由功能不受影響。

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

最后一個改動是在render_template()函數中,使用session.get("name")從會話中獲取name參數。和使用普通字典一樣,使用get()去請求字典key來避免發生找不到key異常,因為對于沒有的keyget()返回默認值None。

  

建議:如果你有克隆在GitHub上的應用程序,你現在可以運行git checkout 4b來切換到這個版本的應用程序。

這個版本的應用程序,你可以在你的瀏覽器中刷新頁面看到你預期的行為。

6、消息提示

有時候在請求完成后給用戶一個提示消息是非常有用的??梢允且粋€確認消息、警告消息或錯誤消息。典型的示例就是當你在網站提交登錄表單出現錯誤的時候服務器響應渲染登錄表單并伴隨一條消息,告知你的用戶名或密碼無效。

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

示例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"))

在這個示例中,每次提交一個名字都會和用戶會話中保存的名字進行比較。如果兩個名字不一樣,flash()函數會被調用,消息會在下一次發回客戶端的響應中顯示。

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

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

{% block content %}


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

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

圖像4-4. 消息提示

這里需要使用循環因為可能會有多個消息排隊顯示,在前面的請求周期中每次都會調用flash()。

get_flashed_messages()中檢索到的消息在下次調用這個函數時是不會返回的。所以消息只顯示一次然后丟棄。

  

建議:如果你有克隆在GitHub上的應用程序,你現在可以運行git checkout 4c來切換到這個版本的應用程序。

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/37475.html

相關文章

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

    摘要:每個表單域都可以連接到一個或多個是一個用于檢查用戶提交的輸入是否合法的函數。表單域構造函數的第一個參數是一個,在渲染表單到時會使用。驗證確保提交的表單域不為空。表單域驗證都是直接從包中導入。表格展示了一組支持的標準表單域。 第二章中介紹的request對象公開了所有客戶端發送的請求信息。特別是request.form可以訪問POST請求提交的表單數據。 盡管Flask的request...

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

    摘要:用真實的值替換變量并返回最終響應字符串,這個過程稱為渲染。示例展示模板實現該響應??刂平Y構提供一些控制結構用于改變模板流。這個示例展示如何使用循環做到這些同樣支持宏,這和代碼中的函數很像。 寫代碼最關鍵的是要易于維護且結構清晰整潔。目前為止,你看到的例子都過于簡單從而沒有做這方面的要求。Flask視圖函數希望將兩個應該完全獨立的任務一并處理,兩個任務有兩種代碼,一并處理勢必會引發問題。...

    fizz 評論0 收藏0
  • Flask Web Development —— 模板(

    摘要:如果路由重組,模板中的鏈接將被打斷而變得無法訪問。靜態文件應用程序不僅僅是由代碼和模板組成。當服務器收到來自之前示例的,它會產生一個響應包含的文件內容。一個優雅的解決方案是允許服務器只發送時間給瀏覽器,由瀏覽器轉為當地時間并渲染。 4、鏈接 任何應用程序都有多個路由,必然需要包含鏈接來連接不同的頁面,例如導航欄。 在模板中,對于簡單的路由直接寫URLs做鏈接是非?,嵥槁闊┑?,而給帶...

    raoyi 評論0 收藏0
  • Flask Web Development —— Email

    摘要:函數攜帶目的地址主題郵件體模板和一組關鍵字參數。許多擴展操作是在假設有活動的應用程序和請求上下文的情況下進行的。但是當函數在一個不同的線程上執行,應用程序上下文需要人為地創建使用。例如,執行函數可以將郵件發送到的任務隊列中。 許多類型的應用程序都會在某些事件發生的時候通知用戶,常用的溝通方法就是電子郵件。盡管在Flask應用程序中,可以使用Python標準庫中的smtplib包來發送電...

    SKYZACK 評論0 收藏0
  • Flask Web Development —— 基本應用程序結構(

    摘要:有兩類應用級和請求級。一個響應中非常重要的部分是狀態碼,默認設置來指示請求已經成功處理。重定向通常由響應狀態碼注明并且重定向的由頭部的給出。因為這些變化,應用程序獲得一組基本的命令行選項。運行顯示可用信息在應用程序上下文的內部運行一個。 5、請求-響應循環 現在你已經玩過一個基本的Flask應用程序,你也許想要知道更多關于Flask如何施展魔力。下面章節描述了一些框架設計方面的特點。...

    caohaoyu 評論0 收藏0

發表評論

0條評論

yeooo

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<