flask项目之7:关于项目登录程序的运行逻辑

该项目为前后端分离的项目,前端完成了相关的操作,在登录的过程中,使用到了登录页面和注册页面,分别是两个不同的HTML,点击网页中的登录或注册,可以触发程序中的passport,传入相关的参数,在程序中进行了相关的验证,经过验证后确定是否可以登录和注册

在这里插入图片描述

在这里插入图片描述

在获得内容之后依次进行以下判断,然后进入登录,
passport:验证登录逻辑:
使用到的资源:Redis数据库 数据库
进行相关的判断
通过获取HTML端的request,从里面抽取出json字典,对字典的数据进行相关的处理和判断
相关代码:

from . import api
from flask import request, jsonify, session
from lghome.response_code import RET
from lghome import redis_store
from lghome.models import User
import re
import logging
from lghome import db
from sqlalchemy.exc import IntegrityError
from lghome import constants
import time


@api.route("/users", methods=["POST"])
def register():
    """
    注册
    :param: 手机号 短信验证码  密码 确认密码
    :return: json
    """
    # 接收参数
    request_dict = request.get_json()
    #print(time.strftime("%Y--%m--%d %H:%M:%S",time.localtime(time.time())),' '*5,1)
    print(request_dict)
    mobile = request_dict.get("mobile")
    sms_code = request_dict.get("sms_code")
    password = request_dict.get("password")
    password2 = request_dict.get("password2")
    #print(time.strftime("%Y--%m--%d %H:%M:%S", time.localtime(time.time())), ' ' * 5, 2)

    # 验证
    if not all([mobile, sms_code, password, password2]):
        #print(time.strftime("%Y--%m--%d %H:%M:%S", time.localtime(time.time())), ' ' * 5, 3)
        return jsonify(errno=RET.PARAMERR, errmsg='参数不完整')


    # 判断手机号格式
    if not re.match(r'1[345678]\d{9}', mobile):
        #print(time.strftime("%Y--%m--%d %H:%M:%S",time.localtime(time.time())),' '*5,4)
        return jsonify(errno=RET.PARAMERR, errmsg='手机号格式错误')

    if password != password2:
        #print(time.strftime("%Y--%m--%d %H:%M:%S",time.localtime(time.time())),' '*5,5)
        return jsonify(errno=RET.PARAMERR, errmsg='两次密码不一致')

    # 业务逻辑
    # 从redis取短信验证码
    try:
        #print(time.strftime("%Y--%m--%d %H:%M:%S",time.localtime(time.time())),' '*5,6)
        real_sms_code = redis_store.get("sms_code_%s" % mobile)
    except Exception as e:
        logging.error(e)
        return jsonify(errno=RET.DBERR, errmsg='读取短信验证码异常')
    # 判断短信验证码是否过期
    if real_sms_code is None:
        return jsonify(errno=RET.NODATA, errmsg='短信验证码失效')

    # 删除redis中的短信验证码
    try:
        #print(time.strftime("%Y--%m--%d %H:%M:%S", time.localtime(time.time())), ' ' * 5, 7)
        redis_store.delete("sms_code_%s" % mobile)
    except Exception as e:
        logging.error(e)
    # 判断用户填写的验证码的正确性
    real_sms_code = real_sms_code.decode()
    if real_sms_code != sms_code:
        return jsonify(errno=RET.DATAERR, errmsg='短信验证码错误')
    # 判断手机号是否存在
    # try:
    #     user = User.query.filter_by(mobile=mobile).first()
    # except Exception as e:
    #     logging.error(e)
    # else:
    #     if user is not None:
    #         # 表示手机号已经被注册过
    #         return jsonify(errno=RET.DATAEXIST, errmsg='手机号已经存在')
    # 保存数据
    #print(time.strftime("%Y--%m--%d %H:%M:%S", time.localtime(time.time())), ' ' * 5, 8)
    user = User(name=mobile, mobile=mobile)
    # print(user.password)
    user.password = password
    # user.generate_pwd_hash(password)
    # print(user.password_hash)
    # User(name=mobile, mobile=mobile, password_hash='加密之后的密码')

    try:
        #print(time.strftime("%Y--%m--%d %H:%M:%S", time.localtime(time.time())), ' ' * 5, 9)
        db.session.add(user)
        db.session.commit()
    except IntegrityError as e:
        db.session.rollback()
        logging.error(e)
        return jsonify(errno=RET.DATAEXIST, errmsg='手机号已经存在')
    except Exception as e:
        # 回滚
        db.session.rollback()
        logging.error(e)
        return jsonify(errno=RET.DBERR, errmsg='插入数据库异常')

    # pwd = user.password_hash(password)
    # user.password_hash = pwd

    # , password_hash=password 密码需要加密  csdn 明文  MySQL 居然  xxxx
    # md5  f13d4eaa933978379554abb0ddbe617e  juran
    # 123456  f13d4exxxx978379xxx0ddbxxe617e
    # md5 + salt(盐)
    # sha1  sha256
    # 保存登录状态到session中
    session["name"] = mobile
    session["mobile"] = mobile
    session["user_id"] = user.id
    #print(time.strftime("%Y--%m--%d %H:%M:%S", time.localtime(time.time())), ' ' * 5, 10)
    # 返回结果
    return jsonify(errno=RET.OK, errmsg='注册成功')


