Tyrion是一個基於Python實現的支援多個WEB框架的Form表單驗證元件,其完美的支援Tornado、Django、Flask、Bottle Web框架。Tyrion主要有兩大重要動能:
- 表單驗證
- 生成HTML標籤
- 保留上次提交內容
對於表單驗證,告別書寫重複的正規表示式對使用者提交的資料進行驗證的工作,從此解放雙手,跟著我左手右手一個慢動作…
對於生成HTML標籤,不在人工書寫html標籤,讓Tyrion幫你自動建立…
對於保留上次提交內容,由於預設表單提交後頁面重新整理,原來輸入的內容會清空,Tyrion可以保留上次提交內容。
github:https://github.com/WuPeiqi/Tyrion
使用文件
1、下載安裝
1 |
pip install PyTyrion |
github: https://github.com/WuPeiqi/Tyrion
2、配置WEB框架種類
由於Tyrion同時支援Tornado、Django、Flask、Bottle多個WEB框架,所有在使用前需要進行指定。
1 2 3 |
import Tyrion Tyrion.setup('tornado') # setup的引數有:tornado(預設)、django、bottle、flask |
3、建立Form類
Form類用於提供驗證規則、外掛屬性、錯誤資訊等
1 2 3 4 5 6 7 8 |
from Tyrion.Forms import Form from Tyrion.Fields import StringField from Tyrion.Fields import EmailField class LoginForm(Form): username = StringField(error={'required': '使用者名稱不能為空'}) password = StringField(error={'required': '密碼不能為空'}) email = EmailField(error={'required': '郵箱不能為空', 'invalid': '郵箱格式錯誤'}) |
4、驗證使用者請求
前端HTML程式碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<form method="POST" action="/login.html"> <div> <input type="text" name="username"> </div> <div> <input type="text" name="password"> </div> <div> <input type="text" name="email"> </div> <input type="submit" value="提交"> </form> |
使用者提交資料時,在後臺書寫如下程式碼即可實現使用者請求資料驗證(Tornado示例):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
class LoginHandler(tornado.web.RequestHandler): def get(self, *args, **kwargs): self.render('login.html') def post(self, *args, **kwargs): form = LoginForm(self) ###### 檢查使用者輸入是否合法 ###### if form.is_valid(): ###### 如果不合法,則輸出錯誤資訊 ###### print(form.error_dict) else: ###### 如果合法,則輸出使用者輸入的內容 ###### print(form.value_dict) self.render('login.html') |
示例01:原始碼下載(含Tornado、Django、Flask、Bottle)
5、驗證使用者請求 && 生成HTML標籤 && 保留上次輸入內容 && 錯誤提示
Tyrion不僅可以驗證使用者請求,還可以生成自動建立HTML標籤並且可以保留使用者上次輸入的內容。在HTML模板中呼叫Form類物件的欄位即可,如(Tornado示例):
1 2 3 4 5 6 7 8 |
from Tyrion.Forms import Form from Tyrion.Fields import StringField from Tyrion.Fields import EmailField class LoginForm(Form): username = StringField(error={'required': '使用者名稱不能為空'}) password = StringField(error={'required': '密碼不能為空'}) email = EmailField(error={'required': '郵箱不能為空', 'invalid': '郵箱格式錯誤'}) |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class LoginHandler(tornado.web.RequestHandler): def get(self, *args, **kwargs): form = LoginForm(self) self.render('login.html', form=form) def post(self, *args, **kwargs): form = LoginForm(self) print(form.is_valid()) print(form.error_dict) print(form.value_dict) self.render('login.html', form=form) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<form method="post" action="/login.html"> <div> <!-- Form建立的標籤 --> {% raw form.username %} <!-- 錯誤資訊 --> <span>{{form.error_dict.get('username',"")}}</span> </div> <div> {% raw form.password %} <span>{{form.error_dict.get('password',"")}}</span> </div> <div> {% raw form.email %} <span>{{form.error_dict.get('email',"")}}</span> </div> <input type="submit" value="提交"/> </form> |
注意: HTML模板中的轉義
示例02:原始碼下載(含有Tornado、Django、Flask、Bottle)
6、Form欄位型別
Form的欄位用於指定從請求中獲取的資料型別以及格式,以此來驗證使用者輸入的內容。
1 2 3 4 5 6 7 8 |
from Tyrion.Forms import Form from Tyrion.Fields import StringField from Tyrion.Fields import EmailField class LoginForm(Form): username = StringField(error={'required': '使用者名稱不能為空'}) password = StringField(error={'required': '密碼不能為空'}) email = EmailField(error={'required': '郵箱不能為空', 'invalid': '郵箱格式錯誤'}) |
以上程式碼表示此Form類可以用於驗證使用者輸入的內容,並且 username和password必須不能為空,email必須不能為空並且必須是郵箱格式。
目前支援所有欄位:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 |
StringField """ 要求必須是字串,即:正則^.*$ 引數: required 布林值,是否允許為空 max_length 整數,限制使用者輸入內容最大長度 min_length 整數,限制使用者輸入內容最小長度 error 字典,自定義錯誤提示,如:{ 'required': '值為空時的錯誤提示', 'invalid': '格式錯誤時的錯誤提示', 'max_length': '最大長度為10', 'min_length': '最小長度為1', } widget 定製生成的HTML外掛(預設InputText) """ EmailField """ 要求必須是郵箱格式的字串 引數: required 布林值,是否允許為空 max_length 整數,限制使用者輸入內容最大長度 min_length 整數,限制使用者輸入內容最小長度 error 字典,自定義錯誤提示,如:{ 'required': '值為空時的錯誤提示', 'invalid': '格式錯誤時的錯誤提示', 'max_length': '最大長度為10', 'min_length': '最小長度為1', } widget 定製生成的HTML外掛(預設InputText) """ IPField """ 要求必須是IP格式 引數: required 布林值,是否允許為空 max_length 整數,限制使用者輸入內容最大長度 min_length 整數,限制使用者輸入內容最小長度 error 字典,自定義錯誤提示,如:{ 'required': '值為空時的錯誤提示', 'invalid': '格式錯誤時的錯誤提示', 'max_length': '最大長度為10', 'min_length': '最小長度為1', } widget 定製生成的HTML外掛(預設InputText) """ IntegerField """ 要求必須整數格式 引數: required 布林值,是否允許為空 max_value 整數,限制使用者輸入數字最大值 min_value 整數,限制使用者輸入數字最小值 error 字典,自定義錯誤提示,如:{ 'required': '值為空時的錯誤提示', 'invalid': '格式錯誤時的錯誤提示', 'max_value': '最大值為10', 'max_value': '最小值度為1', } widget 定製生成的HTML外掛(預設InputText) """ FloatField """ 要求必須小數格式 引數: required 布林值,是否允許為空 max_value 整數,限制使用者輸入數字最大值 min_value 整數,限制使用者輸入數字最小值 error 字典,自定義錯誤提示,如:{ 'required': '值為空時的錯誤提示', 'invalid': '格式錯誤時的錯誤提示', 'max_value': '最大值為10', 'max_value': '最小值度為1', } widget 定製生成的HTML外掛(預設InputText) """ StringListField """ 用於獲取請求中的多個值,且保證每一個元素是字串,即:正則^.*$ 如:checkbox或selct多選時,會提交多個值,用此欄位可以將使用者提交的值儲存至列表 引數: required 布林值,是否允許為空 ele_max_length 整數,限制使用者輸入的每個元素內容最大長度 ele_min_length 整數,限制使用者輸入的每個元素內容最小長度 error 字典,自定義錯誤提示,如:{ 'required': '值為空時的錯誤提示', 'element': '列表中的元素必須是字串', 'ele_max_length': '最大長度為10', 'ele_min_length': '最小長度為1', } widget 定製生成的HTML外掛(預設InputMultiCheckBox,即:checkbox) """ IntegerListField """ 用於獲取請求中的多個值,且保證每一個元素是整數 如:checkbox或selct多選時,會提交多個值,用此欄位可以將使用者提交的值儲存至列表 引數: required 布林值,是否允許為空 ele_max_value 整數,限制使用者輸入的每個元素內容最大長度 ele_min_value 整數,限制使用者輸入的每個元素內容最小長度 error 字典,自定義錯誤提示,如:{ 'required': '值為空時的錯誤提示', 'element': '列表中的元素必須是數字', 'ele_max_value': '最大值為x', 'ele_min_value': '最小值為x', } widget 定製生成的HTML外掛(預設InputMultiCheckBox,即:checkbox) """ |
7、Form欄位widget引數:HTML外掛
HTML外掛用於指定當前欄位在生成HTML時表現的種類和屬性,通過指定此引數從而實現定製頁面上生成的HTML標籤
1 2 3 4 5 6 7 8 |
from Tyrion.Forms import Form from Tyrion.Fields import StringField from Tyrion.Fields import EmailField from Tyrion.Widget import InputPassword class LoginForm(Form): password = StringField(error={'required': '密碼不能為空'},widget=InputPassword()) |
上述LoginForm的password欄位要求使用者輸入必須是字串型別,並且指定生成HTML標籤時會建立為<input type=’password’ > 標籤
目前支援所有外掛:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
InputText """ 設定Form對應欄位在HTML中生成input type='text' 標籤 引數: attr 字典,指定生成標籤的屬性,如: attr = {'class': 'c1', 'placeholder': 'username'} """ InputEmail """ 設定Form對應欄位在HTML中生成input type='email' 標籤 引數: attr 字典,指定生成標籤的屬性,如: attr = {'class': 'c1', 'placeholder': 'username'} """ InputPassword """ 設定Form對應欄位在HTML中生成input type='password' 標籤 引數: attr 字典,指定生成標籤的屬性,如: attr = {'class': 'c1', 'placeholder': 'username'} """ TextArea """ 設定Form對應欄位在HTML中生成 textarea 標籤 引數: attr 字典,指定生成標籤的屬性,如: attr = {'class': 'c1'} value 字串,用於設定textarea標籤中預設顯示的內容 """ InputRadio """ 設定Form對應欄位在HTML中生成一系列 input type='radio' 標籤(選擇時互斥) 引數: attr 字典,生成的HTML屬性,如:{'class': 'c1'} text_value_list 列表,生成的多個radio標籤的內容和值,如:[ {'value':1, 'text': '男'}, {'value':2, 'text': '女'}, ] checked_value 整數或字串,預設被選中的標籤的value的值 示例: from Tyrion.Forms import Form from Tyrion.Fields import IntegerField from Tyrion.Widget import InputRadio class LoginForm(Form): favor = IntegerField(error={'required': '愛好不能為空'}, widget=InputRadio(attr={'class': 'c1'}, text_value_list=[ {'value': 1, 'text': '男'}, {'value': 2, 'text': '女'}, ], checked_value=2 ) ) 上述favor欄位生成的HTML標籤為: <div> <span> <input class='c1' type="radio" name="gender" value="1"> </span> <span>男</span> </div> <div> <span> <input class='c1' type="radio" name="gender" value="2" checked='checked'> </span> <span>女</span> </div> """ InputSingleCheckBox """ 設定Form對應欄位在HTML中生成 input type='checkbox' 標籤 引數: attr 字典,指定生成標籤的屬性,如: attr = {'class': 'c1'} """ InputMultiCheckBox """ 設定Form對應欄位在HTML中生成一系列 input type='checkbox' 標籤 引數: attr 字典,指定生成標籤的屬性,如: attr = {'class': 'c1'} text_value_list 列表,生成的多個checkbox標籤的內容和值,如:[ {'value':1, 'text': '籃球'}, {'value':2, 'text': '足球'}, {'value':3, 'text': '乒乓球'}, {'value':4, 'text': '羽毛球'}, ] checked_value_list 列表,預設選中的標籤對應的value, 如:[1,3] """ SingleSelect """ 設定Form對應欄位在HTML中生成 單選select 標籤 引數: attr 字典,指定生成標籤的屬性,如: attr = {'class': 'c1'} text_value_list 列表,用於指定select標籤中的option,如:[ {'value':1, 'text': '北京'}, {'value':2, 'text': '上海'}, {'value':3, 'text': '廣州'}, {'value':4, 'text': '重慶'}, ] selected_value 數字或字串,預設被選中選項對應的值,如: 3 """ MultiSelect """ 設定Form對應欄位在HTML中生成 多選select 標籤 引數: attr 字典,指定生成標籤的屬性,如: attr = {'class': 'c1'} text_value_list 列表,用於指定select標籤中的option,如:[ {'value':1, 'text': '籃球'}, {'value':2, 'text': '足球'}, {'value':3, 'text': '乒乓球'}, {'value':4, 'text': '羽毛球'}, ] selected_value_list 列表,預設被選中選項對應的值,如:[2,3,4] """ |
8、動態初始化預設值
由於Form可以用於生成HTML標籤,如果想要在建立標籤的同時再為其設定預設值有兩種方式:
- 靜態,在外掛引數中指定
- 動態,呼叫Form物件的 init_field_value 方法來指定
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
class InitValueForm(Form): username = StringField(error={'required': '使用者名稱不能為空'}) age = IntegerField(max_value=500, min_value=0, error={'required': '年齡不能為空', 'invalid': '年齡必須為數字', 'min_value': '年齡不能小於0', 'max_value': '年齡不能大於500'}) city = IntegerField(error={'required': '年齡不能為空', 'invalid': '年齡必須為數字'}, widget=SingleSelect(text_value_list=[{'value': 1, 'text': '上海'}, {'value': 2, 'text': '北京'}, {'value': 3, 'text': '廣州'}]) ) gender = IntegerField(error={'required': '請選擇性別', 'invalid': '性別必須為數字'}, widget=InputRadio(text_value_list=[{'value': 1, 'text': '男', }, {'value': 2, 'text': '女', }], checked_value=2)) protocol = IntegerField(error={'required': '請選擇協議', 'invalid': '協議格式錯誤'}, widget=InputSingleCheckBox(attr={'value': 1})) favor_int_val = IntegerListField(error={'required': '請選擇愛好', 'invalid': '選擇愛好格式錯誤'}, widget=InputMultiCheckBox(text_value_list=[{'value': 1, 'text': '籃球', }, {'value': 2, 'text': '足球', }, {'value': 3, 'text': '乒乓球', }, {'value': 4, 'text': '羽毛球'}, ])) favor_str_val = StringListField(error={'required': '請選擇愛好', 'invalid': '選擇愛好格式錯誤'}, widget=InputMultiCheckBox(text_value_list=[{'value': '1', 'text': '籃球', }, {'value': '2', 'text': '足球', }, {'value': '3', 'text': '乒乓球', }, {'value': '4', 'text': '羽毛球'}, ])) select_str_val = StringListField(error={'required': '請選擇愛好', 'invalid': '選擇愛好格式錯誤'}, widget=MultiSelect(text_value_list=[{'value': '1', 'text': '籃球', }, {'value': '2', 'text': '足球', }, {'value': '3', 'text': '乒乓球', }, {'value': '4', 'text': '羽毛球'}, ])) select_int_val = IntegerListField(error={'required': '請選擇愛好', 'invalid': '選擇愛好格式錯誤'}, widget=MultiSelect(text_value_list=[{'value': 1, 'text': '籃球', }, {'value': 2, 'text': '足球', }, {'value': 3, 'text': '乒乓球', }, {'value': 4, 'text': '羽毛球'}, ])) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
class InitValueHandler(tornado.web.RequestHandler): def get(self, *args, **kwargs): form = InitValueForm(self) init_dict = { 'username': 'seven', 'age': 18, 'city': 2, 'gender': 2, 'protocol': 1, 'favor_int_val': [1, 3], 'favor_str_val': ['1', '3'], 'select_int_val': [1, 3], 'select_str_val': ['1', '3'] } # 初始化操作,設定Form類中預設值以及預設選項 form.init_field_value(init_dict) self.render('init_value.html', form=form) |
動態初始值 – 處理請求的Handler(Tornado)
9、更多示例
示例原始碼下載:猛擊這裡
a. 基本使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
class RegisterForm(Form): username = StringField(max_length=32, min_length=6, error={'required': '使用者名稱不能為空', 'min_length': '使用者名稱不能少於6位', 'max_length': '使用者名稱不能超過32位'}) password = StringField(max_length=32, min_length=6, error={'required': '密碼不能為空'}, widget=InputPassword()) gender = IntegerField(error={'required': '請選擇性別', 'invalid': '性別必須為數字'}, widget=InputRadio(text_value_list=[{'value': 1, 'text': '男', }, {'value': 2, 'text': '女', }], checked_value=2)) age = IntegerField(max_value=500, min_value=0, error={'required': '年齡不能為空', 'invalid': '年齡必須為數字', 'min_value': '年齡不能小於0', 'max_value': '年齡不能大於500'}) email = EmailField(error={'required': '郵箱不能為空', 'invalid': '郵箱格式錯誤'}) city = IntegerField(error={'required': '城市選項不能為空', 'invalid': '城市選項必須為數字'}, widget=SingleSelect(text_value_list=[{'value': 1, 'text': '上海'}, {'value': 2, 'text': '北京'}, {'value': 3, 'text': '廣州'}]) ) protocol = IntegerField(error={'required': '請選擇協議', 'invalid': '協議格式錯誤'}, widget=InputSingleCheckBox(attr={'value': 1})) memo = StringField(required=False, max_length=150, error={'invalid': '備註格式錯誤', 'max_length': '備註最大長度為150字'}, widget=TextArea()) |
b. 多選checkbox
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
class MultiCheckBoxForm(Form): favor_str_val = StringListField(error={'required': '請選擇愛好', 'invalid': '選擇愛好格式錯誤'}, widget=InputMultiCheckBox(text_value_list=[{'value': '1', 'text': '籃球', }, {'value': '2', 'text': '足球', }, {'value': '3', 'text': '乒乓球', }, {'value': '4', 'text': '羽毛球'}, ])) favor_str_val_default = StringListField(error={'required': '請選擇愛好', 'invalid': '選擇愛好格式錯誤'}, widget=InputMultiCheckBox(text_value_list=[{'value': '1', 'text': '籃球', }, {'value': '2', 'text': '足球', }, {'value': '3', 'text': '乒乓球', }, {'value': '4', 'text': '羽毛球'}, ], checked_value_list=['1', '4'])) favor_int_val = IntegerListField(error={'required': '請選擇愛好', 'invalid': '選擇愛好格式錯誤'}, widget=InputMultiCheckBox(text_value_list=[{'value': 1, 'text': '籃球', }, {'value': 2, 'text': '足球', }, {'value': 3, 'text': '乒乓球', }, {'value': 4, 'text': '羽毛球'}, ])) favor_int_val_default = IntegerListField(error={'required': '請選擇愛好', 'invalid': '選擇愛好格式錯誤'}, widget=InputMultiCheckBox(text_value_list=[{'value': 1, 'text': '籃球', }, {'value': 2, 'text': '足球', }, {'value': 3, 'text': '乒乓球', }, {'value': 4, 'text': '羽毛球'}, ], checked_value_list=[2, ])) |
c、多選select
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
class MultiSelectForm(Form): select_str_val = StringListField(error={'required': '請選擇愛好', 'invalid': '選擇愛好格式錯誤'}, widget=MultiSelect(text_value_list=[{'value': '1', 'text': '籃球', }, {'value': '2', 'text': '足球', }, {'value': '3', 'text': '乒乓球', }, {'value': '4', 'text': '羽毛球'}, ])) select_str_val_default = StringListField(error={'required': '請選擇愛好', 'invalid': '選擇愛好格式錯誤'}, widget=MultiSelect(text_value_list=[{'value': '1', 'text': '籃球', }, {'value': '2', 'text': '足球', }, {'value': '3', 'text': '乒乓球', }, {'value': '4', 'text': '羽毛球'}, ], selected_value_list=['1', '3'])) select_int_val = IntegerListField(error={'required': '請選擇愛好', 'invalid': '選擇愛好格式錯誤'}, widget=MultiSelect(text_value_list=[{'value': 1, 'text': '籃球', }, {'value': 2, 'text': '足球', }, {'value': 3, 'text': '乒乓球', }, {'value': 4, 'text': '羽毛球'}, ])) select_int_val_default = IntegerListField(error={'required': '請選擇愛好', 'invalid': '選擇愛好格式錯誤'}, widget=MultiSelect(text_value_list=[{'value': 1, 'text': '籃球', }, {'value': 2, 'text': '足球', }, {'value': 3, 'text': '乒乓球', }, {'value': 4, 'text': '羽毛球'}, ], selected_value_list=[2])) |
d. 動態select選項
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
class DynamicSelectForm(Form): city = IntegerField(error={'required': '年齡不能為空', 'invalid': '年齡必須為數字'}, widget=SingleSelect(text_value_list=[{'value': 1, 'text': '上海'}, {'value': 2, 'text': '北京'}, {'value': 3, 'text': '廣州'}]) ) multi_favor = IntegerListField(error={'required': '請選擇愛好', 'invalid': '選擇愛好格式錯誤'}, widget=MultiSelect(text_value_list=[{'value': 1, 'text': '籃球', }, {'value': 2, 'text': '足球', }, {'value': 3, 'text': '乒乓球', }, {'value': 4, 'text': '羽毛球'}, ])) def __init__(self, *args, **kwargs): super(DynamicSelectForm, self).__init__(*args, **kwargs) # 獲取資料庫中的最新資料並顯示在頁面上(每次建立物件都執行一次資料庫操作來獲取最新資料) self.city.widget.text_value_list = [{'value': 1, 'text': '上海'}, {'value': 2, 'text': '北京'}, {'value': 3, 'text': '南京'}, {'value': 4, 'text': '廣州'}] self.multi_favor.widget.text_value_list = [{'value': 1, 'text': '籃球'}, {'value': 2, 'text': '足球'}, {'value': 3, 'text': '乒乓球'}, {'value': 4, 'text': '羽毛球'}, {'value': 5, 'text': '玻璃球'}] |
寫在最後
開源元件持續更新中,如您在使用過程中遇到任何問題,請留言,我將盡快回復!!!
- Tyrion技術交流QQ群:564068039
- Tyrion技術交流QQ群:564068039
- Tyrion技術交流QQ群:564068039