Flask 實現用戶注冊/登錄表單


Flask是一個使用 Python 編寫的輕量級 Web 應用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎則使用 Jinja2

Flask 框架實現的一個用戶注冊與登錄頁面,經過美化的頁面,可以直接應用到項目中。

實現用戶注冊

1.在flask目錄的static下新建sytle.css文件。

body {
    display: flex;
    align-items: center;
    justify-content: center;
    text-align: -webkit-center;
    line-height: 0.5;
    background: aliceblue;
}
.form-bg{
    background: #00b4ef;
}
.form-horizontal{
    background: #fff;
    padding-bottom: 10px;
    border-radius: 15px;
    text-align: center;
}
.form-horizontal .heading{
    display: block;
    font-size: 35px;
    font-weight: 700;
    padding: 35px 0;
    border-bottom: 1px solid #f0f0f0;
    margin-bottom: 30px;
}
.form-horizontal .form-group{
    padding: 0 40px;
    margin: 0 0 25px 0;
    position: relative;
}
.form-horizontal .form-control{
    background: #f0f0f0;
    border: none;
    border-radius: 20px;
    box-shadow: none;
    padding: 0 20px 0 45px;
    height: 40px;
    transition: all 0.3s ease 0s;
}
.form-horizontal .form-control:focus{
    background: #e0e0e0;
    box-shadow: none;
    outline: 0 none;
}
.form-horizontal .form-group i{
    position: absolute;
    top: 12px;
    left: 60px;
    font-size: 17px;
    color: #c8c8c8;
    transition : all 0.5s ease 0s;
}
.form-horizontal .form-control:focus + i{
    color: #00b4ef;
}
.form-horizontal .fa-question-circle{
    display: inline-block;
    position: absolute;
    top: 12px;
    right: 60px;
    font-size: 20px;
    color: #808080;
    transition: all 0.5s ease 0s;
}
.form-horizontal .fa-question-circle:hover{
    color: #000;
}
.form-horizontal .text{
    float: left;
    margin-left: 7px;
    line-height: 20px;
    padding-top: 5px;
    text-transform: capitalize;
}
.form-horizontal .btn{
    font-size: 14px;
    color: #fff;
    border-radius: 100px;
    padding: 10px 70px;
    border: none;
    text-transform: capitalize;
    transition: all 0.5s ease 0s;
}
@media only screen and (max-width: 479px){
    .form-horizontal .form-group{
        padding: 0 25px;
    }
    .form-horizontal .form-group i{
        left: 45px;
    }
    .form-horizontal .btn{
        padding: 10px 20px;
    }
}

2.在templates目錄下新建一個 register.html

<html>
<head>
    <link rel='stylesheet' href='https://stackpath.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css'>
    <link href="http://cdn.bootcss.com/font-awesome/4.6.3/css/font-awesome.min.css" rel="stylesheet">
    <link href="/static/style.css" rel="stylesheet" type="text/css" />
</head>
<body>
    <div class="container">
        <div class="row">
            <div class="col-md-offset-3 col-md-6">
                <form action="/register" method="post" class="form-horizontal">
                    <span class="heading">用 戶 注 冊</span>
                    <div class="form-group">
                        {{ form.username }}
                        <i class="fa fa-user"></i>
                        <a href="/login" class="fa fa-question-circle"></a>
                    </div>
                    <div class="form-group">
                        {{ form.email }}
                        <i class="fa fa-envelope"></i>
                    </div>
                    <div class="form-group">
                        {{ form.password }}
                        <i class="fa fa-lock"></i>
                    </div>
                    <div class="form-group">
                        {{ form.RepeatPassword }}
                        <i class="fa fa-unlock-alt"></i>
                    </div>
                    {{ form.submit }}
                </form>
            </div>
        </div>
    </div>
</body>
</html>

3.在app.py里面寫入。

from flask import Flask, render_template, request, redirect
from wtforms import Form,validators,widgets
from wtforms.fields import simple,html5

app = Flask(__name__, template_folder="templates")
class RegisterForm(Form):
    username = 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',
                   "placeholder":"輸入注冊用戶名"}
    )
    email = simple.StringField(
        #label='用戶郵箱:',
        validators=[validators.DataRequired(message='郵箱不能為空'),validators.Email(message="郵箱格式輸入有誤")],
        render_kw={'class':'form-control',
                   "placeholder":"輸入Email郵箱"}
    )
    password = simple.PasswordField(
        #label='用戶密碼:',
        validators=[
            validators.DataRequired(message='密碼不能為空'),
            validators.Length(min=5, message='用戶名長度必須大於%(min)d'),
            validators.Regexp(regex="[0-9a-zA-Z]{5,}",message='密碼不允許使用特殊字符')
        ],
        widget=widgets.PasswordInput(),
        render_kw={'class': 'form-control',
                   "placeholder":"輸入用戶密碼"}
    )
    RepeatPassword = simple.PasswordField(
        #label='重復密碼:',
        validators=[
            validators.DataRequired(message='密碼不能為空'),
            validators.Length(min=5, message='密碼長度必須大於%(min)d'),
            validators.Regexp(regex="[0-9a-zA-Z]{5,}",message='密碼不允許使用特殊字符'),
            validators.EqualTo("password",message="兩次密碼輸入必須一致,龜孫")
        ],
        widget=widgets.PasswordInput(),
        render_kw={'class': 'form-control',
                   "placeholder":"再次輸入密碼"}
    )
    submit = simple.SubmitField(
        label="用 戶 注 冊",
        render_kw={ "class":"btn btn-success" }
    )

