摘要:通過的核心特性,函數可實現這種效果僅調用函數并不能把消息顯示出來,程序使用的模板要渲染這些消息。注意在模板中使用循環是因為在之前的請求循環中每次調用函數時都會生成一個消息,所以可能有多個消息在排隊等待顯示。
五、表單 1、Flask-WTF 擴展
Flask-WTF 及其依賴可使用 pip 安裝:
(venv) $ pip install flask-wtf2、跨站請求偽造保護
【設置密鑰】
app = Flask(__name__) app.config["SECRET_KEY"] = "hard to guess string"
app.config 字典可用來存儲框架、 擴展和程序本身的配置變量。
3、表單類創建表單的三個步驟:
定義Form的子類
在類里添加字段
在字段里添加驗證函數
# Form 基類由 Flask-WTF 擴展定義 from flask_wtf import FlaskForm # 字段直接從 WTForms 包中導入 from wtforms import StringField,SubmitField # 驗證函數直接從 WTForms 包中導入 from wtforms.validators import DataRequired,Length class NameForm(Form): name = StringField("Input your name:",validators=[DataRequired()]) submit = SubmitField("Submit")
與其他擴展的使用方法不同之處在于:
①不是實例化,而是繼承
②還需要從wtforms當中導入字段和驗證函數
【注意】
Form 基類由 Flask-WTF 擴展定義,所以從 flask_wtf 中導入。字段和驗證函數
卻可以直接從 WTForms 包中導入。
表單字段是可調用的,在模板中調用后會渲染成 HTML。假設視圖函數把一個
NameForm 實例通過參數 form傳入模板,在模板中可以生成一個簡單的表單,
如下所示:
可以使用Bootstrap 中預先定義好的表單樣式渲染整個 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 %}Hello, {% if name %}{{ name }}{% else %}Stranger{% endif %}!
模板的內容區現在有兩部分。第一部分是頁面頭部,顯示歡迎消息。這里用到了一個
模板條件語句。 Jinja2中的條件語句格式為 {% if condition %}...{% else %}...{% endif %}。
如果條件的計算結果為 True,那么渲染 if 和 else 指令之間的值。如果條件的計算結果為False,
則渲染else 和 endif 指令之間的值。在這個例子中,如果沒有定義模板變量 name,則會渲染字
符串“Hello,Stranger!”。內容區的第二部分使用 wtf.quick_form() 函數渲染NameForm 對象。
視圖函數 index() 不僅要渲染表單,還要接收表單中的數據。
@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、重定向和用戶會話
上面的視圖函數存在一個可用性問題。用戶輸入名字后提交表單,然后點擊瀏覽器 的刷新按鈕,會看到一個莫名其妙的警告,要求在再次提交表單之前進行確認: 之所以出現這種情況,是因為刷新頁面時瀏覽器會重新發送之前已經發送過的最后 一個請求。如果這個請求是一個包含表單數據的 POST 請求,刷新頁面后會再次提 交表單。大多數情況下,這并不是理想的處理方式。很多用戶都不理解瀏覽器發出 的這個警告。基于這個原因, 最好別讓 Web 程序把 POST 請求作為瀏覽器發送的 最后一個請求。 這種需求的實現方式是, 使用**重定向**作為 POST 請求的響應,而不是使用常規 響應。這個技巧稱為 Post/ 重定向 /Get 模式。 程序可以把數據存儲在** 用戶會話 **中,在請求之間“記住”數據。用戶會話是一 種私有存儲,存在于每個連接服務器的客戶端中。 我們在請求與響應中介紹過用戶 會話,它是請求上下文中的變量,名為 ** session **,像標準的 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 # 這里也不需要設置form.name.data = "", # 因為已經重定向到別的url去了,下次再到這個界面會自動初始化為"" return redirect(url_for("hello")) return render_template("form.html",form = form, name = session.get("name"))7、Flash消息
請求完成后,有時需要讓用戶知道狀態發生了變化。這里可以使用確認消息、警告或者 錯誤提醒。一個典型例子是,用戶提交了有一項錯誤的登錄表單后,服務器發回的響應 重新渲染了登錄表單,并在表單上面顯示一個消息,提示用戶用戶名或密碼錯誤。 通過Flask 的核心特性,** flash()函數 **可實現這種效果
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"))
僅調用 flash() 函數并不能把消息顯示出來,程序使用的模板要渲染這些消息。 最好在基模板中渲染 Flash消息,因為這樣所有頁面都能使用這些消息。 Flask 把 get_flashed_messages() 函數開放給模板,用來獲取并渲染消息。
【base.html】
{% block content %}{% for message in get_flashed_messages() %}{% endblock %}{{ message }}{% endfor %} {% block page_content %}{% endblock %}
在這個示例中,使用 Bootstrap 提供的警報 CSS 樣式渲染警告消息。
【注意】
在模板中使用循環是因為在之前的請求循環中每次調用 flash() 函數時都會生成一個消息,
所以可能有多個消息在排隊等待顯示。 get_flashed_messages() 函數獲取的消息在下次調
用時不會再次返回,因此 Flash消息只顯示一次,然后就消失了。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/40795.html
摘要:每個表單域都可以連接到一個或多個是一個用于檢查用戶提交的輸入是否合法的函數。表單域構造函數的第一個參數是一個,在渲染表單到時會使用。驗證確保提交的表單域不為空。表單域驗證都是直接從包中導入。表格展示了一組支持的標準表單域。 第二章中介紹的request對象公開了所有客戶端發送的請求信息。特別是request.form可以訪問POST請求提交的表單數據。 盡管Flask的request...
摘要:特別是可以訪問請求提交的表單數據。表單的代碼生成和驗證提交的表單數據就是兩個很好的例子。優勢擴展使得處理表單能獲得更愉快的體驗。設計了表單庫來使可以更加簡便地管理操作表單數據。 1. 為什么使用Flask-WTF? request對象公開了所有客戶端發送的請求信息。特別是request.form可以訪問POST請求提交的表單數據。 盡管Flask的request對象提供的支持足以處理w...
摘要:刪除數組元素的開始索引需要刪除元素的個數,插入數組的元素語法因為參數變化多樣,我們主要從三個方面來展示的用法。 今天是我們介紹數組系列文章的第五篇,也是我們數組系列的最后一篇文章,只是數據系列的結束,所以大家不用擔心,我們會持續的更新干貨文章。 生命不息,更新不止! 今天我們就不那么多廢話了,直接干貨開始。 我們在《Javascript數組系列一之棧與隊列》中描述我們是如何利用 pus...
閱讀 2753·2021-10-11 10:57
閱讀 1586·2021-09-26 09:55
閱讀 1322·2021-09-06 15:11
閱讀 3465·2021-08-26 14:16
閱讀 680·2019-08-30 15:54
閱讀 548·2019-08-30 12:43
閱讀 3307·2019-08-29 16:18
閱讀 2586·2019-08-23 16:14