一.注册用户
RegisterForm
class RegisterForm(FlaskForm):
name = StringField(label=u'账号',
validators=[DataRequired(u'账号不能为空')],
description=u'账号',
render_kw={
'class': 'form-control',
'placeholder': u'请输入账号'
})
pwd = PasswordField(label=u'密码',
validators=[DataRequired(u'不能为空'),EqualTo('repwd',u'两次密码不一致')],
description=u'密码',
render_kw={
'class': 'form-control',
'placeholder': u'请输入密码'
})
repwd = PasswordField(label='确认密码',
validators=[DataRequired('不能为空')],
description=u'确认密码',
render_kw={
'class': 'form-control',
'placeholder': u'请输入确认密码'
})
code = StringField(label=u'验证码',
validators=[DataRequired(u'验证码不能为空')],
description=u'验证码',
render_kw={
'class': 'form-control',
'placeholder': u'请输入验证码'
})
submit = SubmitField(
u'注册',
render_kw={
'class': 'btn btn-success'
}
)
定义Model
class User(db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer, autoincrement=True,primary_key=True)
name = db.Column(db.String(20), nullable=False)
pwd = db.Column(db.String(100), nullable=False)
addtime = db.Column(db.DATETIME, nullable=False)
def __repr__(self):
return '<User %r>' % self.name
注册路由
@app.route('/register/', methods=['GET', 'POST'])
def register():
form=RegisterForm()
if form.validate_on_submit():
data=form.data
user=User(
name=data['name'],
pwd=generate_password_hash(data['pwd']),
addtime=datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
)
db.session.add(user)
db.session.commit()
#定义一个会话闪现
flash(u'注册成功,请登录!!')
return redirect('/login/')
else:
flash(u'请输入正确信息')
return render_template('register.html', title=u'注册',form=form)
register.html
{% extends 'user.html' %}
{% block content %}
<form method="post">
{% for msg in get_flashed_messages(category_filter=['ok']) %}
<p style="color: #ff0000">{{ msg }}</p>
{% endfor %}
<div class="form-group">
<label>账号</label>
{# <input type="text" class="form-control" placeholder="请输入账号">#}
{{ form.name }}
{% for v in form.name.errors %}
<p style="color: red">{{ v }}</p>
{% endfor %}
</div>
<div class="form-group">
<label>密码</label>
{# <input type="password" class="form-control" placeholder="请输入密码">#}
{{ form.pwd }}
{% for v in form.pwd.errors %}
<p style="color: red">{{ v }}</p>
{% endfor %}
</div>
<div class="form-group">
<label>确认密码</label>
{# <input type="password" class="form-control" placeholder="请确认输入密码">#}
{{ form.repwd }}
{% for v in form.repwd.errors %}
<p style="color: red">{{ v }}</p>
{% endfor %}
</div>
<div class="form-group">
<label>验证码</label>
{# <input type="text" class="form-control" placeholder="请输入验证码">#}
{{ form.code }}
{% for v in form.code.errors %}
<p style="color: red">{{ v }}</p>
{% endfor %}
{# <img data-src="holder.js/180x50" style="margin-top: 6px">#}
<img src="/captcha/" style="width: 180px;height: 50px;margin-top: 6px">
</div>
<a href="/login/">没有账号,现在注册</a>
<br>
{# <a class="btn btn-primary" href="/login/">登录</a>#}
{{ form.submit }}
{{ form.csrf_token }}
</form>
{% endblock %}
{% block js %}
<script src="https://cdn.bootcss.com/holder/2.9.4/holder.js"></script>
{% endblock %}
二.登录用户
LoginForm
class LoginForm(FlaskForm):
name = StringField(label=u'账号',
validators=[DataRequired(u'不能为空')],
description=u'账号',
render_kw={
'class': 'form-control',
'placeholder': u'请输入账号'
})
pwd = PasswordField(label='密码',
validators=[DataRequired(u'不能为空')],
description=u'密码',
render_kw={
'class': 'form-control',
'placeholder': u'请输入密码'
})
submit = SubmitField(
u'登录',
render_kw={
'class': 'btn btn-primary'
}
)
# 验证密码
def validate_pwd(self, field):
pwd = field.data
user = User.query.filter_by(name=self.name.data).first()
if not user.check_pwd(pwd):
raise ValidationError(u'密码不正确')
Model中添加check_password_hash()
def check_pwd(self, pwd):
return check_password_hash(self.pwd, pwd)
登录路由
# 登录
@app.route('/login/', methods=['GET', 'POST'])
def login():
form=LoginForm()
if form.validate_on_submit():
session['name']=form.data['name']
flash('登录成功','ok')
return redirect('/art/list/')
return render_template('login.html', title=u'登录',form=form) # 渲染模板
login.html
{% extends 'user.html' %}
{% block content %}
<form METHOD="post">
<div class="form-group">
<label>账号</label>
{# <input type="text" class="form-control" placeholder="请输入账号">#}
{{ form.name }}
{% for error in form.name.errors %}
<p style="color:red">{{ error }}</p>
{% endfor %}
</div>
<div class="form-group">
<label>密码</label>
{# <input type="password" class="form-control" placeholder="请输入密码">#}
{{ form.pwd }}
{% for error in form.pwd.errors %}
<p style="color:red">{{ error }}</p>
{% endfor %}
</div>
<a href="/register/">没有账号,现在注册</a>
<br>
{# <a class="btn btn-primary" href="/art/list/">登录</a>#}
{{ form.submit }}
{{ form.csrf_token }}
</form>
{% endblock %}
三,退出
# 退出(302重定向)
@app.route('/logout/', methods=['GET'])
def logout():
session.pop("user", None)
return redirect(url_for('login'))