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()

