利用pycharm學(xué)習(xí)flask(八)


title: 利用pycharm學(xué)習(xí)flask(八)
date: 2016-10-04 15:36:58
tags: python
category: python


本文內(nèi)容:

1.跨站請(qǐng)求偽造保護(hù)
2.表單類
3.把表單渲染成HTML
4.在視圖函數(shù)中處理表單

跨站請(qǐng)求偽造保護(hù)

Flask-WTF是一個(gè)擴(kuò)展,可以幫助我們處理web表單隐绵,我們跟前面一樣在pycharm中安裝它潦刃。

默認(rèn)情況下摹迷,F(xiàn)lask-WTF能保護(hù)所有表單免受跨站請(qǐng)求偽造的攻擊。Flask-WTF需要程序設(shè)置一個(gè)密匙曲梗。Flask-WTF使用這個(gè)密匙生成加密令牌夸溶,再用令牌驗(yàn)證請(qǐng)求中表單數(shù)據(jù)的真?zhèn)巍?/p>

修改hello.py:

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

其中app.config字典用來(lái)存儲(chǔ)框架、擴(kuò)展和程序本身的配置變量宛乃。使用標(biāo)準(zhǔn)的字典句法就能把配置值添加到app.config對(duì)象中。

表單類

使用Flask-WTF時(shí)蒸辆,每個(gè)Web表單都由一個(gè)繼承自Form的類表示征炼。這個(gè)類定義表單中的一組字段,每個(gè)字段都用對(duì)象表示躬贡。字段對(duì)象可附屬一個(gè)或多個(gè)驗(yàn)證函數(shù)谆奥。驗(yàn)證函數(shù)用來(lái)驗(yàn)證用戶提交的輸入值是否符合要求。

修改hello.py拂玻,定義表單類:

from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import Required

class NameForm(FlaskForm):
    name = StringField('What is your name?',validators=[Required()])
    submit = SubmitField('Submit')

這個(gè)表單中的字段都定義為類變量酸些,類變量的值是相應(yīng)字段類型的對(duì)象。NameForm表單中有一個(gè)名為name的文本字段和一個(gè)名為submit的提交按鈕檐蚜。StringField類表示屬性為type=“text”的input元素魄懂。SubmitField類表示屬性為type="submit"的input元素。

WTForms支持的HTML標(biāo)準(zhǔn)字段

字段類型 說(shuō) 明
StringField 文本字段
TextAreaField 多行文本字段
PasswordField 密碼文本字段
HiddenField 隱藏文本字段
DateField 文本字段闯第,值為 datetime.date 格式
DateTimeField 文本字段市栗,值datetime.datetime格式
IntegerField 文本字段,值為整數(shù)
DecimalField 文本字段咳短,值為 decimal.Decimal
FloatField 文本字段肃廓,值為浮點(diǎn)數(shù)
BooleanField 復(fù)選框,值為 True 和 False
RadioField 一組單選框
SelectField 下拉列表
SelectMultipleField 下拉列表诲泌,可選擇多個(gè)值
FileField 文件上傳字段
SubmitField 表單提交按鈕
FormField 把表單作為字段嵌入另一個(gè)表單
FieldList 一組指定類型的字段

WTForms驗(yàn)證函數(shù)

驗(yàn)證函數(shù) 說(shuō) 明
Email 驗(yàn)證電子郵件地址
EqualTo 比較兩個(gè)字段的值;常用于要求輸入兩次密碼進(jìn)行確認(rèn)的情況
IPAddress 驗(yàn)證 IPv4 網(wǎng)絡(luò)地址
Length 驗(yàn)證輸入字符串的長(zhǎng)度
NumberRange 驗(yàn)證輸入的值在數(shù)字范圍內(nèi)
Optional 無(wú)輸入值時(shí)跳過(guò)其他驗(yàn)證函數(shù)
Required 確保字段中有數(shù)據(jù)
Regexp 使用正則表達(dá)式驗(yàn)證輸入值
URL 驗(yàn)證 URL
AnyOf 確保輸入值在可選值列表中
NoneOf 確保輸入值不在可選值列表中

把表單渲染成HTML

Flask-Bootstrap 提供了一個(gè)非常高端的輔助函數(shù),可以使用Bootstrap中預(yù)先定義好的表單樣式渲染整個(gè) Flask-WTF表單铣鹏,而這些操作只需一次調(diào)用即可完成敷扫。使用Flask-Bootstrap,上述表單可使用下面的方式渲染:

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

import指令的使用方法和普通Python代碼一樣,允許導(dǎo)入模板中的元素并用在多個(gè)模板中葵第。導(dǎo)入的bootstrap/wtf.html文件中定義了一個(gè)使用Bootstrap渲染 Falsk-WTF表單對(duì)象的輔助函數(shù)绘迁。wtf.quick_form() 函數(shù)的參數(shù)為Flask-WTF表單對(duì)象,使用Bootstrap的默認(rèn)樣式渲染傳入的表單卒密。

修改templates/index.html缀台,使用Flask-WTF和Flask-Bootstrap渲染表單:

