1. 程式人生 > >Flask學習【第10篇】:自定義Form元件 自定義Form元件

Flask學習【第10篇】:自定義Form元件 自定義Form元件

自定義Form元件

一、wtforms原始碼流程

1、例項化流程分析

View Code

2、驗證流程分析

View Code

二、自定義Form元件

複製程式碼
#!usr/bin/env python
# -*- coding:utf-8 -*-
from flask import Flask,render_template,request,Markup
app = Flask(__name__,template_folder="templates")
app.debug = True
# ==============通過這幾個類就可以顯示了-==============
#外掛
class Widget(object):
    pass

class InputText(Widget):
    def __call__(self, *args, **kwargs): return "<input type='text' name='name'>" class TextArea(Widget): def __call__(self, *args, **kwargs): return Markup("<textarea name='email'></textarea>") #Form class BaseForm(object): def __init__(self): #獲取當前所有的欄位 _fields = {} for name, field in self.__class__.__dict__.items(): if isinstance(field, Field): # 篩選出欄位是name和emailDe _fields[name] = field self._fields = _fields self.data = {} # print(_fields) # {'name': 111, 'email': 222} def validate(self,request_data): #先找到所有的欄位,在執行每一個欄位的validate方法 flag = True for name, field in self._fields.items(): input_val = request_data.get(name,"") #使用者輸入的值 result= field.validate(input_val) #每一個欄位自己校驗 print("???????????",input_val,result) if not result: flag = False else: self.data[name] = input_val return flag #欄位 class Field(object): '''所有類的基類''' def __str__(self): #python中的靜態欄位通過類能找到,通過物件也能找到 return Markup(self.widget()) #self就是StringField,self class StringField(Field): #每個欄位列印的時候都要去執行__str__,所以選擇放在基類裡面,自己沒有就呼叫父類的 widget = InputText() def validate(self,val): if val: return True class EmaliField(Field): widget = TextArea() reg = ".*@.*" def validate(self,val): import re print(re.match(self.reg,val),"************") if re.match(self.reg,val): return True # ===============使用=============== class LoginForm(BaseForm): name = StringField() email = EmaliField() @app.route('/index', methods=["GET","POST"]) def index(): form = LoginForm() ret = form.validate(request.form) print("驗證成功",ret) print("驗證成功的值",form.data) # print(form.name) # print(form.email) return render_template("index.html",form=form) if __name__ == '__main__': app.run()
複製程式碼

 

一、wtforms原始碼流程

1、例項化流程分析

View Code

2、驗證流程分析

View Code

二、自定義Form元件

複製程式碼
#!usr/bin/env python
# -*- coding:utf-8 -*-
from flask import Flask,render_template,request,Markup
app = Flask(__name__,template_folder="templates")
app.debug = True
# ==============通過這幾個類就可以顯示了-==============
#外掛
class Widget(object):
    pass

class InputText(Widget):
    def __call__(self, *args, **kwargs): return "<input type='text' name='name'>" class TextArea(Widget): def __call__(self, *args, **kwargs): return Markup("<textarea name='email'></textarea>") #Form class BaseForm(object): def __init__(self): #獲取當前所有的欄位 _fields = {} for name, field in self.__class__.__dict__.items(): if isinstance(field, Field): # 篩選出欄位是name和emailDe _fields[name] = field self._fields = _fields self.data = {} # print(_fields) # {'name': 111, 'email': 222} def validate(self,request_data): #先找到所有的欄位,在執行每一個欄位的validate方法 flag = True for name, field in self._fields.items(): input_val = request_data.get(name,"") #使用者輸入的值 result= field.validate(input_val) #每一個欄位自己校驗 print("???????????",input_val,result) if not result: flag = False else: self.data[name] = input_val return flag #欄位 class Field(object): '''所有類的基類''' def __str__(self): #python中的靜態欄位通過類能找到,通過物件也能找到 return Markup(self.widget()) #self就是StringField,self class StringField(Field): #每個欄位列印的時候都要去執行__str__,所以選擇放在基類裡面,自己沒有就呼叫父類的 widget = InputText() def validate(self,val): if val: return True class EmaliField(Field): widget = TextArea() reg = ".*@.*" def validate(self,val): import re print(re.match(self.reg,val),"************") if re.match(self.reg,val): return True # ===============使用=============== class LoginForm(BaseForm): name = StringField() email = EmaliField() @app.route('/index', methods=["GET","POST"]) def index(): form = LoginForm() ret = form.validate(request.form) print("驗證成功",ret) print("驗證成功的值",form.data) # print(form.name) # print(form.email) return render_template("index.html",form=form) if __name__ == '__main__': app.run()
複製程式碼