@app.route('/register', methods=['GET', 'POST'])
def Register():
    if request.method == 'GET':
        RetForm = RegisterForm()
        return render_template('register.html', form=RetForm)
    else:
        RetForm = RegisterForm(formdata=request.form)
        if RetForm.validate():
            print('接收到數據:', RetForm.data)
            return '''<script>alert('您的注冊請求已提交!');</script>'''
        else:
            print(RetForm.errors)
        return render_template('register.html', form=RetForm)

if __name__ == '__main__':
    app.run()

效果如下。

實現用戶登錄

login.html

<html>
<head>
    <link rel='stylesheet' href='https://stackpath.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css'>
    <link href="http://cdn.bootcss.com/font-awesome/4.6.3/css/font-awesome.min.css" rel="stylesheet">
    <link href="/static/style.css" rel="stylesheet" type="text/css" />
</head>
    <body>
        <div class="container">
            <div class="row">
                <div class="col-md-offset-3 col-md-6">
                    <form action="/login" method="post" class="form-horizontal">
                        <span class="heading">用 戶 登 錄</span>
                        <div class="form-group">
                            {{ form.username }}
                            <i class="fa fa-user"></i>
                        </div>
                        <div class="form-group help">
                            {{ form.password }}
                            <i class="fa fa-lock"></i>
                            <a href="#" class="fa fa-question-circle"></a>
                        </div>
                        <div class="form-group">
                            <button type="submit" class="btn btn-success">登 錄 后 台</button>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </body>
</html>

app.py

from flask import Flask, render_template, request, redirect
from wtforms import Form,validators,widgets
from wtforms.fields import simple,html5

app = Flask(__name__, template_folder="templates")

class LoginForm(Form):
    username = simple.StringField(
        validators=[
            validators.DataRequired(message=''),
            validators.Length(min=4, max=15, message=''),
            validators.Regexp(regex="[0-9a-zA-Z]{4,15}", message='')
        ],
        widget=widgets.TextInput(),
        render_kw={"class":"form-control",
                   "placeholder":"請輸入用戶名或電子郵件"}
    )
    password = simple.PasswordField(
        validators=[
            validators.DataRequired(message=''),
            validators.Length(min=5, max=15,message=''),
            validators.Regexp(regex="[0-9a-zA-Z]{5,15}",message='')
        ],
        widget=widgets.PasswordInput(),
        render_kw={"class":"form-control",
                   "placeholder":"請輸入密碼"}
    )

@app.route("/login",methods=['GET','POST'])
def Login():
    if request.method == 'GET':
        RetForm = LoginForm()
        return render_template('login.html', form=RetForm)
    else:
        RetForm = LoginForm(formdata=request.form)
        if RetForm.validate():
            temp = RetForm.data
            print("接收到數據:",temp)
            return '''<script type="text/javascript">alert('登錄完成!');</script>'''
        return render_template('login.html', form=RetForm)

if __name__ == '__main__':
    app.run()

其他wtforms常用標簽

submit.html

<!--name:index.html-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
    <title>頁面選擇</title>
</head>
<body>
<form method="post">
    <p>{{ form.gender.label }} {{form.gender}} {{form.gender.errors[0] }}</p>
    <p>{{ form.city.label }} {{form.city}} {{form.city.errors[0] }} </p>
    <p>{{ form.hobby.label }} {{form.hobby}} {{form.hobby.errors[0] }}</p>
    <p>{{ form.favor.label }} {{form.favor}} {{form.favor.errors[0] }}</p>
    <input type="submit" value="提交表格">
</form>
</body>
</html>

app.py

# name:app.py
from flask import Flask, render_template, request, redirect
from wtforms import Form,validators,widgets
from wtforms.fields import simple,html5,core

app = Flask(__name__,template_folder="templates")

class RegisterForm(Form):
    gender = core.RadioField(
        label="性別:",choices=((0,"男"),(1,"女"),(0,"兩面派")),coerce=int  #限制是int類型的
    )
    city = core.SelectField(
        label="選擇城市:",
        choices=(
            ("shandong","山東省"),("shanghai","上海市"),
            ("beijingshi","北京市"),("neimenggu","內蒙古")
        ),
        render_kw={'class': 'btn btn-primary dropdown-toggle'}
    )
    hobby = core.SelectMultipleField(
        label='愛好:',
        choices=((1, '唱'),(2, '跳'),(3,'rap'),(4,'籃球')),
        coerce=int,
        render_kw = {'class': 'form-control'}
    )
    favor = core.SelectMultipleField(
        label="特長:",
        choices=((1, 'Python把妹'),(2, '滲透把妹'),(3,"運維把妹"),(4,"科學把妹")),
        widget = widgets.ListWidget(prefix_label=False),
        option_widget = widgets.CheckboxInput(),
        coerce = int, default = [1, 2 , 4],
    )

@app.route('/submit',methods=["GET","POST"])
def submit():
    if request.method=="GET":
        form = RegisterForm(data={'gender': 1}) # 指定性別的默認值是1
        return render_template("submit.html",form=form)
    else:
        form = RegisterForm(formdata=request.form)
        if form.validate():
            print('提交的值為:', form.data)
            return '''<script type="text/javascript">alert('您的請求已提交!');</script>'''
        else:
            print("提交數據錯誤..")
        return render_template('submit.html', form=form)

if __name__ == '__main__':
    app.run()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM