1. 程式人生 > >用 Flask 來寫個輕部落格 (13) — M(V)C_WTForms 服務端表單檢驗

用 Flask 來寫個輕部落格 (13) — M(V)C_WTForms 服務端表單檢驗

目錄

前文列表

用 Flask 來寫個輕部落格 (1) — 建立專案
用 Flask 來寫個輕部落格 (2) — Hello World!
用 Flask 來寫個輕部落格 (3) — (M)VC_連線 MySQL 和 SQLAlchemy
用 Flask 來寫個輕部落格 (4) — (M)VC_建立資料模型和表
用 Flask 來寫個輕部落格 (5) — (M)VC_SQLAlchemy 的 CRUD 詳解
用 Flask 來寫個輕部落格 (6) — (M)VC_models 的關係(one to many)
用 Flask 來寫個輕部落格 (7) — (M)VC_models 的關係(many to many)
用 Flask 來寫個輕部落格 (8) — (M)VC_Alembic 管理資料庫結構的升級和降級
用 Flask 來寫個輕部落格 (9) — M(V)C_Jinja 語法基礎快速概覽
用 Flask 來寫個輕部落格 (10) — M(V)C_Jinja 常用過濾器與 Flask 特殊變數及方法
用 Flask 來寫個輕部落格 (11) — M(V)C_建立檢視函式
用 Flask 來寫個輕部落格 (12) — M(V)C_編寫和繼承 Jinja 模板

WTForms

WTForms:是一個服務端表單檢驗庫,用於在保證安全的前提下,對常見的表單型別進行輸入的合法性驗證。除此之外,還提供了 Jinja HTML 渲染、預防跨域請求偽造(CSRF)、SQL 注入

  • 安裝
(env) [[email protected]-dev JmilkFan-s-Blog]# pip install Flask-WTF
(env) [[email protected]-dev JmilkFan-s-Blog]# pip freeze > requirements.txt
  • 生成金鑰
    NOTE 1: WTF 的安全措施的執行需要我們提供一個*安全金鑰,用於生成加密的簽名,在所有需要驗證真實性的所有地方都會用到這個簽名。
(env) [root@flask-dev JmilkFan-s-Blog]# cat /dev/urandom | tr -cd 'a-f0-9' | head -c 32
  • 將金鑰寫入配置項
class Config(object):
    """Base config class."""
    SECRET_KEY = '你的金鑰'

class ProdConfig(Config):
    """Production config class."""
    pass

class DevConfig(Config):
    """Development config class."""
DEBUG = True # MySQL connection SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:[email protected]:3306/myblog?charset=utf8'

WTF 的基礎使用

WTForms 由 欄位、檢驗器、表單 三部分組成:
欄位:表示表單的輸入框,會做一些初步的輸入檢查
檢驗器:是一組被附加到欄位(輸入框)上的函式,用於對輸入資料的檢驗,確保輸入我們期望的資料
表單:是一個 Python 類,其中包含了 欄位(類屬性) 和 檢驗器,在接收到 HTTP POST 請求時,會根據定義的檢驗器規則來對輸入資料進行檢驗

from flask_wtf import Form
from wtforms import StringField, TextField
from wtforms.validators import DataRequired, Length


class CommentForm(Form):
    """Form vaildator for comment."""

    # Set some field(InputBox) for enter the data.
    # patam validators: setup list of validators
    name = StringField(
        'Name',
        validators=[DataRequired(), Length(max=255)])

    text = TextField(u'Comment', validators=[DataRequired()])

NOTE 1:表單類需要繼承 Flask WTF 擴充套件提供的 Form 類
NOTE 2:表單類中的一個類屬性,就代表了一個欄位,即輸入框。wtforms 提供了多種型別的欄位類
NOTE 3:欄位類的第一個引數為輸入框標題,第二個引數為繫結到該欄位的檢驗器列表,由 wtforms.validators 提供

  • 將 wt_forms 模組匯入到 main.py 中:
from flask import Flask

from config import DevConfig
import wt_forms

app = Flask(__name__)
# Import the views module
views = __import__('views')

# Get the config from object of DecConfig
app.config.from_object(DevConfig)

