项目准备(flask+pyhon+MachineLearning)- 2

目录

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

2.邮箱的注册验证

3.登录页面的渲染

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"))
相关推荐
德育处主任7 分钟前
在亚马逊云上,如何基于 VPC IPAM 的 ALB 公网 IP 预测分配?
后端
ahead~15 分钟前
【大模型入门】访问GPT_API实战案例
人工智能·python·gpt·大语言模型llm
不吃肉的羊18 分钟前
PHP设置文件上传最大值
后端·php
专注物联网全栈开发21 分钟前
ESP32的IRAM用完了怎么优化
后端
雨落倾城夏未凉22 分钟前
7.QObject定时器和QTimer定时器的区别
后端·qt
洗澡水加冰24 分钟前
RAG系统工程化
后端·aigc
paopaokaka_luck1 小时前
智能推荐社交分享小程序(websocket即时通讯、协同过滤算法、时间衰减因子模型、热度得分算法)
数据库·vue.js·spring boot·后端·websocket·小程序
大模型真好玩1 小时前
准确率飙升!GraphRAG如何利用知识图谱提升RAG答案质量(额外篇)——大规模文本数据下GraphRAG实战
人工智能·python·mcp
19891 小时前
【零基础学AI】第30讲:生成对抗网络(GAN)实战 - 手写数字生成
人工智能·python·深度学习·神经网络·机器学习·生成对抗网络·近邻算法
程序员NEO1 小时前
Spring AI 对话记忆大揭秘:服务器重启,聊天记录不再丢失!
人工智能·后端