# -*- encoding: utf-8 -*- # ----------------------------------------------------------------------------- # @File Name : errorhandler.py # @Time : 2020/11/25 上午9:19 # @Author : X. Peng # @Email : acepengxiong@163.com # @Software : PyCharm # ----------------------------------------------------------------------------- import time import requests from flask import jsonify, make_response, request from app.api.engine import config, env, redis from app.config.errors import Errors from app.api.engine import logging class CustomFlaskErr(Exception): # 默认的返回码 status_code = 200 # 自己定义了一个 return_code,作为更细颗粒度的错误代码 def __init__(self, return_code=None, status_code=None, payload=None): Exception.__init__(self) self.return_code = return_code if status_code is not None: self.status_code = status_code self.payload = payload # 构造要返回的错误代码和错误信息的 dict def to_dict(self): rv = dict(self.payload or ()) # 增加 dict key: return code rv['statusCode'] = self.return_code # 增加 dict key: message, 具体内容由常量定义文件中通过 return_code 转化而来 rv['message'] = Errors.MSG[self.return_code] return rv def add_errorhandler(app): @app.errorhandler(CustomFlaskErr) def handle_flask_error(error): # response 的 json 内容为自定义错误代码和错误信息 response = jsonify(error.to_dict()) # response 返回 error 发生时定义的标准错误代码 response.status_code = error.status_code return response @app.errorhandler(500) def handle_flask_error(error): # response 的 json 内容为自定义错误代码和错误信息 response = jsonify({'statusCode': '9999', 'message': '服务器错误'}) # response 返回 error 发生时定义的标准错误代码 response.status_code = 200 return response @app.before_request def before_request(): # token鉴权 token = request.headers.get('tampToken', '') url = config[env]['token_auth_url'] if request.path in ['/tamp_order/micro_shop/topUpOrderNotify', '/tamp_order/micro_shop/consumeOrderNotify']: pass else: # requests.adapters.DEFAULT_RETRIES = 5 # 增加重连次数 # s = requests.session() # s.keep_alive = False # res = s.get(url+'?tampToken='+token, timeout=2) # resp = res.json() # if resp['statusCode'] != "0000": # request.user_id = resp['attributes'] user_id = redis.get('s:sid:'+token) if not user_id: logging.error('鉴权失败,token:'+token) raise CustomFlaskErr(Errors.TOKEN_INVALID) if isinstance(user_id, bytes): request.user_id = user_id.decode().replace('"', '') else: request.user_id = user_id.replace('"', '') request.return_success = {'statusCode': "0000", 'message': 'ok'} @app.after_request def after_request(response): return response