4.2 表單類
from flask_wtf import Form
from wtforms import StringField, SubmitField
from wtforms.validators import Required, EqualTo
# 定義一個(gè)表單類
class NameForm(Form):
name=StringField('what is you name', validators=[Required()]) # 創(chuàng)建一個(gè)type=text的input
submit=SubmitField('Submit') # 創(chuàng)建一個(gè)type=submit的input
conPassword=StringField('confirm password', validators=[EqualTo('password', message='must match')]) # message好像必須有
WTForms支持的HTML標(biāo)準(zhǔn)字段
字段類型 | 說(shuō)明 |
---|---|
StringField | 文本字段: input type="text" |
TextAreaField | 多行文本字段: textarea元素 |
PasswordField | 密碼文本字段 |
HiddenField | 隱藏文本字段 |
DateField | 文本字段弟劲,值為datetime.date格式 |
DateTimeField | 文本字段勤晚,值為datetime.datetime格式 |
IntergerField | 文本字段,值為整數(shù) |
DecimalField | 文本字段栈顷,十進(jìn)制芹敌,值為decimal.Deciamal |
FloatField | 文本字段,值為浮點(diǎn)數(shù) |
BooleanField | 復(fù)選框斗这,值為T(mén)rue或者False |
RadioField | 一組單選框斤寇,實(shí)例見(jiàn)下 |
SelectField | 下拉列表,實(shí)例見(jiàn)下 |
SelectMultipleField | 多選下拉列表 |
FileField | 文件上傳字段 |
SubmitField | 表單提交按鈕 |
FormField | 把表單作為一個(gè)字段嵌入另一個(gè)表單 |
FieldList | 一組制定類型的字段 |
幾個(gè)比較特殊的字段示意:
class NameForm(Form):
radioSex=RadioField('性別', choices=[('1', '男人'), ('2', '女人')])
selectHobby=SelectField('愛(ài)好', choices=[('3', '足球'), ('4', '籃球'), ('5', '乒乓')])
# radioSex: 表單radio元素的name值
# 第一個(gè)引號(hào)內(nèi): label值
# choises=[]: 數(shù)組內(nèi)'1'為value值
WTFroms驗(yàn)證函數(shù)
驗(yàn)證函數(shù) | 說(shuō)明 |
---|---|
驗(yàn)證電子郵件地址 | |
EqualTo | 比較兩個(gè)字段的值兄裂,例如兩次密碼驗(yà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 | 使用正則驗(yàn)證輸入值 |
URL | 驗(yàn)證URL |
AnyOf | 確保輸入值在可選值列表中 |
NoneOf | 確保輸入值不再可選值列表中 |
4.3 將表單渲染成HTML
{% extends "base.html" %}
{% import "bootstrap/wtf.html" as wtf %}
{% block title %}Flasky2b{% endblock %}
{% block page_content %}
<div class="page-header">
<h1>Hello, {% if name %}{{ name }}{% else %}Stranger{% endif %}!</h1>
</div>
{#使用flask-bootstrap渲染表單#}
{{ wtf.quick_form(form) }}
{% endblock %}
4.4 在視圖函數(shù)中處理表單
# -*- coding:utf-8 -*-
# 把 str 編碼由 ascii 改為 utf8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
# 以下載入包
from flask import Flask, render_template
from flask_bootstrap import Bootstrap
from flask_moment import Moment # 引入flask-moment
from datetime import datetime # 引入datetime
from flask_wtf import Form
from wtforms import StringField,SubmitField,TextAreaField,IntegerField,BooleanField,RadioField,SelectField,FileField,PasswordField
from wtforms.validators import Required, email, EqualTo
app = Flask(__name__)
app.config['SECRET_KEY']="string hard"
bootstrap=Bootstrap(app)
moment=Moment(app)
# 定義一個(gè)表單類
class NameForm(Form):
name=StringField('what is you name', validators=[Required()]) # 創(chuàng)建一個(gè)type="text"的input句旱,文本傳入label標(biāo)簽
password=PasswordField('password')
conPassword=StringField('confirm password', validators=[EqualTo('password', message='must match')])
intro=TextAreaField('introduce yourself')
email=StringField('input your email', validators=[email()]) # 必須是email格式
integer=IntegerField('input an integer')
booleanC=BooleanField('choose/let')
radioSex=RadioField('性別', choices=[('1', '男人'), ('2', '女人')]) # 創(chuàng)建type="radio"單選框
selectHobby=SelectField('愛(ài)好', choices=[('3', '足球'), ('4', '籃球'), ('5', '乒乓')]) #創(chuàng)建select下拉框
submit=SubmitField('Submit') # 創(chuàng)建一個(gè)type="submit"的input
fileload=FileField('上傳文件')
# 在視圖函數(shù)中處理表單
@app.route('/', methods=['GET', 'POST'])
def hello_world(): # 在視圖函數(shù)中要定義name變量和form變量
name=None
intro=None
form=NameForm() # 實(shí)例化一個(gè)NameForm()類
if form.validate_on_submit(): # 表單驗(yàn)證成功,validate_on_submit()方法返回True
name=form.name.data #
intro=form.intro.data
form.name.data=''
return render_template("form.html",
name=name,
intro=intro,
current_time=datetime.utcnow(),
form=form,
)
if __name__ == '__main__':
app.run(debug=True)
4.5 重定向和用戶會(huì)話
不要讓web程序?qū)OST請(qǐng)求作為瀏覽器發(fā)送的最后一個(gè)請(qǐng)求;
使用重定向后晰奖,原先的name=form.name.data
獲取的數(shù)據(jù)就丟失了谈撒,所以要將數(shù)據(jù)存儲(chǔ)在用戶會(huì)話中,session
from flask import Flask, render_template, session, redirect, url_for
@app.route('/', methods=['GET', 'POST'])
def index():
form = NameForm()
if form.validate_on_submit():
session['name'] = form.name.data
return redirect(url_for('index')) # 生成HTTP重定向響應(yīng)匾南,參數(shù)是重定向的URL
return render_template('index.html', form=form, name=session.get('name'))
# 使用.get('name')讀取避免未找到鍵的異常情況
4.6 flash消息
在視圖函數(shù)中使用flash()會(huì)生成一個(gè)消息啃匿,F(xiàn)lask把get_flashed_messages()函數(shù)開(kāi)放給模板,用于模板中獲取并渲染消息
{% block content %}
<div class='container'>
{% for message in get_flashed_messages() %}
<div class='alert alert-warning'>
<button type='button' class='close' data-dismiss='alert'>×</button>
{{ message }}
</div>
{% endfor %}
</div>
{% endblock %}
from flask import Flask,render_template,session,redirect,url_for,flash
@app.route('/',mrthod=['GET', 'POST'])
def index():
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 changed your name!')
session('name')=form.name.data
return redirect(url_for('index'))
return render_template('index.html', form=form, name=session.get('name'))