Python Flask-web表單使用詳解
Flask-WTF擴展可以把處理web表單的過程變成一種愉悅的體驗。
一、跨站請求偽造保護
默認情況下,F(xiàn)lask-WTF能夠保護所有表單免受跨站請求偽造的攻擊。惡意網(wǎng)站把請求發(fā)送到被攻擊者已登錄的網(wǎng)站時就會引起CSRF攻擊。
為了實現(xiàn)CSRF保護,F(xiàn)lask-WTF需要程序設置一個密鑰。Flask-WTF使用這個密鑰生成加密令牌,再用令牌驗證請求中表單數(shù)據(jù)的真?zhèn)?。設置密鑰的方法如下所示:
app = Flask(__name__) app.config['SECRET_KEY']='hard to guess string'
二、表單類
使用Flask-WTF時,每個web表單都由一個繼承自Form的類表示。這個定義表單中的一組字段,每個字段都用對象表示。字段對象可附屬一個或多個驗證函數(shù)。驗證函數(shù)用來驗證用戶提交的輸入值是否符合要求。
#!/usr/bin/env python #簡單的web表單,包含一個文本字段和一個提交按鈕 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類表示屬性為type="text"的<input>元素,SubmitField類表示屬性為type="submit"的<input>元素。
WTForms支持的HTML標準字段
WTForms驗證函數(shù)
四、把表單渲染成HTML
表單字段是可用的,在模板中調用后會渲染成HTML。假設視圖函數(shù)把一個NameForm實例通過參數(shù)form傳入模板,在模板中可以生成一個簡單的表單,如下所示:
<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提供了一個非常高端的輔助函數(shù),可以使用Bootstrap中預先定義好的表單樣式渲染整個Flask-WTF表單,而這些操作只需調用一次即可完成。
{% 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映射中把這個視圖函數(shù)注冊為GET和POST請求的處理程序。如果沒指定methods參數(shù),就只把視圖函數(shù)注冊為GET請求的處理程序。
五、重定向和用戶會話
#!/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消息
例子:提示用戶名或密碼錯誤,彈出窗口
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 %}
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
python?pandas庫讀取excel/csv中指定行或列數(shù)據(jù)
通過閱讀表格,可以發(fā)現(xiàn)Pandas中提供了非常豐富的數(shù)據(jù)讀寫方法,下面這篇文章主要給大家介紹了關于python利用pandas庫讀取excel/csv中指定行或列數(shù)據(jù)的相關資料,需要的朋友可以參考下2022-02-02七個生態(tài)系統(tǒng)核心庫[python自學收藏]
無論你是想快速入手Python,還是想成為數(shù)據(jù)分析大神或者機器學習大佬,亦或者對Python代碼進行優(yōu)化,本文的python庫都能為你提供一些幫助2021-08-08python實現(xiàn)修改固定模式的字符串內容操作示例
這篇文章主要介紹了python實現(xiàn)修改固定模式的字符串內容操作,結合實例形式詳細分析了Python修改固定模式字符串原理、實現(xiàn)方法及相關操作注意事項,需要的朋友可以參考下2019-12-12Windows系統(tǒng)Python直接調用C++ DLL的方法
這篇文章主要介紹了Windows系統(tǒng)Python直接調用C++ DLL文件的方法,本文給大家介紹的非常詳細,具有一定的參考借鑒價值 ,需要的朋友可以參考下2019-08-08python web框架Flask實現(xiàn)圖形驗證碼及驗證碼的動態(tài)刷新實例
在本篇文章里小編給大家整理的是關于python web框架Flask實現(xiàn)圖形驗證碼的相關知識點,有需要的朋友們參考下。2019-10-10