Python Flask-web表單使用詳解
Flask-WTF擴(kuò)展可以把處理web表單的過(guò)程變成一種愉悅的體驗(yàn)。

一、跨站請(qǐng)求偽造保護(hù)
默認(rèn)情況下,F(xiàn)lask-WTF能夠保護(hù)所有表單免受跨站請(qǐng)求偽造的攻擊。惡意網(wǎng)站把請(qǐng)求發(fā)送到被攻擊者已登錄的網(wǎng)站時(shí)就會(huì)引起CSRF攻擊。
為了實(shí)現(xiàn)CSRF保護(hù),F(xiàn)lask-WTF需要程序設(shè)置一個(gè)密鑰。Flask-WTF使用這個(gè)密鑰生成加密令牌,再用令牌驗(yàn)證請(qǐng)求中表單數(shù)據(jù)的真?zhèn)巍TO(shè)置密鑰的方法如下所示:
app = Flask(__name__) app.config['SECRET_KEY']='hard to guess string'
二、表單類(lèi)
使用Flask-WTF時(shí),每個(gè)web表單都由一個(gè)繼承自Form的類(lèi)表示。這個(gè)定義表單中的一組字段,每個(gè)字段都用對(duì)象表示。字段對(duì)象可附屬一個(gè)或多個(gè)驗(yàn)證函數(shù)。驗(yàn)證函數(shù)用來(lái)驗(yàn)證用戶提交的輸入值是否符合要求。
#!/usr/bin/env python
#簡(jiǎn)單的web表單,包含一個(gè)文本字段和一個(gè)提交按鈕
from flask_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')
StringField類(lèi)表示屬性為type="text"的<input>元素,SubmitField類(lèi)表示屬性為type="submit"的<input>元素。
WTForms支持的HTML標(biāo)準(zhǔn)字段

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

四、把表單渲染成HTML
表單字段是可用的,在模板中調(diào)用后會(huì)渲染成HTML。假設(shè)視圖函數(shù)把一個(gè)NameForm實(shí)例通過(guò)參數(shù)form傳入模板,在模板中可以生成一個(gè)簡(jiǎn)單的表單,如下所示:
<form method="POST">
{{ form.hidden_tag() }}
{{ form.name.label }} {{ form.name() }}
{{ form.submit() }}
</form>
<form method="POST">
{{ form.hidden_tag() }}
{{ form.name.label }} {{ form.name(id='my-text-field') }}
{{ form.submit() }}
</form>
Flask-Bootstrap提供了一個(gè)非常高端的輔助函數(shù),可以使用Bootstrap中預(yù)先定義好的表單樣式渲染整個(gè)Flask-WTF表單,而這些操作只需調(diào)用一次即可完成。
{% import "boostrap/wtf.html" as wtf %}
{{ wtf.quick_form(form) }}
#使用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 %}
四、在視圖函數(shù)中處理表單
@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',form=form,name=name)
app.route修飾器中添加的methods參數(shù)告訴Flask在URL映射中把這個(gè)視圖函數(shù)注冊(cè)為GET和POST請(qǐng)求的處理程序。如果沒(méi)指定methods參數(shù),就只把視圖函數(shù)注冊(cè)為GET請(qǐng)求的處理程序。
五、重定向和用戶會(huì)話
#!/usr/bin/env python
from flask import Flask,render_template,session,redirect,url_for
app = Flask(__name__)
@app.route('/',methods=['GET','POST'])
def index():
form = NameForm()
if form.validate_on_submit():
session['name'] = form.name.data
return redirect(url_for('index'))
return render_template('index.html',form=form,name=session.get('name'))
六、Flash消息
例子:提示用戶名或密碼錯(cuò)誤,彈出窗口
from flask import Flask,render_template,session,redirect,url_for,flash
app = Flask(__name__)
@app.route('/',methods=['GET','POST'])
def index():
form = NameForm()
if form.validata_on_submit():
old_name = session.get('name')
if old_name is not None and old_name != form.name.data:
flash('Looks like you have changed your name!')
session['name'] = form.name.data
return redirect(url_for('index'))
return render_template('index.html',form=form,name=session.get('name'))
#渲染Flash消息
{% 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 %}
{% block page_content %}{% endblock %}
</div>
{% endblock %}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python?pandas庫(kù)讀取excel/csv中指定行或列數(shù)據(jù)
通過(guò)閱讀表格,可以發(fā)現(xiàn)Pandas中提供了非常豐富的數(shù)據(jù)讀寫(xiě)方法,下面這篇文章主要給大家介紹了關(guān)于python利用pandas庫(kù)讀取excel/csv中指定行或列數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2022-02-02
七個(gè)生態(tài)系統(tǒng)核心庫(kù)[python自學(xué)收藏]
無(wú)論你是想快速入手Python,還是想成為數(shù)據(jù)分析大神或者機(jī)器學(xué)習(xí)大佬,亦或者對(duì)Python代碼進(jìn)行優(yōu)化,本文的python庫(kù)都能為你提供一些幫助2021-08-08
python實(shí)現(xiàn)修改固定模式的字符串內(nèi)容操作示例
這篇文章主要介紹了python實(shí)現(xiàn)修改固定模式的字符串內(nèi)容操作,結(jié)合實(shí)例形式詳細(xì)分析了Python修改固定模式字符串原理、實(shí)現(xiàn)方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-12-12
Windows系統(tǒng)Python直接調(diào)用C++ DLL的方法
這篇文章主要介紹了Windows系統(tǒng)Python直接調(diào)用C++ DLL文件的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-08-08
python web框架Flask實(shí)現(xiàn)圖形驗(yàn)證碼及驗(yàn)證碼的動(dòng)態(tài)刷新實(shí)例
在本篇文章里小編給大家整理的是關(guān)于python web框架Flask實(shí)現(xiàn)圖形驗(yàn)證碼的相關(guān)知識(shí)點(diǎn),有需要的朋友們參考下。2019-10-10

