python表单处理_python flask 表单处理Flask-WTF
涉及到的插件和包有Flask-WTF,WTForms。內容有表單的創建使用流程,一些最佳實踐,還有在頁面顯示提示消息的簡單方式,配合Flask內置的 flash()。
Flask的requset對象包含了client端發送過來的所有請求,在request.form中就有POST方法提交過來的表單數據。直接使用這些數據可以搞定表單的操作,不過不方便,于是有了Flask-WTF這個插件,它將WTForms這個包嵌入Flask里,簡化Flask下的使用。pip安裝會把插件的以來也安裝進來:
pip install flask-wtf
1
pipinstallflask-wtf
WTForms應該也同時被安裝了。
跨站請求偽造(Cross-Site Request Forgery,CSRF) 保護
CSRF的原理不具體講了,很簡單,感興趣直接網上搜即可。
Flask-WTF默認提供對CSRF的保護。應用里需要設置一個加密用的key,Flask-WTF利用這個key生成一個加密的記號來驗證request帶過來的表單數據??纯磳嵗?#xff1a;
app = Flask(__name__)
app.config['SECRET_KEY'] = 'www.ttlsa.com'
1
2
app=Flask(__name__)
app.config['SECRET_KEY']='www.ttlsa.com'
app.config 是應用保存配置的一個字典。可以直接在字典里增加配置。SECRET_KEY這個配置變量被Flask和一些第三方插件使用,對不同的應用配置不同的值增加點可靠性。
另外,這個值最好放到環境變量里,直接寫到代碼里不太好。
表單類
使用Flask-WTF的時候,每一個表單都是類的形式,這個類需要繼承自Form。這個類里定義一些代表表單各類域的對象,每個對象可以有多個驗證器(validators)。驗證器可以確保用戶的輸入是有效的。
原例子:
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')
表單中的域在類中都定義成類變量。上例中,NameForm類里有文本域name和提交按鈕submit兩個。StringField代表有type="text"屬性的元素。SubmitField代表有type="submit"屬性的元素。構造器的第一個參數是后續渲染表單時候用到的標簽(label)。
下例是一個帶有文本域和提交按鈕的表單例子:
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')
表單中的域在類中都定義成類變量。上例中,LoginForm類里有字符串域openid,復選框remember_me, 密碼域password,提交按鈕submit。分別代表小面信息:
1
2
3
4
構造器的第一個參數是后續渲染表單時候用到的標簽(label)。
在StringField里的validators參數定義了一些驗證器,這些驗證器會在用戶提交數據前檢查數據是否有效。Required驗證器確保提交的內容不能為空。
WTForms提供的各種HTML域:
域類型 含義
StringField 文本
TextAreaField 多行文本
PasswordField 密碼類文本
HiddenField 隱藏文本
DateField 接收給定格式的 datetime.datevalue 的文本
DateTimeField 接收給定格式的 datetime.datetimevalue 的文本T
IntegerField 接收整數的文本
DecimalField 接收decimal.Decimal類型值的文本
FloatField 接收浮點類型值的文本
BooleanField 選是否的復選框
RadioField 包含多個互斥選項的復選框
SelectField 下拉菜單
SelectMultipleField 可多選的下拉菜單
FileField 文件上傳
SubmitField 提交
FormField 講一個表單作為域放入另一個表單里
FieldList 一組給定類型的域
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
域類型含義
StringField文本
TextAreaField多行文本
PasswordField密碼類文本
HiddenField隱藏文本
DateField接收給定格式的datetime.datevalue的文本
DateTimeField接收給定格式的datetime.datetimevalue的文本T
IntegerField接收整數的文本
DecimalField接收decimal.Decimal類型值的文本
FloatField接收浮點類型值的文本
BooleanField選是否的復選框
RadioField包含多個互斥選項的復選框
SelectField下拉菜單
SelectMultipleField可多選的下拉菜單
FileField文件上傳
SubmitField提交
FormField講一個表單作為域放入另一個表單里
FieldList一組給定類型的域
WTForms提供的各種驗證器:
Validator Description
Email 郵箱格式
EqualTo 比較兩個域的值,例如在要求輸入兩次密碼的時候
IPAddress IPv4 地址
Length 按字符串的長度驗證
NumberRange 輸入數字需在某范圍內
Optional 允許不填,不填的時候就忽略其他驗證器
Required 必填
Regexp 通過一個正則表達式驗證
URL URL格式
AnyOf 屬于一組可能值中的一個
NoneOf 不屬于一組可能值中的任何一個
1
2
3
4
5
6
7
8
9
10
11
12
ValidatorDescription
Email郵箱格式
EqualTo比較兩個域的值,例如在要求輸入兩次密碼的時候
IPAddressIPv4地址
Length按字符串的長度驗證
NumberRange輸入數字需在某范圍內
Optional允許不填,不填的時候就忽略其他驗證器
Required必填
Regexp通過一個正則表達式驗證
URLURL格式
AnyOf屬于一組可能值中的一個
NoneOf不屬于一組可能值中的任何一個
渲染表單
表單的各類域在模板中渲染時表現為可調用的對象。假設將一個NameForm的實例name作為參數傳入模板。
{{ form.name.label }} {{ form.name() }}
{{ form.submit() }}
1
2
3
4
{{form.name.label}}{{form.name()}}
{{form.submit()}}
這樣渲染出來的頁面不美觀,可以嘗試改進下,在調用里傳入一些參數,這些參數都會被轉化為這個域的屬性。然后你可以用CSS自己搞定美化問題:
{{ 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插件其實也對Flask-WTF創建的表單有高層接口的支持,可以用Bootstrap來修飾一下。然后表單的模板就可以簡單寫成:
{% import "bootstrap/wtf.html" as wtf %}
{{ wtf.quick_form(form) }}
1
2
{%import"bootstrap/wtf.html"aswtf%}
{{wtf.quick_form(form)}}
從其他模板import個函數進來之前提到過,wtf.quick_form函數接受一個Flask-WTF的表單,然后用Bootstrap默認的樣式渲染。
現在,首頁index.html已經改為:
{% 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%}!
總結
以上是生活随笔為你收集整理的python表单处理_python flask 表单处理Flask-WTF的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java语言特点解释类_Java语言特点
- 下一篇: click事件在什么时候出发_剖析set