Flask 注册功能实现(demo)

注册校验

注册使用wtforms模块和email-validator模块去读取和校验数据。

pip install flask-wtf
pip install email-validator

代码

froms.py

import wtforms
from wtforms.validators import Email, Length, EqualTo
# 导入数据库模型
from models import UserModel, EmailCaptchaModel
from exts import db

# 后端校验,验证器

# 继承自wtfforms中的表单功能直接使用
class RegisterForm(wtforms.Form):
    # 验证器validators
    email = wtforms.StringField(validators=[Email(message="邮箱格式错误,请重新输入!")])
    captcha = wtforms.StringField(validators=[Length(min=6, max=6, message='验证码格式错误!')])
    username = wtforms.StringField(validators=[Length(min=3, max=20, message="用户名格式错误,3-20位。")])
    password = wtforms.StringField(validators=[Length(min=8, max=20, message="密码格式错误,8-20位")])
    # 再次确认密码是否一致
    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
        # 如果查询,这个个字段都匹配的话
        captcha_model = EmailCaptchaModel.query.filter_by(email=email, captcha=captcha).first()

        if not captcha_model:
            raise wtforms.ValidationError(message="邮箱或者验证码错误!")

        # 用完验证码后删除,后续改进使用redis
        # else:
        #     db.session.delete(captcha)
        #     db.session.commit()

# 完成注册功能 使用校验器完成注册功能,也就是将通过校验的数据存储到数据表中。数据库使用orm操作。 Flask 数据库操作一把梭。 参考[ Flask 数据库操作一把梭。](https://blog.csdn.net/qq_41690468/article/details/130256151)

代码


auth.py
import random
from flask import Blueprint, render_template, jsonify, redirect, url_for
from exts import mail, db
from flask_mail import Message
from flask import request
import string
from models import EmailCaptchaModel
# 引入验证码部分代码
from .froms import RegisterForm
from models import UserModel
# 加密密码
from werkzeug.security import generate_password_hash

# /auth
bp = Blueprint("auth", __name__, url_prefix="/auth")


# 也就是前面已经定义好前缀,/auth/login
@bp.route("/login")
def login():
    return "注册成功"


# GET: 从服务器上获取数据
# 这里注册,使用POST请求,将客户端的数据提交给服务器
@bp.route("/register", methods=['GET', 'POST'])
def register():
    # 验证用户提交的邮箱和验证码是否对应且正确
    # 表单验证: flask-wtf

    if request.method == 'GET':
        # 渲染文件
        return render_template("register.html")

    # 除了get请求就是post请求
    else:
        # 验证码,密码等验证,如果通过了验证码
        form = RegisterForm(request.form)
        if form.validate():
            email = form.email.data
            username = form.username.data
            password = form.password.data
            # 使用ORM模型操作数据库
            user = UserModel(email=email, username=username, password=generate_password_hash(password))
            db.session.add(user)
            db.session.commit()

            # 跳转到登录页面,第二种方法直接跳转,第一次方法使用url_for 视图化链接

            return redirect(url_for("auth.login"))
            # return redirect("/auth/login")

            # 通过验证的话执行注册,也就是把数据保存到数据库中

        else:
            print(form.errors)

            # 注册失败重新跳转到注册页面
            return redirect("/auth/register")




# bp.route: 如果没有指定methods参数,默认就是GET请求
@bp.route("/captcha/email")
def get_email_captcha():
    # url传参数
    # /captcha/emial?email=xxx@qq.com
    email = request.args.get("email")
    print(email)
    # 6位,数字和字母的组成
    source = string.digits*6
    captcha = random.sample(source, 6)
    # 列表变成字符串
    captcha = "".join(captcha) # 965083
    print(captcha)

    # I/O 操作
    message = Message(subject="菜鸡学安全", recipients=[email], body=f"您的验证码是:{captcha}")
    mail.send(message)


    # 使用数据库存储
    email_captcha = EmailCaptchaModel(email=email, captcha=captcha)
    db.session.add(email_captcha)
    db.session.commit()

    # RESTful API,这是一个格式
    # {code:200/400/500, message: "xxx", data: {}}


    return jsonify({"code":200, "message": "", "data": None})

    # memcached 和redis 适合存储验证,这里扩展,这里暂用数据库来存储




app.py
from flask import Flask
import config
from exts import db, mail
from models import UserModel
from blueprints.qa import bp as qa_bp
from blueprints.auth import bp as auth_bp
from flask_migrate import Migrate
from models import EmailCaptchaModel


app = Flask(__name__)
app.config.from_object(config)


# 创建app后,再与db 和app绑定
db.init_app(app)

# 初始化mail连接
mail.init_app(app)


migrate = Migrate(app, db)

# blueprint,用来做模块化的
# 蓝图,视图函数模块化,蓝图


# 注册蓝图
app.register_blueprint(qa_bp)
app.register_blueprint(auth_bp)

@app.route('/')
def hello_world():  # put application's code here
    return 'Hello World!'


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




图例

注册成功

password存储到数据库中式加密的
在这里插入图片描述

注册失败

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值