@api.route("/sessions", methods=["POST"])
def login():
"""
用户登录
参数:用户手机号、密码 json
:return:
"""
# 获取参数
req_dict = request.get_json()
mobile = req_dict.get("mobile")
password = req_dict.get("password")
# 校验参数
# 参数是否完整
if not all([mobile, password]):
return jsonify(errno=RET.PARAMERR, errmsg="参数不完整")
# 判断手机号格式
if not re.match(r"1[34578]\d{9}", mobile):
return jsonify(errno=RET.PARAMERR, errmsg="手机号码格式错误")
# 判断错误次数是否超过限制,如果超过限制,则返回
# redis记录:"access_num_请求的ip":"次数"
user_ip = request.remote_addr # 用户的ip地址
try:
access_nums = redis_store.get("access_num_%s" % user_ip)
except Exception as e:
current_app.logger.error(e)
else:
if access_nums is not None and int(access_nums) >= LOGIN_ERROR_MAX_TIMES:
return jsonify(errno=RET.REQERR, errmsg="错误次数过多,请稍后重试")
# 从数据库中根据手机号查询用户的数据对象
try:
user = User.query.filter_by(mobile=mobile).first()
except Exception as e:
return jsonify(errno=RET.DBERR, errmsg="获取用户信息失败")
# 用数据库的密码与用户填写的密码进行匹配验证
if user is None or user.check_password(password) is False:
# 如果验证失败,记录错误次数,返回信息
try:
redis_store.incr("access_num_%s" % user_ip)
redis_store.expire("access_num_%s" % user_ip, LOGIN_ERROR_FORBID_TIME)
except Exception as e:
current_app.logger.error(e)
return jsonify(errno=RET.DATAERR, errmsg="用户名或密码错误")
# 如果验证相同成功,保存登录状态。
session["name"] = user.name
session['mobile'] = user.mobile
session["user_id"] = user.id
return jsonify(errno=RET.OK, errmsg="登陆成功")
@api.route("/session", methods=["GET"])
def check_login():
"""检查登录状态"""
name = session.get("name")
if name is not None:
return jsonify(errno=RET.OK, errmsg="true", data={"name":name})
else:
return jsonify(errno=RET.SESSIONERR,errmsg="false")
@api.route("/session", methods=["DELETE"])
def logout():
"""退出登录"""
session.clear()
return jsonify(errno=RET.OK, errmsg="ok")
用户登录,登出总结
最新推荐文章于 2023-02-19 22:43:24 发布