亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Flask五之表單

justCoding / 1166人閱讀

摘要:通過的核心特性,函數(shù)可實(shí)現(xiàn)這種效果僅調(diào)用函數(shù)并不能把消息顯示出來,程序使用的模板要渲染這些消息。注意在模板中使用循環(huán)是因?yàn)樵谥暗恼埱笱h(huán)中每次調(diào)用函數(shù)時(shí)都會(huì)生成一個(gè)消息,所以可能有多個(gè)消息在排隊(duì)等待顯示。

五、表單 1、Flask-WTF 擴(kuò)展

Flask-WTF 及其依賴可使用 pip 安裝:

(venv) $ pip install flask-wtf
2、跨站請求偽造保護(hù)

【設(shè)置密鑰】

app = Flask(__name__)
app.config["SECRET_KEY"] = "hard to guess string"

app.config 字典可用來存儲(chǔ)框架、 擴(kuò)展和程序本身的配置變量。

3、表單類

創(chuàng)建表單的三個(gè)步驟:

定義Form的子類

在類里添加字段

在字段里添加驗(yàn)證函數(shù)

# Form 基類由 Flask-WTF 擴(kuò)展定義
from flask_wtf import FlaskForm
# 字段直接從 WTForms 包中導(dǎo)入
from wtforms import StringField,SubmitField
# 驗(yàn)證函數(shù)直接從 WTForms 包中導(dǎo)入
from wtforms.validators import DataRequired,Length

class NameForm(Form):
    name = StringField("Input your name:",validators=[DataRequired()])
    submit = SubmitField("Submit")

與其他擴(kuò)展的使用方法不同之處在于:
①不是實(shí)例化,而是繼承
②還需要從wtforms當(dāng)中導(dǎo)入字段和驗(yàn)證函數(shù)

【注意】
Form 基類由 Flask-WTF 擴(kuò)展定義,所以從 flask_wtf 中導(dǎo)入。字段和驗(yàn)證函數(shù)
卻可以直接從 WTForms 包中導(dǎo)入。

4、把表單渲染成HTML

表單字段是可調(diào)用的,在模板中調(diào)用后會(huì)渲染成 HTML。假設(shè)視圖函數(shù)把一個(gè)
NameForm 實(shí)例通過參數(shù) form傳入模板,在模板中可以生成一個(gè)簡單的表單,
如下所示:

{{ form.hidden_tag() }} {{ form.name.label }} {{ form.name() }} {{ form.submit() }}

可以使用Bootstrap 中預(yù)先定義好的表單樣式渲染整個(gè) Flask-WTF 表單,
使用 Flask-Bootstrap,上述表單可使用下面的方式渲染:

{% import "bootstrap/wtf.html" as wtf %}
{{ wtf.quick_form(form) }}

具體渲染方式如下:
【form.html】

{% extends "base.html" %}
{% import "bootstrap/wtf.html" as wtf %}
{% block title %}Flasky{% endblock %}
{% block page_content %}

{{ wtf.quick_form(form) }}
{% endblock %}

模板的內(nèi)容區(qū)現(xiàn)在有兩部分。第一部分是頁面頭部,顯示歡迎消息。這里用到了一個(gè)
模板條件語句。 Jinja2中的條件語句格式為 {% if condition %}...{% else %}...{% endif %}。
如果條件的計(jì)算結(jié)果為 True,那么渲染 if 和 else 指令之間的值。如果條件的計(jì)算結(jié)果為False,
則渲染else 和 endif 指令之間的值。在這個(gè)例子中,如果沒有定義模板變量 name,則會(huì)渲染字
符串“Hello,Stranger!”。內(nèi)容區(qū)的第二部分使用 wtf.quick_form() 函數(shù)渲染NameForm 對象。

5、在視圖函數(shù)中處理表單

視圖函數(shù) index() 不僅要渲染表單,還要接收表單中的數(shù)據(jù)。

@app.route("/form/",methods = ["GET","POST"])
def form():
    name = None
    form = NameForm()
    if form.validate_on_submit():
        name = form.name.data
        form.name.data = ""
    return render_template("form.html",form = form, name = name)
6、重定向和用戶會(huì)話
上面的視圖函數(shù)存在一個(gè)可用性問題。用戶輸入名字后提交表單,然后點(diǎn)擊瀏覽器
的刷新按鈕,會(huì)看到一個(gè)莫名其妙的警告,要求在再次提交表單之前進(jìn)行確認(rèn):

之所以出現(xiàn)這種情況,是因?yàn)樗⑿马撁鏁r(shí)瀏覽器會(huì)重新發(fā)送之前已經(jīng)發(fā)送過的最后
一個(gè)請求。如果這個(gè)請求是一個(gè)包含表單數(shù)據(jù)的 POST 請求,刷新頁面后會(huì)再次提
交表單。大多數(shù)情況下,這并不是理想的處理方式。很多用戶都不理解瀏覽器發(fā)出
的這個(gè)警告?;谶@個(gè)原因, 最好別讓 Web 程序把 POST 請求作為瀏覽器發(fā)送的
最后一個(gè)請求。
這種需求的實(shí)現(xiàn)方式是, 使用**重定向**作為 POST 請求的響應(yīng),而不是使用常規(guī)
響應(yīng)。這個(gè)技巧稱為 Post/ 重定向 /Get 模式。

程序可以把數(shù)據(jù)存儲(chǔ)在** 用戶會(huì)話 **中,在請求之間“記住”數(shù)據(jù)。用戶會(huì)話是一
種私有存儲(chǔ),存在于每個(gè)連接服務(wù)器的客戶端中。 我們在請求與響應(yīng)中介紹過用戶
會(huì)話,它是請求上下文中的變量,名為 ** session **,像標(biāo)準(zhǔn)的 Python 字典一
樣操作。
from flask import session
@app.route("/form2/",methods = ["GET","POST"])
def form2():
    form = NameForm()
    if form.validate_on_submit():
        session["name"] = form.name.data
        # 這里也不需要設(shè)置form.name.data = "",
        # 因?yàn)橐呀?jīng)重定向到別的url去了,下次再到這個(gè)界面會(huì)自動(dòng)初始化為""
        return redirect(url_for("hello"))
    return render_template("form.html",form = form, name = session.get("name"))
7、Flash消息
請求完成后,有時(shí)需要讓用戶知道狀態(tài)發(fā)生了變化。這里可以使用確認(rèn)消息、警告或者
錯(cuò)誤提醒。一個(gè)典型例子是,用戶提交了有一項(xiàng)錯(cuò)誤的登錄表單后,服務(wù)器發(fā)回的響應(yīng)
重新渲染了登錄表單,并在表單上面顯示一個(gè)消息,提示用戶用戶名或密碼錯(cuò)誤。
通過Flask 的核心特性,** flash()函數(shù) **可實(shí)現(xiàn)這種效果
from flask import flash
@app.route("/form3/",methods = ["GET","POST"])
def form3():
    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("you have changed your name")
        session["name"] = form.name.data
        return redirect(url_for("hello"))
    return render_template("form.html",form = form, name = session.get("name"))
僅調(diào)用 flash() 函數(shù)并不能把消息顯示出來,程序使用的模板要渲染這些消息。
最好在基模板中渲染 Flash消息,因?yàn)檫@樣所有頁面都能使用這些消息。 Flask 
把 get_flashed_messages() 函數(shù)開放給模板,用來獲取并渲染消息。

【base.html】

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

在這個(gè)示例中,使用 Bootstrap 提供的警報(bào) CSS 樣式渲染警告消息。
【注意】
在模板中使用循環(huán)是因?yàn)樵谥暗恼埱笱h(huán)中每次調(diào)用 flash() 函數(shù)時(shí)都會(huì)生成一個(gè)消息,
所以可能有多個(gè)消息在排隊(duì)等待顯示。 get_flashed_messages() 函數(shù)獲取的消息在下次調(diào)
用時(shí)不會(huì)再次返回,因此 Flash消息只顯示一次,然后就消失了。

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

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/40795.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對象公開了所有客戶端發(fā)送的請求信息。特別是request.form可以訪問POST請求提交的表單數(shù)據(jù)。 盡管Flask的request...

    CODING 評論0 收藏0
  • python大佬養(yǎng)成計(jì)劃----flask應(yīng)用(表單)

    摘要:特別是可以訪問請求提交的表單數(shù)據(jù)。表單的代碼生成和驗(yàn)證提交的表單數(shù)據(jù)就是兩個(gè)很好的例子。優(yōu)勢擴(kuò)展使得處理表單能獲得更愉快的體驗(yàn)。設(shè)計(jì)了表單庫來使可以更加簡便地管理操作表單數(shù)據(jù)。 1. 為什么使用Flask-WTF? request對象公開了所有客戶端發(fā)送的請求信息。特別是request.form可以訪問POST請求提交的表單數(shù)據(jù)。 盡管Flask的request對象提供的支持足以處理w...

    alighters 評論0 收藏0
  • Javascript數(shù)組系列五之增刪改和強(qiáng)大的 splice()

    摘要:刪除數(shù)組元素的開始索引需要?jiǎng)h除元素的個(gè)數(shù),插入數(shù)組的元素語法因?yàn)閰?shù)變化多樣,我們主要從三個(gè)方面來展示的用法。 今天是我們介紹數(shù)組系列文章的第五篇,也是我們數(shù)組系列的最后一篇文章,只是數(shù)據(jù)系列的結(jié)束,所以大家不用擔(dān)心,我們會(huì)持續(xù)的更新干貨文章。 生命不息,更新不止! 今天我們就不那么多廢話了,直接干貨開始。 我們在《Javascript數(shù)組系列一之棧與隊(duì)列》中描述我們是如何利用 pus...

    chavesgu 評論0 收藏0

發(fā)表評論

0條評論

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