Flask從入門到入土(三)——Web表單
Flask-WTF擴展可以把處理Web表單的過程變成一種愉悅的體驗。這個擴展對獨立的WTForms包進行了包裝,方便集成到Flask程序中。
Flask-WTF及其依賴可使用pip安裝:
pip install flask-wtf
跨站請求僞造保護
默認情況下,Flask-WTF能保護所有表單免受跨站請求僞造的攻擊。惡意網站把請求發送到被攻擊者已登錄的其他網站時就會引發CSRF攻擊。
爲了實現CSRF保護,Flask-WTF需要程序設置一個密匙。Flask-WTF使用這個密匙生成加密令牌,再用令牌驗證請求中表單數據的真僞。設置密匙的方法如下:
app = Flask(__name__)
app.config['SECRET_KEY'] = 'hard to guess string'
app.config字典可以用來存儲框架、擴展和程序本身的配置變量。使用標準的字典句發就能把配置值添加到app.config對象中。這個對象還提供了一些方法,可以從文件或環境中導入配置值。
SECRET_KEY配置變臉是通用密匙,可在Flask和多個第三方擴展中使用,如其名,加密強度取決與變量值的機密程度。不同的程序要使用不同的密匙,而且要保證其他人不知道你所用的字符串。
爲了增強安全性,密匙不應該直接寫入代碼,而要保存在環境變量中。
表單類
使用Flask-WTB時,每個WEB表單都由一個繼承自Form的類表示。這個類定義表單中的一組字段,每個字段都用對象表示。字段對象可附屬一個或多個驗證函數。驗證函數用來驗證用戶提交的輸入值是否符合要求。
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')
這個表單中的字段都定義爲類變量,類變量的值是響應字段類型的對象。在這個實例中,NameForm表單中有一個名爲name的文本字段和一個名爲submit的提交按扭。StringField類表示屬性爲type="text"的<input>元素。SubmitField類表示屬性爲type="submit"的<input>元素。字段構造函數的第一個參數是把表單渲染成HTML時使用的標號。
StringField構造函數中可選參數validators指定一個由驗證函數組成的列表,在接受用戶提交的數據之前驗證數據。驗證函數Required()確保提交的字段不爲空。
Form基類由Flask-WTF擴展定義,所以從flask.ext.wtf中導入。字段和驗證函數卻可以直接從WTForms包中導入。
WTForms支持的HTML標準字段如下:
—————————————————————————————
StringField 文本字段
TextAreaField 多行文本字段
PasswordField 密碼文本字段
HiddenField 隱藏文本字段
DateField 文本字段,值爲datatime.date格式
DateTimeField 文本字段,值爲datatime.datetime格式
IntegerField 文本字段,值爲整數
DecimalField 文本字段,值爲decimal.Decimal
FloatField 文本字段,值爲浮點數
BooleanField 復選框,值爲True和False
RadioField 一組單選框
SelectField 下拉列表
SelectMultipleField 下拉列表,可選擇多個值
FileField 文件上傳字段
SubmitField 表單提交按扭
FormField 把表單作爲字段嵌入另一個表單
FieldList 一組指定類型的字段
—————————————————————————————
WTForms內建的驗證函數如下:
—————————————————————————————
Email 驗證電子郵件地址
EqualTo 比較兩個字段的值,常用與要求輸入兩次密碼進行確認的情況
IPAddress 驗證IPv4網絡地址
Length 驗證輸入字符串的長度
NumberRange 驗證輸入的值在數字範圍內
Optional 無輸入值時跳過其他驗證函數
Required 確保字段中有數據
Regexp 確保正則表達式驗證輸入值
URL 驗證URL
AnyOf 確保輸入字在可選值列表
NoneOf 確保輸入值不在可選值列表
—————————————————————————————
把表單渲染成HTML
表單字段是可調用的,在模板中調用後會渲染成HTML。假設視圖函數把一個NameForm實例通過參數form傳入模板,在模板中可以生成一個簡單的表單,如下:
<form method="POST">
{{form.hidden_tag()}}
{{form.name.label}} {{form.name()}}
{{form.submit()}}
</form>
當然這個表單還很簡陋。要想改進表單的外觀,可以把參數傳入渲染字段的函數,傳入的參數會被轉換成字段HTML屬性。例如,可以把字段指定id或class屬性,然後定義CSS樣式:
<form method="POST">
{{form.hidden_tag()}}
{{form.name.label}} {{form.name(id='my-text-field')}}
{{form.submit()}}
</form>
Flask從入門到入土(三)——Web表單的更多相关文章
- Flask從入門到入土(三)——模板
模板是一個包含響應文本的文件,其中包含佔位變量表示的動態部分,其具體值只是請求上下文中才能知道.使用真實值替換變量,再返回最終得到的響應字符串,這一過程稱爲渲染.爲了渲染模板,Flask使用了一個名爲 ...
- Flask從入門到入土(二)——請求响应與Flask扩展
———————————————————————————————————————————————————————————— 一.程序和請求上下文 Flask從客戶端收到請求時,要讓視圖函數能訪問一些對象 ...
- Flask從入門到入土(一)——程序的基本結構
一.初始化 所有Flask程序都必須創建一個程序實例.Web服務器使用一種名爲Web服務器網關接口的協議,把接收自客戶端的所有請求都轉交給這個對象處理.程序實例書Flask類的對象,創建代碼: fro ...
- Flask從入門到入土(四)——登錄實現
表單介紹 1.表單標籤 聲明表單的範圍,位於表單標籤中的元素將被提交 語法: <form> </form> 屬性: Method(提交方式get,post) , Enctyp ...
- Flask從入門到入土(五)——Flask与数据库
import sqlite3 def init_db(): sql = 'create table user(id INT,name TEXT)' conn = sqlite3.connect(&qu ...
- GOOGLE搜索從入門到精通V4.0
1,前言2,摘要3,如何使用本文4,Google簡介5,搜索入門6,初階搜索 6.1,搜索結果要求包含兩個及兩個以上關鍵字 6.2,搜索結果要求不包含某些特定資訊 6.3,搜索結果至少包含多個關鍵字中 ...
- Flask学习 三 web表单
web表单 pip install flask-wtf 实现csrf保护 app.config['SECRET_KEY']='hard to guess string' # 可以用来存储框架,扩展,程 ...
- Delphi APP 開發入門(三)簡易計算機
Delphi APP 開發入門(三)簡易計算機 分享: Share on facebookShare on twitterShare on google_plusone_share 閲讀次數:68 ...
- Flask 教程 第三章:Web表单
本文翻译自 The Flask Mega-Tutorial Part III: Web Forms 这是Flask Mega-Tutorial系列的第三部分,我将告诉你如何使用Web表单. 在第二章中 ...
随机推荐
- JS与ajax遍历list
示例: <script> <c:forEach var="yanan" items="${yananList}"> ...
- Web Magic 简介
WebMagic in Action Little book of WebMagic. WebMagic是我业余开发的一款简单灵活的爬虫框架.基于它你可以很容易的编写一个爬虫. 这本小书以WebMag ...
- linkinFrame--测试项目添加git管理
OK,前面一篇博客,已经搭建好了项目的基础的结构.现在我们添加一个简单的servlet来测试下项目能不能跑,然后在讲项目添加到coding上用git管理. 1,我们编写一个servlet,编写一个js ...
- lambda高级进阶--表达式参数
1,现在我们封装一个方法,来提供一个比较器,显然比较器是拥有两个参数的--用来比较的两个值. public class Linkin { public static String[] sort(Str ...
- 关于Mysql模糊查询的优化-全文检索和Like的使用
表A:CREATE TABLE `tableA` (`id` int(11) NOT NULL auto_increment,`content` varchar(256) default NULL,P ...
- Mysql的主从配置
前言:这次学习分布式的思想要配置mysql的主从复制和读写分离,我在主从配置上踩到很多坑,在此演示一遍配置过程,并附上问题的说明和自己的一些见解 Mysql主从复制的原理 附上原理图: mysql的主 ...
- mavean的依赖传递和排除依赖
三个mavean项目 A .B. C 如果B依赖A(A先执行clean package命令) 那么B得pom.xml文件里面就写 <dependency> <groupId> ...
- 【转】Awk 命令学习总结、AWk命令系列学习(linux shell)
前面的话 学习linux 的同人,都知道linux shell文本处理能力非常强大.有一组强大的文本处理工具:grep,sed,awk . 其中grep 经常用作查找匹配文本.sed用作文本编辑替换. ...
- XML系列之--Linq操作带属性的XML(四)
关于XML,之前解析过电文收发方面的,就是所谓的带表头.前缀(命名空间)SOAP格式.这次需求是解析一个xml的模板(xls内容),然后填充数据,最后保存.需要时可转换xls.pdf等文件.关于这种带 ...
- PowerMockito使用详解
一.PowerMock概述 现如今比较流行的Mock工具如jMock,EasyMock,Mockito等都有一个共同的缺点:不能mock静态.final.私有方法等.而PowerMock能够完美的弥补 ...