File size: 2,055 Bytes
0139e20
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import logging
import time
import traceback

import jsonschema

from server.exception import ExpectedError
from toolbox.logging.misc import json_2_str

logger = logging.getLogger('server')


result_schema = {
    'type': 'object',
    'required': ['result', 'debug'],
    'properties': {
        'result': {},
        'debug': {}
    },
    'additionalProperties': False

}


def common_route_wrap(f):
    def inner(*args, **kwargs):
        begin = time.time()
        try:
            ret = f(*args, **kwargs)
            try:
                jsonschema.validate(ret, result_schema)
                debug = ret['debug']
                result = ret['result']
            except jsonschema.exceptions.ValidationError as e:
                debug = None
                result = ret

            response = {
                'status_code': 60200,
                'result': result,
                'debug': debug,
                'message': 'success',
                'detail': None
            }
            status_code = 200
        except ExpectedError as e:
            response = {
                'status_code': e.status_code,
                'result': None,
                'message': e.message,
                'detail': e.detail,
                'traceback': e.traceback,
            }
            status_code = 400

        except Exception as e:
            response = {
                'status_code': 60500,
                'result': None,
                'message': str(e),
                'detail': None,
                'traceback': traceback.format_exc(),
            }
            status_code = 500

        cost = time.time() - begin
        response['time_cost'] = round(cost, 4)

        abstract_response = json_2_str(response)
        if 'traceback' in response:
            abstract_response['traceback'] = response['traceback']

        logger.info('response: {}'.format(abstract_response))
        # logger.info('response: {}'.format(json.dumps(response, ensure_ascii=False)))

        return response, status_code
    return inner