@api.route("/sessions", methods=["POST"])
def login():
    """
    用户登录
    :param: 手机号,密码
    :return: json
    """
    # 接收参数
    #print(time.strftime("%Y--%m--%d %H:%M:%S", time.localtime(time.time())), ' ' * 5, 101)
    #time.sleep(3)
    request_dict = request.get_json()
    print(request_dict)
    mobile = request_dict.get('mobile')
    password = request_dict.get('password')
    # 校验参数
    if not all([mobile, password]):
        #print(time.strftime("%Y--%m--%d %H:%M:%S", time.localtime(time.time())), ' ' * 5, 102)
        return jsonify(errno=RET.PARAMERR, errmsg='参数不完整')

    # 判断手机号格式
    if not re.match(r'1[345678]\d{9}', mobile):
        # print(time.strftime("%Y--%m--%d %H:%M:%S", time.localtime(time.time())), ' ' * 5, 103)
        return jsonify(errno=RET.PARAMERR, errmsg='手机号格式错误')
    # 业务逻辑处理
    # 判断错误次数是否超过限制,如果超过限制直接返回
    # redis 用户IP地址:次数
    user_ip = request.remote_addr
    try:
        # bytes
        # print(time.strftime("%Y--%m--%d %H:%M:%S", time.localtime(time.time())), ' ' * 5, 104)
        #time.sleep(3)
        access_nums = redis_store.get("access_nums_%s" % user_ip)
    except Exception as e:
        logging.error(e)
    else:
        if access_nums is not None and int(access_nums) >= constants.LOGIN_ERROR_MAX_TIMES:
            return jsonify(errno=RET.REQERR, errmsg='错误次数太多,请稍后重试')

    # 从数据库中查询手机号是否存在
    try:
        user = User.query.filter_by(mobile=mobile).first()
    except Exception as e:
        logging.error(e)
        # 查询时候的异常
        return jsonify(errno=RET.DBERR, errmsg='获取用户信息失败')
    # 验证密码
    # pwd = check_password_hash(user.password_hash, password)
    # if pwd != user.password_hash:
    if user is None or not user.check_pwd_hash(password):
        try:
            redis_store.incr("access_nums_%s" % user_ip)
            redis_store.expire("access_nums_%s" % user_ip, constants.LOGIN_ERROR_FORBID_TIME)
        except Exception as e:
            logging.error(e)

        return jsonify(errno=RET.DATAERR, errmsg='账号密码不匹配')
    # 保存登录状态
    #print(time.strftime("%Y--%m--%d %H:%M:%S", time.localtime(time.time())), ' ' * 5, 105)
    #time.sleep(3)
    session['name'] = user.name
    session['mobile'] = user.mobile
    session['user_id'] = user.id
    #print(time.strftime("%Y--%m--%d %H:%M:%S", time.localtime(time.time())), ' ' * 5, 106)

    # 返回
    return jsonify(errno=RET.OK, errmsg='登录成功')










原文地址:https://blog.csdn.net/LCY133/article/details/111572158

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Jinja2:是Python的Web项目中被广泛应用的模板引擎,是由Python实现的模板语言,Jinja2 的作者也是 Flask 的作者。他的设计思想来源于Django的模板引擎,并扩展了其语法和一系列强大的功能,其是Flask内置的模板语言。
Fullcalendar日历使用,包括视图选择、事件插入、编辑事件、事件状态更改、事件添加和删除、事件拖动调整,自定义头部,加入el-popover显示图片、图片预览、添加附件链接等,支持手机显示。
监听QQ消息并不需要我们写代码,因为市面上已经有很多开源QQ机器人框架,在这里我们使用go-cqhttp官方文档:go-cqhttp如果您感兴趣的话,可以阅读一下官方文档,如果不想看,直接看我的文章即可。
【Flask框架】—— 视图和URL总结
python+web+flask轻量级框架的实战小项目。登录功能,后续功能可自行丰富。
有了这个就可以配置可信IP,关键是不需要企业认证,个人信息就可以做。
本专栏是对Flask官方文档中个人博客搭建进行的归纳总结,与官方文档结合事半功倍。 本人经验,学习一门语言或框架时,请首先阅读官方文档。学习完毕后,再看其他相关文章(如本系列文章),才是正确的学习道路。
本专栏是对Flask官方文档中个人博客搭建进行的归纳总结,与官方文档结合事半功倍。基础薄弱的同学请戳Flask官方文档教程 本人经验,学习一门语言或框架时,请首先阅读官方文档。学习完毕后,再看其他相关文章(如本系列文章),才是正确的学习道路。 如果python都完全不熟悉,一定不要着急学习框架,请首先学习python官方文档,一步一个脚印。要不然从入门到放弃是大概率事件。 Python 官方文档教程
快到年末了 相信大家都在忙着处理年末数据 刚好有一个是对超市的商品库存进行分析的学员案例 真的非常简单~
一个简易的问答系统就这样完成了,当然,这个项目还可以进一步完善,比如 将数据存入Elasticsearch,通过它先进行初步的检索,然后再通过这个系统,当然我们也可以用其他的架构实现。如果你对这系统还有其他的疑问,也可以再下面进行留言!!!
#模版继承和页面之间的调用@app.route("/bl")def bl(): return render_template("file_2.html")主ht
#form表达提交@app.route("/data",methods=['GET','POST']) #methods 让当前路由支持GET 和
#form表达提交@app.route("/data",methods=['GET','POST']) #methods 让当前路由支持GET 和
#session 使用app.secret_key = "dsada12212132dsad1232113"app.config['PERMANENT_SESSION_LI
#文件上传@app.route("/file",methods=['GET','POST'])def file(): if request.meth
#跳转操作:redirect@app.route("/red")def red(): return redirect("/login")
#session 使用app.secret_key = "dsada12212132dsad1232113"app.config['PERMANENT_SESSION_LI
@app.route("/req",methods=['GET','POST'])def req(): print(request.headers)
#模版继承和页面之间的调用@app.route("/bl")def bl(): return render_template("file_2.html")主ht
#文件操作:send_file,支持图片 视频 mp3 文本等@app.route("/img")def img(): return send_file("1.jpg&q