from flask import Flask, render_template, request, redirect# Form# _fields# validate# validata_name# validata_pwdfrom wtforms import Form# 字段(經過正則進行校驗;插件生成HTML標籤)# - 插件對象# - post_validate# - __call__# - __str__from wtforms.fields import corefrom wtforms.fields import html5from wtforms.fields import simple# 插件# __call__返回:<input />from wtforms import widgetsfrom wtforms import validatorsapp = Flask(__name__, template_folder='templates')app.debug = True"""LoginForm._unbound_fields = NoneLoginForm._wtforms_meta = None"""class LoginForm(Form): # name = UnboundField(StringField, *args, **kwargs) creation_counter=1 name = simple.StringField( label='用戶名', validators=[ validators.DataRequired(message='用戶名不能爲空.'), validators.Length(min=6, max=18, message='用戶名長度必須大於%(min)d且小於%(max)d') ], widget=widgets.TextInput(), render_kw={'class': 'form-control'} ) # pwd = UnboundField(PasswordField, *args, **kwargs) creation_counter=2 pwd = simple.PasswordField( label='密碼', validators=[ validators.DataRequired(message='密碼不能爲空.'), validators.Length(min=8, message='用戶名長度必須大於%(min)d'), validators.Regexp(regex="^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$@$!%*?&])[A-Za-z\d$@$!%*?&]{8,}", message='密碼至少8個字符,至少1個大寫字母,1個小寫字母,1個數字和1個特殊字符') ], widget=widgets.PasswordInput(), render_kw={'class': 'form-control'} ) class Meta: csrf = False def validate_pwd(self,*args,**kwargs): pass# 解釋到這裏...@app.route('/login', methods=['GET', 'POST'])def login(): if request.method == 'GET': # type.__call__ # LoginForm._unbound_fields 已經有值(全部字段) [(name,_unbound_fields()),(name,_unbound_fields()),] # LoginForm._wtforms_meta = 類(Meta)(全部的Meta) # LoginForm._wtforms_meta = type('Meta', tuple(bases), {}) # LoginForm.__new__ # LoginForm.__init__ # 示例化Meta: meta_obj{name = 'alex','xx':'xxx'} # self._fields = { # name = StringField() # pwd = PasswordField() # } # self.name = StringField() # self.pwd = PasswordField() # class User: # def __init__(self,name): # self.name = name # obj = User('alex') # form = LoginForm(data={'name':'alex'}) # form = LoginForm(obj=obj) # # form = LoginForm(formdata=request.args) # 頁面標籤數據初始化:data=字典, obj=對象.字段 formdata=有getlist方法 form = LoginForm() # print(form.name) return render_template('login.html', form=form) else: form = LoginForm(formdata=request.form) if form.validate(): print('用戶提交數據經過格式驗證,提交的值爲:', form.data) else: print(form.errors) return render_template('login.html', form=form)def test(): form = LoginForm()if __name__ == '__main__': app.run()