WTForms是一個支持多個web框架的form組件,主要用於對用戶請求數據進行驗證。html
下載html5
pip3 install wtforms
下面以一個登陸和註冊的示例來講明mysql
登陸
from wtforms.fields import simple from wtforms.fields import core from wtforms.fields import html5 from wtforms import widgets from wtforms import validators from wtforms import Form from .dbpool import POOL class LoginForm(Form): #首先執行後獲得的結果是UnboundField()對象 name=simple.StringField( label='用戶名', validators=[ validators.DataRequired(message='用戶名不能爲空'), ], widget=widgets.TextInput(), render_kw={'class': 'form-control'} ) pwd=simple.StringField( label='密碼', validators=[ validators.DataRequired(message='密碼不能爲空'), ], widget=widgets.TextInput(), render_kw={'class': 'form-control'} )
@user.route('/login',methods=['GET','POST']) def login(): if request.method=='GET': form=LoginForm() print(form) return render_template('login.html',form=form) else: form=LoginForm(request.form) if form.validate(): #數據庫鏈接池建立連接 conn=POOL.connection() cursor=conn.cursor(cursor=pymysql.cursors.DictCursor) sql='select * from userinfo where username=%s and pwd=%s ' print(form.data) username=form.data.get('name') pwd=form.data.get('pwd') cursor.execute(sql,[username,pwd]) user=cursor.fetchone() cursor.close() conn.close() if user: session['user']=user login_log.send() return render_template('index.html',user=user) return render_template('login.html',form=form,msg='用戶名或密碼錯誤') return render_template('login.html',form=form,)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Title</title> </head> <body> <h1>用戶登陸</h1> <form method="post"> <p>{{ form.name.label }}{{ form.name }}{{ form.name.errors[0] }}</p> <p>{{ form.pwd.label }}{{ form.pwd }}{{ form.pwd.errors[0] }}</p> <input type="submit" value="提交"> {{ msg }} </form> </body> </html>
註冊:
class RegisterForm(Form): name=simple.StringField( label='用戶名', validators=[ validators.DataRequired('用戶名不能爲空'), validators.Length(max=8,min=2,message='用戶名長度在%(min)d-%(max)d之間') ], widget=widgets.TextInput(), render_kw={'class': 'form-control'}, ) pwd=simple.StringField( label='密碼', validators=[ validators.DataRequired(message='密碼不能爲空'), validators.Length(max=8,min=5,message='密碼長度必須在%(min)d-%(max)d之間'), # validators.Regexp("^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$@$!%*?&])[A-Za-z\d$@$!%*?&]{8,}", # message='密碼至少8個字符,至少1個大寫字母,1個小寫字母,1個數字和1個特殊字符'), ], widget=widgets.TextInput(), render_kw={'class': 'form-control'} ) pwd_confirm=simple.StringField( label='請再次輸入密碼', validators=[ validators.DataRequired(message='不能爲空'), validators.EqualTo('pwd',message='兩次輸入的密碼不一致') ], widget=widgets.TextInput(), render_kw={'class': 'form-control'} ) email=html5.EmailField( label='郵箱', validators=[ validators.DataRequired(message='郵箱不能爲空'), validators.Email(message='郵箱格式不正確') ], widget=widgets.TextInput(), render_kw={"class":"form-control"} ) gender=core.RadioField( choices=( (1,'男'), (2,'女') ), coerce=int ) city=core.SelectField( choices=( ('km','昆明'), ('bj','北京'), ('cd','成都') ) ) hobby=core.SelectMultipleField( choices='', widget=widgets.ListWidget(prefix_label=False), option_widget=widgets.CheckboxInput(), coerce = int, default = [1, 2] ) def __init__(self,*args,**kwargs): super(RegisterForm, self).__init__(*args,**kwargs) self.hobby.choices=((1, '籃球'), (2, '足球'), (3, '羽毛球')) def validate_pwd_confirm(self,field): if field.data != self.data['pwd']: # raise validators.ValidationError("密碼不一致")#繼續後續驗證 raise validators.StopValidation("密碼不一致") #再也不繼續後續驗證 def validate_name(self,field): conn=POOL.connection() cursor=conn.cursor() sql='select * from userinfo where username=%s' cursor.execute(sql,[field.data]) user=cursor.fetchone() if user: raise validators.StopValidation("該用戶名已經被註冊")
@user.route('/regist',methods=['GET','POST']) def register(): if request.method=='GET': form=RegisterForm() return render_template('register.html',form=form) else: form=RegisterForm(request.form) if form.validate(): print(form.data) name=form.data.get('name') pwd=form.data.get('pwd') email=form.data.get('email') gender=form.data.get('gender') city=form.data.get('city') hobbys=form.data.get('hobby') conn=POOL.connection() cursor=conn.cursor(cursor=pymysql.cursors.DictCursor) sql="insert into userinfo(username,pwd,email,gender,city)VALUES(%s,%s,%s,%s,%s)" cursor.execute(sql,[name,pwd,email,gender,city]) conn.commit() cursor.close() conn.close() return redirect('/login') return render_template('register.html', form=form)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Title</title> </head> <body> <form method="post"> {% for foo in form %} <p>{{foo.label }} {{foo}}{{ foo.errors[0] }}</p> {% endfor %} <input type="submit"> </form> </body> </html>