异常
1.traceback.print_exc()是打印异常信息
2.traceback.format_exc()是获取异常信息的str
装饰器
作用场景:用于方法XX前“@装饰方法名称“可以在装饰器内捕获方法XX的异常信息,以及传参校验之类的事,下面是一个简单的装饰器,用于接口的请求参数校验
def is_need_login_again(fun):
"""
校验用户token
调用:@token_is_need_login_again
—— 用户没有token时不校验
—— 存在token时校验是否过期
:param fun: 传入方法
continue: 继续执行方法 → 表示token对应的usrid是在数据库存在的
"""
from flask import request
from lib.common import response_msg
from lib.utils.return_msg import USER_NONE, WX_ATTENTION_ERROR, SERVICE_EXCEPTION
from sqlalchemy.orm import Session
from lib.common import iot_db_gateway
from db_manager.ttd import WxUser
import traceback
def wrapper(*args, **kwargs):
# 校验用户请求参数
tokens = request.headers.get("Authorization")
openid = request.values.get('publicId')
if tokens is not None:
try:
token_split = decode_token(tokens)
if len(token_split) == 0:
return response_msg.msg_error(USER_TOKEN_IS_NULL)
token_value = redis.str_get(token_split[0])
if token_value is None:
return response_msg.msg_error(USER_TOKEN_IS_NULL)
except(Exception):
return response_msg.msg_error(USER_TOKEN_IS_NULL)
else:
if openid is None:
return response_msg.msg_error(USER_NONE)
else: # openid存在 去查询是否关注公众号[有wx_user表示关注了]
db: Session = iot_db_gateway.get_mysql_conn()
data = db.query(WxUser.uuid).filter(WxUser.openid == openid).first()
iot_db_gateway.remove()
if data is None:
return response_msg.msg_error(WX_ATTENTION_ERROR)
try: # 捕获方法中的异常
result = fun(*args, **kwargs)
except Exception as ep: # 打印异常信息
err_info = str(traceback.format_exc())
if err_info is not None:
hlog.error(err_info)
result = response_msg.msg_error(SERVICE_EXCEPTION)
return result
return wrapper