首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python/金字塔-在引发HTTP异常时用额外数据包装Cornice响应

Python/金字塔-在引发HTTP异常时用额外数据包装Cornice响应
EN

Stack Overflow用户
提问于 2015-06-30 15:23:37
回答 1查看 722关注 0票数 1

我正在使用金字塔科尼丝编写一些RESTful Python应用程序,并制作了一个简单的Corniceresource

代码语言:javascript
复制
@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),我打算使用它作为包装器向响应中添加一些额外的信息:

代码语言:javascript
复制
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装饰器中定义了Cornice validators

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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 )?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-03 15:10:20

在与一个辉煌的金字塔IRC社区的简短讨论中,我决定使用金字塔的吐温,而不是使用包装器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31142344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档