if __name__ == '__main__':
    app.run()

常用的欄位型別

每一種欄位型別都對應了一個 Form 元件。

fields.DateField

對應了 Python 中的 Date 物件,可以接收一個 format 可選引數來設定 Date 格式,該引數需要傳入一個 strftime(格式化輸出時間) 的字串。

fields.IntegerField

將提交的資料強制轉換成為整數,並在模板上渲染成為一個數字型別的輸入框。

fields.FloatField

將提交的資料強制轉換成為浮點數,並在模板上渲染成為一個數字型別的輸入框。

fields.StringField

普通的文字輸入框,會將輸入的內容強制轉換成為 String 型別物件。

fields.RadioField

代表一組單項選擇框,接收一個 choices 引數,該引數需要傳入一個以 Tuple 為元素的 List 型別物件,這些引數值表示了顯示的選項和返回值。

fields.SelectField/fields.SelectMultipleField

代表一組單選/多選框,接收一個 choices 引數,該引數需要傳入一個以 Tuple 為元素的 List 型別物件,代表選項的顯示內容和返回值。
常用的檢驗器

WTForms 的檢驗器

一般能夠通過其命名來得知其作用,所有的檢驗器都能夠接收一個 message 引數,該引數表示了輸入的資料沒有通過驗證時,返回的錯誤資訊。

  • validators.DataRequired()
  • validators.Email()
  • validators.Length(min=-1, max=-1)
  • validators.NumberRange(min=None, max=None)
  • validators.Optional()
  • validators.Regexp(regex)
  • validators.URL()

自定義檢驗器

自定義檢驗器所需要做的事情就是:實現一個函式 接收表單物件和欄位物件作為引數 當沒有通過驗證時,觸發一個 wtform.VaildationError 異常 .

import re

from wtforms import ValidationError

def custom_email(form_object, field_object):
    """Define a vaildator"""

    if not re.match(r"[^@[email protected][^@]+\.[^@]]+", field_object.data):
        raise ValidationError('Field must be a valid email address.')

相關推薦

Flask 部落 (13) — M(V)C_WTForms 服務檢驗

目錄 前文列表 用 Flask 來寫個輕部落格 (1) — 建立專案 用 Flask 來寫個輕部落格 (2) — Hello World! 用 Flask 來寫個輕部落格 (3) — (M)VC_連線 MySQL 和 SQLAlchemy

Flask 部落 (14) — M(V)C_實現專案首頁的模板

目錄 前文列表 實現所需要的檢視函式 在開始實現首頁模板之前, 我們為了除錯和顯示的方便, 首先偽造一些假資料: fake_data.py import rand

Flask 部落 (6) — (M)VC_models 的關係(one to many)

目錄 前文列表 擴充套件閱讀 前言 models 中的關係能夠對映成為關係型資料庫表中的關係,models 中可以相互建立引用,使得相關聯的資料能夠很容易的一次性的從資料庫中取出。 一對多 首先繼續在 models

Flask 部落 (3) — (M)VC_連線 MySQL 和 SQLAlchemy

目錄 前文列表 擴充套件閱讀 前言 大多數的應用程式在開發之前都需要先進行資料庫設計這一環節,所以本篇就先來記錄在 Flask 中如何使用 Models,也就是 MVC 模式中的 M 。 Models 模型 模型 就

Flask 部落 (7) — (M)VC_models 的關係(many to many)

目錄 目錄 前文列表 擴充套件閱讀 前期準備 多對多 使用樣例 前文列表 擴充套件閱讀 前期準備 在實現多對多之前,我們還需要先增加一個評論(Comment) models class,而且 Comment 是 P

Flask 部落 (5) — (M)VC_SQLAlchemy 的 CRUD 詳解

目錄 前文列表 擴充套件閱讀 SQLAlchemy 的 CRUD CRUD 提供了在 Web 應用程式中所需要的所有操作和檢視資料的基礎功能, 尤其在 REST 風格的應用中, CRUD 就能實現一切所需功能. 本篇博文主要記

Flask 部落 (26) — 使用 Flask-Celery-Helper 實現非同步任務

