Python/Pyramid - Обтекание ответа карниза дополнительными данными при поднятии исключения HTTP

Я использую Pyramid и Cornice, чтобы написать приложение RESTful Python, и я сделал простой Cornice resource:

@resource(collection_path='/users/', path='/users/{id}')
class UsersResource(object):

    def __init__(self, request):
        self.request = request

    @view(renderer='json', content_type=content_type)
    @my_wrapper
    def get(self):
        return {'user_id': self.request.matchdict['id']}

Как вы могли заметить, наряду с карнизом view декоратор, я также добавил дополнительный декоратор здесь (my_decorator), который я намеревался использовать в качестве оболочки для добавления дополнительной информации к ответу:

def my_wrapper(method):
    def wrapper(*args, **kw):
        time_start = time()
        profiler = sqltap.start()
        fn_result = method(*args, **kw)
        stats = profiler.collect()
        time_end = time()

        result = {
            'info': {
                'api_version': args[0].request.registry.settings.api_version,
                'request_path': args[0].request.path_info,
                'request_method': args[0].request.method,
                'current_time': datetime.datetime.now(pytz.utc).strftime('%Y-%m-%dT%H:%M:%SZ'),
                'execution_time': time_end - time_start,
                'total_queries': len(stats),
                'query_time': stats[0].duration if len(stats) > 0 else 0,
            },
        }
        result.update(fn_result)

        return result

    return wrapper

Это прекрасно работает, если я не определю карниз validators в моем view декоратор:

from validators import validate_int

@resource(collection_path='/users/', path='/users/{id}')
class UsersResource(object):

    def __init__(self, request):
        self.request = request

    @view(renderer='json', content_type=content_type, validators=validate_int)  # added validators
    @my_wrapper
    def get(self):
        return {'user_id': self.request.matchdict['id']}

validators.py

import responses

def validate_int(request):
    should_be_int = request.matchdict['id']
    try:
        int(should_be_int)
    except:
        raise responses._400('This doesn\'t look like a valid ID.')

responses.py

class _400(exc.HTTPError):
    def __init__(self, desc):
        body = {'status': 400, 'message': 'Bad Request', 'description': desc}
        Response.__init__(self, json.dumps(body))

С таким кодом, my_wrapper оборачивает ответ, только если проверка прошла успешно (что вполне понятно), но мне интересно, как я могу обернуть ответ дополнительной информацией, когда по умолчанию HTTPException поднят (потому что в этом случае код никогда не достигает my_wrapper совсем)?

1 ответ

Решение

В коротком обсуждении с блестящим IRC-сообществом Pyramid я решил сделать это с подростками Pyramid, а не с помощью обертки.

Другие вопросы по тегам