wtforms

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'}
    )
LoginForm
@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,)
Views
<!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>
login.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("該用戶名已經被註冊")
RegisterForm
@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)
Views
<!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>
regist.html

http://www.javashuo.com/article/p-gfrkanzs-ev.htmlweb

相關文章
相關標籤/搜索