目錄 前文列表 擴充套件閱讀 Celery Celery 是使用 Python 多工庫來編寫的任務佇列工具, 可以 並行 的執行任務. 我們會將執行時間較長但又不那

Flask 部落 (16) — MV(C)_Flask Blueprint 藍圖

目錄 前文列表 擴充套件閱讀 Blueprint 藍圖 Blueprint 藍圖是一種用來擴充套件已有 Flask 應用結構的方法,通過藍圖的思想我們能夠把自己的 Application 拆分成為不同的元件。通常,一個元件代

Flask 部落 (23) — 應用 OAuth 實現 Facebook 第三方登入

目錄 前文列表 擴充套件閱讀 第三方登入流程 Resource Owner:資源所有者,本文中又稱”使用者”(user)。 Authorization server:認證伺服器,即服務提供商專門用來處理認證的伺服器。

Flask 部落 (17) — MV(C)_應用藍圖重構專案

目錄 前文列表 重構目錄結構 現在專案的目錄結構: (env) [[email protected] opt]# tree JmilkFan-s-Blog/

Flask 部落 (24) — 使用 Flask-Login 保護應用安全

目錄 前文列表 擴充套件閱讀 使用者登入帳號 Web上的使用者登入功能應該是最基本的功能了,但這個功能可能並沒有你所想像的那麼簡單,這是一個關係到使用者安全的功能. 在現代這樣速度的計算速度下,用窮舉法破解賬戶的密碼會是一件

Flask 部落 (2) — Hello World!

目錄 前文列表 擴充套件閱讀 實現最簡單的 Flask 應用 建立 config.py 檔案 該檔案是整個 Flask 應用程式的配置檔案,定義我們常用的配置類 Config/ProdConfig/DevConfig

Flask 部落 (31) — 使用 Flask-Admin 實現 FileSystem 管理

目錄 前文列表 擴充套件閱讀 編寫 FileSystem Admin 頁面 所謂的 FileSystem Admin 功能, 就是哪呢鋼構通過後臺管理頁面檢視並修改 blog 專案中, 或自定義的檔案目錄內容. 使用 F

Flask 部落 (37) — 在 Github 上為第一階段的版本打 Tag

目錄 目錄 前文列表 打 Tag 前文列表 第一階段結語 從 2016/11/13 至今 2017/01/02 剛好 50 天, <<用 Flask 來寫個輕部落格>> 系列博文的第一階段也就算告一段

Flask 部落 (32) — 使用 Flask-RESTful 構建 RESTful API 之一

目錄 前文列表 擴充套件閱讀 RESTful API REST(Representational State Transfer):是一種軟體架構的設計風格,而不是一種標準。主要用於 C/S 架構的軟體設計,也能很好的支援 B

本想python 好友發送給我指定的號,然後截屏發給好友,但是消息分割處理小毛病,還在測試

nbsp for wechat 全屏 名片 .text pict 參數 end from wxpy import * from PIL import ImageGrab import os img_path_name=‘1.jpg‘ def jiepin(img

段子了 誰說部落不能段子

1. 你就是我的第一志願 因為我想上你 2.我願有一天能牽著你的手 ,去敬各位來賓的酒 3.我給你變個魔術,我變完了 我變得更喜歡你了,但你卻看不到。 4.我喜歡一個人,  那人一定很漂亮吧 !你太自戀了。 5.在遇見你之前我有兩顆心,,一顆善心 一顆噁心,,現在我只有一顆

markdown的新部落覆蓋了原有的部落,導致原有的部落消失了

查了一下,確實是找不到了,瀏覽量還是存在的。只有重新寫了,那是在markdown上快取的部落格,感覺是個小bug。 剛開始用csdn,不會用markdown真是一臉黑。 查了下,點(也不知道圖片上傳成功了沒)新建就可以了。也確實可以了!

Flask開發部落(二):Flask-模板

作者:chen_h 微訊號 & QQ:862251340 微信公眾號:coderpai 目錄 上節回顧 如果你依照上一章的話,你應當有一個完全工作的簡單的 web 應用程式,我們專案的檔案結構如下(前