# -*- 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鉴权 # 安卓,ios取token token = '' if request.headers.get('env') in ['ios', 'android']: token = request.headers.get('tampToken', '') elif request.headers.get('env') in ['wechat', 'xcx']: token = request.cookies.get('qimsession', '') if request.path in ['/tamp_order/micro_shop/topUpOrderNotify', '/tamp_order/micro_shop/consumeOrderNotify']: pass else: 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): response.headers['Access-Control-Allow-Origin'] = '*' response.headers['Access-Control-Allow-Methods'] = 'PUT,GET,POST,DELETE,OPTIONS' response.headers['Access-Control-Allow-Headers'] = ( "Content-Type,Referer,Accept,Origin,User-Agent" "field,Cache-Control,X-Requested-With" ) return response