flask用装饰器实现登录认证

1.登录:使用手机号验证码登录

@api.route('/register',methods=['post'])
def register():
#     注意瓜子二手车是登录注册一体的
    #todo 获取参数
    # phone = request.form.get('phone')
    # input_msgcode = request.form.get('msgcode')
    data=request.json
    phone = data['phone']
    input_msgcode = data['msgcode']
    print(phone,input_msgcode)
    # todo 校验是否为空
    if not all([phone,input_msgcode]):
        return jsonify(errmsg='参数不完整')

    # todo 校验参数是否合法

    #todo 从redis取出正确的验证码
    try:
        local_msgcode = redis_store.get('msg_%s'%phone).decode()
    except Exception as e:
        return jsonify(errmsg='redis不存在这个数据')

    print('本地存储的msgcode:',local_msgcode)
    #todo 校验是否验证码是否正确
    if input_msgcode!=local_msgcode:
        return jsonify(errmsg='验证码错误!')

    #todo 判断数据库中是否存在该手机号
    user_obj=User.query.filter_by(phone=phone).first()
    #todo 不存在就添加到数据库
    if not user_obj:
        user=User(phone=phone)
        try:
            db.session.add(user)
            db.session.commit()
            user_obj=user
        except:
            db.session.rollback()
            return jsonify(errmsg='数据保存失败')
    #todo 将用户数据添加到session

    session['user_id']=user_obj.id

    session['user_phone']=user_obj.phone

    return jsonify(msg='登录成功')

2.创建装饰器

def login_required(func):
    @functools.wraps(func)#修饰内层函数,防止当前装饰器去修改被装饰函数__name__的属性
    def inner(*args,**kwargs):
        userid = session.get('user_id')
        print('获取session  userid',userid)
        if not  userid:
            return jsonify(errmsg='用户未登录',errcode=constant.RET_LOGIN)
        else:
            g.userid=userid
            return func(*args,**kwargs)
    return inner

3.使用

@api.route('index')
@login_required
def index1():

    return '首页'

效果:
登录是的效果:
在这里插入图片描述
未登录的效果:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值