errorhandler.py 2.91 KB
Newer Older
1 2 3 4 5 6 7 8
# -*- encoding: utf-8 -*-
# -----------------------------------------------------------------------------
# @File Name  : errorhandler.py
# @Time       : 2020/11/25 上午9:19
# @Author     : X. Peng
# @Email      : acepengxiong@163.com
# @Software   : PyCharm
# -----------------------------------------------------------------------------
9 10
import time

11
import requests
12
from flask import jsonify, make_response, request
13 14

from app.api.engine import config, env
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
from app.config.errors import Errors


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
35
        rv['statusCode'] = self.return_code
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50

        # 增加 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
51

52 53 54 55 56 57 58 59 60 61
    @app.errorhandler(500)
    def handle_flask_error(error):
        # response 的 json 内容为自定义错误代码和错误信息
        response = jsonify({'statusCode': '9999', 'message': '服务器错误'})

        # response 返回 error 发生时定义的标准错误代码
        response.status_code = 200

        return response

62 63 64

    @app.before_request
    def before_request():
65 66 67 68
        # token鉴权
        token = request.headers.get('tampToken', '')
        # token = 'eyJhbHQiOiJIUzI1NiIsImFsZyI6IkhTMjU2IiwidHlwIjoiSldUIn0.eyJwYXlsb2FkIjoidGFtcC8xOTM3NzkzMDc5NzY5NDE1NjgiLCJpc3MiOiJjYWl4aWFvcXVhbiIsImlhdCI6MTYwNjI5MDYzMH0.WnADEiWd27A8wr2DmOyX1kcs0dWLxpoO-k1yiF0qbBk'
        url = config[env]['token_auth_url']
69
        start = time.time()
pengxiong@wealthgrow.cn's avatar
pengxiong@wealthgrow.cn committed
70 71 72 73
        requests.adapters.DEFAULT_RETRIES = 5  # 增加重连次数
        s = requests.session()
        s.keep_alive = False
        res = s.get(url+'?tampToken='+token)
74
        print('token鉴权时间', time.time() - start)
75 76 77 78 79
        resp = res.json()
        if resp['statusCode'] != "0000":
            raise CustomFlaskErr(Errors.TOKEN_INVALID)
        request.user_id = resp['attributes']
        request.return_success = {'statusCode': "0000", 'message': 'ok'}
80 81 82 83

    @app.after_request
    def after_request(response):
        return response