Web表單
web表單是web應(yīng)用程序的基本功能。
它是HTML頁面中負(fù)責(zé)數(shù)據(jù)采集的部件别惦。表單有三個部分組成:表單標(biāo)簽狈茉、表單域、表單按鈕掸掸。表單允許用戶輸入數(shù)據(jù)氯庆,負(fù)責(zé)HTML頁面數(shù)據(jù)采集,通過表單將用戶輸入的數(shù)據(jù)提交給服務(wù)器扰付。
在Flask中堤撵,為了處理web表單,我們一般使用Flask-WTF擴(kuò)展羽莺,它封裝了WTForms实昨,并且它有驗(yàn)證表單數(shù)據(jù)的功能
WTForms支持的HTML標(biāo)準(zhǔn)字段
字段對象 | 說明 |
---|---|
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 | 下拉列表 |
SelectMutipleField | 下拉列表曙咽,可選擇多個值 |
FileField | 文件上傳字段 |
SubmitField | 表單提交按鈕 |
FormField | 把表單作為字段嵌入另一個表單 |
FieldList | 一組指定類型的字段 |
WTForms常用驗(yàn)證函數(shù)
驗(yàn)證函數(shù) | 說明 |
---|---|
DataRequired | 確保字段中有數(shù)據(jù) |
EqualTo | 比較兩個字段的值,常用于比較兩次密碼輸入 |
Length | 驗(yàn)證輸入的字符串長度 |
NumberRange | 驗(yàn)證輸入的值在數(shù)字范圍內(nèi) |
URL | 驗(yàn)證URL |
AnyOf | 驗(yàn)證輸入值在可選列表中 |
NoneOf | 驗(yàn)證輸入值不在可選列表中 |
使用Flask-WTF需要配置參數(shù)SECRET_KEY挑辆。
CSRF_ENABLED是為了CSRF(跨站請求偽造)保護(hù)例朱。 SECRET_KEY用來生成加密令牌,當(dāng)CSRF激活的時候鱼蝉,該設(shè)置會根據(jù)設(shè)置的密匙生成加密令牌洒嗤。在HTML頁面中直接寫form表單:
在HTML頁面中直接寫form表單:
<form method='post'>
<input type="text" name="username" placeholder='Username'>
<input type="password" name="password" placeholder='password'>
<input type="submit">
</form>
使用Flask-WTF實(shí)現(xiàn)表單。
配置參數(shù):
app.config['SECRET_KEY'] = 'SECRET_KEY'
# 生成secret_key最簡單的方式
>>> import os
>>> os.urandom(24)
'\xca\x0c\x86\x04\x98@\x02b\x1b7\x8c\x88]\x1b\xd7"+\xe6px@\xc3#\\'
# 設(shè)置方法
app.config['SECRET_KEY'] = '\xca\x0c\x86\x04\x98@\x02b\x1b7\x8c\x88]\x1b\xd7"+\xe6px@\xc3#\\'
# or
app.secret_key = '\xca\x0c\x86\x04\x98@\x02b\x1b7\x8c\x88]\x1b\xd7"+\xe6px@\xc3#\\'
# or
app.config.update(SECRET_KEY='\xca\x0c\x86\x04\x98@\x02b\x1b7\x8c\x88]\x1b\xd7"+\xe6px@\xc3#\\')
視圖函數(shù):
from flask import Flask,request,render_template,url_for,redirect,session,flash
from flask_wtf import FlaskForm
from wtforms import StringField,PasswordField,SubmitField
from wtforms.validators import EqualTo,DataRequired
from config import config
app = Flask(__name__)
app.config.from_object(config["baseconfig"])
class webform(FlaskForm):
username = StringField(label='用戶名',validators=[DataRequired()], render_kw={'placeholder':'請輸入用戶名'})
password = PasswordField(label='密碼',validators=[DataRequired()],render_kw={'placeholder':'請輸入密碼'})
re_password = PasswordField(label='確認(rèn)密碼',validators=[DataRequired(),EqualTo('password','密碼不一致')],render_kw={'placeholder':'確認(rèn)密碼'})
submit = SubmitField(label='提交')
@app.route("/",methods=['POST','GET'])
def login():
form = webform()
if request.method == "POST":
if form.validate_on_submit():
username = form.username.data
password = form.password.data
print(username,password)
return '%s-%s' % (username,password)
else:
message = form.errors
# form中所有的錯誤信息都被errors捕捉魁亦。
flash(message)
return render_template('login.html',form=form)
if __name__ == '__main__':
app.run()
登錄頁面:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form method="post">
{{ form.csrf_token() }}
{{ form.username.label }}{{ form.username }}
{{ form.password.label }}{{ form.password }}
{{ form.re_password.label }}{{ form.re_password }}
{{ form.submit }}
{% for message in get_flashed_messages() %}
{{ message }}
{% endfor %}
</form>
</body>
</html>