【Flask项目】注册相关 # 8

该博客详细介绍了如何使用Flask后端和JavaScript前端实现用户注册功能。包括接收并验证手机号、短信验证码和密码,通过正则表达式检查手机号合法性,从Redis中获取并校验短信验证码,将数据写入MySQL数据库,并使用session进行状态保持。同时展示了User模型类的设计,用于存储用户信息。
摘要由CSDN通过智能技术生成

注册相关:

后端Flask代码:

import datetime
import re
from flask import request, jsonify, current_app, session
from info import sr, db
from info.response_code import RET
from info.models import User
from . import blue_passport

@blue_passport.route("/register", methods=["GET", "POST"])
def register():
    """
        注册相关
        1.接收参数(mobile, smscode, password)
        2.校验参数(mobile, smscode, password)
            2.1 校验所有参数是否存在
            2.2 tel_number是否合法(re)
            2.3 redis中是否存在tel_number对应的值
            2.4 redis中取出的短信验证码与smscode是否一致
        3.写入数据库(MySQL)
        4.实现状态保持(session)
        5.返回结果
    :return:
    """
    # 1.接收参数(mobile, smscode, password)
    mobile = request.json.get("mobile")
    smscode = request.json.get("smscode")
    password = request.json.get("password")

    # 2.校验参数(mobile, smscode, password)
        # 2.1 校验所有参数是否存在
    if not all([mobile, smscode, password]):
        return jsonify(errno=RET.PARAMERR, errmsg="参数错误")
        # 2.2 tel_number是否合法(re)
    if not re.findall("^(13[0-9]|14[5|7]|15[0|1|2|3|4|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$", mobile.strip()):
        return jsonify(errno=RET.PARAMERR, errmsg="手机号有误")
        # 2.3 redis中是否存在tel_number对应的值
    try:
        smscode_server = sr.get("smsCodeTel:"+mobile)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="数据库连接失败")
    if not smscode_server:
        return jsonify(errno=RET.DBERR, errmsg="验证失败")
        # 2.4 redis中取出的短信验证码与smscode是否一致
    if smscode != smscode_server:
        return jsonify(errno=RET.PARAMERR, errmsg="手机验证码错误")

    # 3.写入数据库(MySQL)
    user = User()
    user.nick_name = mobile
    user.mobile = mobile
    user.last_login = datetime.datetime.now()
    user.pwd = password
    try:
        db.session.add(user)
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR, errmsg="数据库写入失败")

    # 4.实现状态保持(session)
    session["id"] = user.id
    session["mobile"] = user.mobile
    session["nick_name"] = user.nick_name

    # 5.返回结果
    return jsonify(errno=RET.OK, errmsg="注册成功")

JS代码:

    // TODO 注册按钮点击
    $(".register_form_con").submit(function (e) {
        // 阻止默认提交操作
        e.preventDefault()

		// 取到用户输入的内容
        var mobile = $("#register_mobile").val()
        var smscode = $("#smscode").val()
        var password = $("#register_password").val()

		if (!mobile) {
            $("#register-mobile-err").show();
            return;
        }
        if (!smscode) {
            $("#register-sms-code-err").show();
            return;
        }
        if (!password) {
            $("#register-password-err").html("请填写密码!");
            $("#register-password-err").show();
            return;
        }

		if (password.length < 6) {
            $("#register-password-err").html("密码长度不能少于6位");
            $("#register-password-err").show();
            return;
        }

        // 发起注册请求
        var params = {
            'mobile':mobile,
            'smscode':smscode,
            'password':password
        };

        $.ajax({
            url:'/passport/register', // 请求地址
            type:'post', // 请求方法
            data:JSON.stringify(params), // 请求参数
            contentType:'application/json',
            headers:{'X-CSRFToken':getCookie('csrf_token')}, // 在请求头中带上csrf_token
            success:function (response) {
                if (response.errno == '0') {
                    // 注册成功
                    location.reload();
                } else {
                    alert(response.errmsg);
                }
            }
        });

    })

数据库模型类:

class User(BaseModel, db.Model):
    """用户"""
    __tablename__ = "info_user"

    id = db.Column(db.Integer, primary_key=True)  # 用户编号
    nick_name = db.Column(db.String(32), unique=True, nullable=False)  # 用户昵称
    password_hash = db.Column(db.String(128), nullable=False)  # 加密的密码
    mobile = db.Column(db.String(11), unique=True, nullable=False)  # 手机号
    avatar_url = db.Column(db.String(256))  # 用户头像路径
    last_login = db.Column(db.DateTime, default=datetime.now)  # 最后一次登录时间
    is_admin = db.Column(db.Boolean, default=False)
    signature = db.Column(db.String(512))  # 用户签名
    gender = db.Column(  # 订单的状态
        db.Enum(
            "MAN",  # 男
            "WOMAN"  # 女
        ),
        default="MAN")

    # 当前用户收藏的所有新闻
    collection_news = db.relationship("News", secondary=tb_user_collection, lazy="dynamic")  # 用户收藏的新闻
    # 用户所有的粉丝,添加了反向引用followed,代表用户都关注了哪些人
    followers = db.relationship('User',
                                secondary=tb_user_follows,
                                primaryjoin=id == tb_user_follows.c.followed_id,
                                secondaryjoin=id == tb_user_follows.c.follower_id,
                                backref=db.backref('followed', lazy='dynamic'),
                                lazy='dynamic')

    # 当前用户所发布的新闻
    news_list = db.relationship('News', backref='user', lazy='dynamic')

    def to_dict(self):
        resp_dict = {
            "id": self.id,
            "nick_name": self.nick_name,
            "avatar_url": constants.QINIU_DOMIN_PREFIX + self.avatar_url if self.avatar_url else "",
            "mobile": self.mobile,
            "gender": self.gender if self.gender else "MAN",
            "signature": self.signature if self.signature else "",
            "followers_count": self.followers.count(),
            "news_count": self.news_list.count()
        }
        return resp_dict

    def to_admin_dict(self):
        resp_dict = {
            "id": self.id,
            "nick_name": self.nick_name,
            "mobile": self.mobile,
            "register": self.create_time.strftime("%Y-%m-%d %H:%M:%S"),
            "last_login": self.last_login.strftime("%Y-%m-%d %H:%M:%S"),
        }
        return resp_dict

    @property
    def pwd(self):
        raise Exception("You can't read")

    @pwd.setter
    def pwd(self, value):
        self.password_hash = generate_password_hash(value)

    def check(self, value):
        return check_password_hash(self.password_hash, value)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值