Flask项目实战-用户注册功能

1.安装flask-wtf

flask表单验证基于flask-wtf

安装flask-wtf命令

pip install flask-wtf

2.建立表单验证函数

安装email_validator

 pip install email_validator

在blueprints文件夹中新建一个forms.py文件

加入下面代码,主要用来验证前端提交的数据是否符合要求

import wtforms
from wtforms.validators import Email,Length,EqualTo
from models import UserModel,EmailCaptchaModel

# Form:主要用来验证前端提交的数据是否符合要求
class Registerform(wtforms.Form):
    email = wtforms.StringField(validators=[Email(message="邮箱格式错误!")])
    captcha = wtforms.StringField(validators=[Length(min=4,max=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
        captcha_model = EmailCaptchaModel.query.filter_by(email=email,captcha=captcha).first()
        if not captcha_model:
            raise wtforms.ValidationError(message="邮箱或验证码错误!")

3.更改注册函数

更改auth.py

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,random
from models import EmailCaptchaModel,UserModel
from .forms import Registerform
from werkzeug.security import generate_password_hash


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

@bp.route("/login")
def login():
    return "登录页面"


@bp.route("/register",methods=['GET','POST']) #即可以使用GET请求,也可以使用POST请求
def register():
    if request.method == "GET":
        return render_template("register.html")
    else:
        #表单验证,flask-wtf:wtfarms
        #验证用户提交的邮箱和验证是否正确
        form = Registerform(request.form)
        if form.validate():
            email = form.email.data
            username = form.username.data
            password = form.password.data
            user = UserModel(email=email,username=username,password=generate_password_hash(password))
            db.session.add(user)
            db.session.commit()
            return redirect(url_for("auth.login"))
        else:
            print(form.errors)
            return redirect(url_for("auth.register"))



@bp.route("/captcha/email")
def get_email_captcha():
    # /capthca/email/<email>
    # /capthca/email?email=xxx@qq.com
    email = request.args.get("email")
    source = string.digits*4
    captcha = random.sample(source,4)
    captcha = "".join(captcha)
    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
    result = {"code":200,"message":"","data":None}
    return jsonify(result)

@bp.route("/mail/test")
def mail_test():
    message = Message(subject="邮箱测试",recipients=["507303922@qq.com"],body="这是一条测试邮件")
    mail.send(message)
    return "邮件发送测试"

注意: password=generate_password_hash(password)密码使用了加密存储,需要更改下数据库的长度,models.py中UserModel中更改password的长度为200,然后重新同步下(flask db migrate,flask db upgrade)

4.测试注册

更改ragister.html中注册表单,POST请求

<form method="POST">

可以不加地址,就是默认向当前地址发起POST请求

访问注册地址测试http://127.0.0.1:5000/auth/register

注册成功,调整到登录页面

在数据库中可以看到注册的用户数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值