python表单处理_python flask 表单处理Flask-WTF
涉及到的插件和包有Flask-WTF,WTForms。內(nèi)容有表單的創(chuàng)建使用流程,一些最佳實(shí)踐,還有在頁(yè)面顯示提示消息的簡(jiǎn)單方式,配合Flask內(nèi)置的 flash()。
Flask的requset對(duì)象包含了client端發(fā)送過(guò)來(lái)的所有請(qǐng)求,在request.form中就有POST方法提交過(guò)來(lái)的表單數(shù)據(jù)。直接使用這些數(shù)據(jù)可以搞定表單的操作,不過(guò)不方便,于是有了Flask-WTF這個(gè)插件,它將WTForms這個(gè)包嵌入Flask里,簡(jiǎn)化Flask下的使用。pip安裝會(huì)把插件的以來(lái)也安裝進(jìn)來(lái):
pip install flask-wtf
1
pipinstallflask-wtf
WTForms應(yīng)該也同時(shí)被安裝了。
跨站請(qǐng)求偽造(Cross-Site Request Forgery,CSRF) 保護(hù)
CSRF的原理不具體講了,很簡(jiǎn)單,感興趣直接網(wǎng)上搜即可。
Flask-WTF默認(rèn)提供對(duì)CSRF的保護(hù)。應(yīng)用里需要設(shè)置一個(gè)加密用的key,Flask-WTF利用這個(gè)key生成一個(gè)加密的記號(hào)來(lái)驗(yàn)證request帶過(guò)來(lái)的表單數(shù)據(jù)。看看實(shí)例:
app = Flask(__name__)
app.config['SECRET_KEY'] = 'www.ttlsa.com'
1
2
app=Flask(__name__)
app.config['SECRET_KEY']='www.ttlsa.com'
app.config 是應(yīng)用保存配置的一個(gè)字典。可以直接在字典里增加配置。SECRET_KEY這個(gè)配置變量被Flask和一些第三方插件使用,對(duì)不同的應(yīng)用配置不同的值增加點(diǎn)可靠性。
另外,這個(gè)值最好放到環(huán)境變量里,直接寫(xiě)到代碼里不太好。
表單類(lèi)
使用Flask-WTF的時(shí)候,每一個(gè)表單都是類(lèi)的形式,這個(gè)類(lèi)需要繼承自Form。這個(gè)類(lèi)里定義一些代表表單各類(lèi)域的對(duì)象,每個(gè)對(duì)象可以有多個(gè)驗(yàn)證器(validators)。驗(yàn)證器可以確保用戶(hù)的輸入是有效的。
原例子:
from flask.ext.wtf import Form
from wtforms import StringField, SubmitField
from wtforms.validators import Required
class NameForm(Form):
name = StringField('What is your name?', validators=[Required()])
submit = SubmitField('Submit')
1
2
3
4
5
6
7
fromflask.ext.wtfimportForm
fromwtformsimportStringField,SubmitField
fromwtforms.validatorsimportRequired
classNameForm(Form):
name=StringField('What is your name?',validators=[Required()])
submit=SubmitField('Submit')
表單中的域在類(lèi)中都定義成類(lèi)變量。上例中,NameForm類(lèi)里有文本域name和提交按鈕submit兩個(gè)。StringField代表有type="text"屬性的元素。SubmitField代表有type="submit"屬性的元素。構(gòu)造器的第一個(gè)參數(shù)是后續(xù)渲染表單時(shí)候用到的標(biāo)簽(label)。
下例是一個(gè)帶有文本域和提交按鈕的表單例子:
from flask_wtf import Form
from wtforms import StringField, BooleanField, PasswordField,SubmitField
from wtforms.validators import DataRequired
class LoginForm(Form):
openid = StringField('openid', validators=[DataRequired()])
remember_me = BooleanField('remember_me', default = False)
password = PasswordField('password',validators=[DataRequired()])
submit = SubmitField('submit')
1
2
3
4
5
6
7
8
9
fromflask_wtfimportForm
fromwtformsimportStringField,BooleanField,PasswordField,SubmitField
fromwtforms.validatorsimportDataRequired
classLoginForm(Form):
openid=StringField('openid',validators=[DataRequired()])
remember_me=BooleanField('remember_me',default=False)
password=PasswordField('password',validators=[DataRequired()])
submit=SubmitField('submit')
表單中的域在類(lèi)中都定義成類(lèi)變量。上例中,LoginForm類(lèi)里有字符串域openid,復(fù)選框remember_me, 密碼域password,提交按鈕submit。分別代表小面信息:
1
2
3
4
構(gòu)造器的第一個(gè)參數(shù)是后續(xù)渲染表單時(shí)候用到的標(biāo)簽(label)。
在StringField里的validators參數(shù)定義了一些驗(yàn)證器,這些驗(yàn)證器會(huì)在用戶(hù)提交數(shù)據(jù)前檢查數(shù)據(jù)是否有效。Required驗(yàn)證器確保提交的內(nèi)容不能為空。
WTForms提供的各種HTML域:
域類(lèi)型 含義
StringField 文本
TextAreaField 多行文本
PasswordField 密碼類(lèi)文本
HiddenField 隱藏文本
DateField 接收給定格式的 datetime.datevalue 的文本
DateTimeField 接收給定格式的 datetime.datetimevalue 的文本T
IntegerField 接收整數(shù)的文本
DecimalField 接收decimal.Decimal類(lèi)型值的文本
FloatField 接收浮點(diǎn)類(lèi)型值的文本
BooleanField 選是否的復(fù)選框
RadioField 包含多個(gè)互斥選項(xiàng)的復(fù)選框
SelectField 下拉菜單
SelectMultipleField 可多選的下拉菜單
FileField 文件上傳
SubmitField 提交
FormField 講一個(gè)表單作為域放入另一個(gè)表單里
FieldList 一組給定類(lèi)型的域
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
域類(lèi)型含義
StringField文本
TextAreaField多行文本
PasswordField密碼類(lèi)文本
HiddenField隱藏文本
DateField接收給定格式的datetime.datevalue的文本
DateTimeField接收給定格式的datetime.datetimevalue的文本T
IntegerField接收整數(shù)的文本
DecimalField接收decimal.Decimal類(lèi)型值的文本
FloatField接收浮點(diǎn)類(lèi)型值的文本
BooleanField選是否的復(fù)選框
RadioField包含多個(gè)互斥選項(xiàng)的復(fù)選框
SelectField下拉菜單
SelectMultipleField可多選的下拉菜單
FileField文件上傳
SubmitField提交
FormField講一個(gè)表單作為域放入另一個(gè)表單里
FieldList一組給定類(lèi)型的域
WTForms提供的各種驗(yàn)證器:
Validator Description
Email 郵箱格式
EqualTo 比較兩個(gè)域的值,例如在要求輸入兩次密碼的時(shí)候
IPAddress IPv4 地址
Length 按字符串的長(zhǎng)度驗(yàn)證
NumberRange 輸入數(shù)字需在某范圍內(nèi)
Optional 允許不填,不填的時(shí)候就忽略其他驗(yàn)證器
Required 必填
Regexp 通過(guò)一個(gè)正則表達(dá)式驗(yàn)證
URL URL格式
AnyOf 屬于一組可能值中的一個(gè)
NoneOf 不屬于一組可能值中的任何一個(gè)
1
2
3
4
5
6
7
8
9
10
11
12
ValidatorDescription
Email郵箱格式
EqualTo比較兩個(gè)域的值,例如在要求輸入兩次密碼的時(shí)候
IPAddressIPv4地址
Length按字符串的長(zhǎng)度驗(yàn)證
NumberRange輸入數(shù)字需在某范圍內(nèi)
Optional允許不填,不填的時(shí)候就忽略其他驗(yàn)證器
Required必填
Regexp通過(guò)一個(gè)正則表達(dá)式驗(yàn)證
URLURL格式
AnyOf屬于一組可能值中的一個(gè)
NoneOf不屬于一組可能值中的任何一個(gè)
渲染表單
表單的各類(lèi)域在模板中渲染時(shí)表現(xiàn)為可調(diào)用的對(duì)象。假設(shè)將一個(gè)NameForm的實(shí)例name作為參數(shù)傳入模板。
{{ form.name.label }} {{ form.name() }}
{{ form.submit() }}
1
2
3
4
{{form.name.label}}{{form.name()}}
{{form.submit()}}
這樣渲染出來(lái)的頁(yè)面不美觀,可以嘗試改進(jìn)下,在調(diào)用里傳入一些參數(shù),這些參數(shù)都會(huì)被轉(zhuǎn)化為這個(gè)域的屬性。然后你可以用CSS自己搞定美化問(wèn)題:
{{ form.name.label }} {{ form.name(id='my-text-field') }}
{{ form.submit() }}
1
2
3
4
{{form.name.label}}{{form.name(id='my-text-field')}}
{{form.submit()}}
上述方式顯然很累,之前加入了Bootstrap的支持,Flask-Bootstrap插件其實(shí)也對(duì)Flask-WTF創(chuàng)建的表單有高層接口的支持,可以用Bootstrap來(lái)修飾一下。然后表單的模板就可以簡(jiǎn)單寫(xiě)成:
{% import "bootstrap/wtf.html" as wtf %}
{{ wtf.quick_form(form) }}
1
2
{%import"bootstrap/wtf.html"aswtf%}
{{wtf.quick_form(form)}}
從其他模板import個(gè)函數(shù)進(jìn)來(lái)之前提到過(guò),wtf.quick_form函數(shù)接受一個(gè)Flask-WTF的表單,然后用Bootstrap默認(rèn)的樣式渲染。
現(xiàn)在,首頁(yè)index.html已經(jīng)改為:
{% extends "base.html" %}
{% import "bootstrap/wtf.html" as wtf %}
{% block title %}Flasky{% endblock %}
{% block page_content %}
Hello, {% if name %}{{ name }}{% else %}Stranger{% endif %}!
{{ wtf.quick_form(form) }}
{% endblock %}
1
2
3
4
5
6
7
8
9
{%extends"base.html"%}
{%import"bootstrap/wtf.html"aswtf%}
{%blocktitle%}Flasky{%endblock%}
{%blockpage_content%}
Hello,{%ifname%}{{name}}{%else%}Stranger{%endif%}!
總結(jié)
以上是生活随笔為你收集整理的python表单处理_python flask 表单处理Flask-WTF的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java语言特点解释类_Java语言特点
- 下一篇: python工业自动化镜头_ELVIS