{% extends "base.html" %}
{% import "bootstrap/wtf.html" as wtf %}

{% block title %}Flasky{% endblock %}

{% block page_content %}
<div class="page-header">
    <h1>Hello, {% if name %}{{ name }}{% else %}Stranger{% endif %}!</h1>
</div>
{{ wtf.quick_form(form) }}
{% endblock %}

模板的內(nèi)容區(qū)現(xiàn)在有兩部分。第一部分是頁(yè)面頭部哮奇,顯示歡迎消息膛腐。Jinja2中的條件語(yǔ)句格式為{% if condition %}...{% else %}...{% endif %}。如果條件的計(jì)算結(jié)果為T(mén)rue鼎俘,渲染if和else指令之間的值哲身。如果計(jì)算結(jié)果為False,則渲染else和endif指令之間的值贸伐。在上述例子中勘天,如果沒(méi)有定義模板變量name,則渲染字符串"Hello捉邢,Stranger!"脯丝。內(nèi)容區(qū)的第二部分使用wtf.quick_form()函數(shù)渲染NameForm對(duì)象。

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

視圖函數(shù)index不僅要渲染表單伏伐,還要接收表單中的數(shù)據(jù)宠进,修改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',from=from,name=name)

其中app.route修飾器中添加的methods參數(shù)告訴flask在url映射中把這個(gè)視圖函數(shù)注冊(cè)為GET和POST請(qǐng)求的處理程序,如果沒(méi)有這個(gè)參數(shù)秘案,默認(rèn)為GET請(qǐng)求砰苍。

局部變量name存儲(chǔ)表單中的名字,如果沒(méi)有輸入就為NONE阱高,創(chuàng)建了一個(gè)NameForm類實(shí)例用于表示表單赚导。提交表單后,如果數(shù)據(jù)能被所有驗(yàn)證函數(shù)接受赤惊,那么validate_on_submit方法返回True吼旧,否則返回False。這個(gè)值決定是重新渲染表單還是處理表單提交的數(shù)據(jù)未舟。

第一次訪問(wèn)時(shí)圈暗,服務(wù)器收到一個(gè)沒(méi)有表單數(shù)據(jù)的GET請(qǐng)求,所以validate_on_submit返回False裕膀。if語(yǔ)句將被跳過(guò)员串,通過(guò)渲染模板處理請(qǐng)求,并傳入表單對(duì)象和值為None的name變量作為參數(shù)昼扛。用戶在瀏覽器中顯示了一個(gè)表單寸齐。

提交表單后,服務(wù)器收到GET請(qǐng)求,validate_on_submit調(diào)用name字段上的Required驗(yàn)證函數(shù)渺鹦。如果名字不為空扰法,就通過(guò)。validate_on_submit返回True毅厚。用戶輸入的名字可以通過(guò)字段的data屬性獲取塞颁。

在if語(yǔ)句中,把名字復(fù)制給name吸耿,然后再把data屬性設(shè)為空字符串祠锣,從而清空表單字段。最后一行調(diào)用render_template函數(shù)渲染模板珍语,但這次參數(shù)name的值為表單中輸入的名字锤岸,因此會(huì)顯示一個(gè)針對(duì)該用戶的歡迎消息。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末板乙,一起剝皮案震驚了整個(gè)濱河市是偷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌募逞,老刑警劉巖蛋铆,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異放接,居然都是意外死亡刺啦,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)纠脾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)玛瘸,“玉大人,你說(shuō)我怎么就攤上這事苟蹈『ǎ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵慧脱,是天一觀的道長(zhǎng)渺绒。 經(jīng)常有香客問(wèn)我,道長(zhǎng)菱鸥,這世上最難降的妖魔是什么宗兼? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮氮采,結(jié)果婚禮上殷绍,老公的妹妹穿的比我還像新娘。我一直安慰自己鹊漠,他們只是感情好篡帕,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布殖侵。 她就那樣靜靜地躺著,像睡著了一般镰烧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上楞陷,一...
    開(kāi)封第一講書(shū)人閱讀 51,208評(píng)論 1 299
  • 那天怔鳖,我揣著相機(jī)與錄音,去河邊找鬼固蛾。 笑死结执,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的艾凯。 我是一名探鬼主播献幔,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼趾诗!你這毒婦竟也來(lái)了蜡感?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤恃泪,失蹤者是張志新(化名)和其女友劉穎郑兴,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體贝乎,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡情连,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了览效。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片却舀。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖锤灿,靈堂內(nèi)的尸體忽然破棺而出挽拔,到底是詐尸還是另有隱情,我是刑警寧澤衡招,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布篱昔,位于F島的核電站,受9級(jí)特大地震影響始腾,放射性物質(zhì)發(fā)生泄漏州刽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一浪箭、第九天 我趴在偏房一處隱蔽的房頂上張望穗椅。 院中可真熱鬧,春花似錦奶栖、人聲如沸匹表。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)袍镀。三九已至默蚌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間苇羡,已是汗流浹背绸吸。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留设江,地道東北人锦茁。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像叉存,于是被迫代替她去往敵國(guó)和親码俩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容