目录
[1. 注册页面的渲染](#1. 注册页面的渲染)
1. 注册页面的渲染

使用render_template来渲染,注意这里的前端网页使用jinja2模板

详情大家可以参考jinja2介绍
注意每个网页上方都有导航条,大家可以使用jinja2的继承功能,写一个base.html,其他网页都可以继承这个网页,在其上面扩展
2.邮箱的注册验证
使用falsk-mail库完成
制作一个邮箱服务器,我们这里使用QQ邮箱
在config.py中完成配置即可

再创建一个邮箱的模板,进行数据库交互

验证前端输入的邮箱密码是否输入正确,增加一个forms.py
python
import wtforms
from wtforms.validators import Email, Length, EqualTo, InputRequired
from exts import db
from models import UserModel, EmailCaptchaModel
# Form :主要验证用来验证前端提交的数据是否符合要求
class RegisterForm(wtforms.Form):
email = wtforms.StringField(validators=[Email(message="邮箱格式错误!")])
captcha = wtforms.StringField(validators=[Length(max=4, min=4, message="验证码格式错误")])
username = wtforms.StringField(validators=[Length(min=3, max=20, message="用户格式错误")])
password = wtforms.StringField(validators=[Length(min=6, max=20, message="密码格式错误")])
password_confirm = wtforms.StringField(validators=[EqualTo("password", message="两次密码不一致")])
# 自定义验证
# 1、 邮箱是否被注册
def validate_email(self, field):
email = field.data
user = UserModel.query.filter_by(email=email).first()
if user:
raise wtforms.ValidationError(message="该邮箱已经被注册!")
# 2、 验证码是否正确
def validate_captcha(self, field):
captcha = field.data
email = self.email.data
filters = {'email': email, 'captcha': captcha}
captcha_model = EmailCaptchaModel.query.filter_by(**filters).first()
# print(email,captcha,captcha_model.email)
if not captcha_model:
raise wtforms.ValidationError(message="邮箱或者验证码错误")
# tode 可以删除 captcha_model
else:
# 使用完毕可以删除 或者 定义是否使用 # False是0,true是1
# db.session.delete(captcha_model)
# db.session.commit()
captcha_model.used = 1
db.session.commit()
class LoginForm(wtforms.Form):
email = wtforms.StringField(validators=[Email(message="邮箱格式错误!")])
password = wtforms.StringField(validators=[Length(min=6, max=20, message="密码格式错误")])
class QuestionForm(wtforms.Form):
title = wtforms.StringField(validators=[Length(max=100, min=4, message="标题格式错误")])
content = wtforms.StringField(validators=[Length(min=6, message="内容格式错误")])
class AnswerForm(wtforms.Form):
content = wtforms.StringField(validators=[Length(min=4, message="内容格式错误")])
question_id = wtforms.IntegerField(validators=[InputRequired(message="必须要传入问题id")])

获取从前端输入的邮箱密码
python
# GET :从服务获取数据
# POSt :将客户端的数据提交个服务器
@bp.route("/register", methods=["POST", "GET"])
def register():
if request.method == "GET":
if g is None:
return redirect("/")
log.info("Registering")
return render_template("register.html")
else:
# Post 去请求
# 验证用户提交邮箱和验证是否正确
# 表单验证:flask-wtf
form = RegisterForm(request.form)
if form.validate():
username = form.username.data
password = form.password.data
email = form.email.data
user = UserModel(email=email, username=username, password=generate_password_hash(password))
db.session.add(user)
db.session.commit()
log.info(f"用户: {username} 邮箱地址: {password} 已经注册成功")
return redirect(url_for("auth.login"))
else:
print(form.errors)
log.info(f"用户注册验证不通过,即将返回注册页面")
return redirect(url_for("auth.register"))
3.登录页面的渲染
python
@bp.route("/login", methods=["POST", "GET"])
def login():
if request.method == "GET":
if g is None:
return redirect("/")
return render_template("login.html")
else:
form = LoginForm(request.form)
if form.validate():
email = form.email.data
password = form.password.data
user = UserModel.query.filter_by(email=email).first()
if not user:
return jsonify({'code': 200, 'message': '用户不存在'})
if check_password_hash(user.password, password):
# return jsonify({'code': 200, 'message': '用户登录成功'})
# cookie 不适合存储太多数据,只适合存储少量的数据
# seesion
session["user_id"] = user.id
flash(f"用户:{user.username} 登录成功")
return redirect("/")
else:
return redirect(url_for("auth.login"))
else:
log.error(form.errors)
return redirect(url_for("auth.login"))