金字塔中的HTTPException的json渲染器

时间:2015-02-16 10:09:16

标签: python json pyramid

我有以下代码段:

try:
    DBSession.query(Task).filter_by(id=task_id).one()
except NoResultFound:
    raise HTTPNotFound

我想将此作为application/json响应返回。它适用于try子句,但是,如果引发异常 - 它将返回为text/html。我知道我可以像这样手动构建响应:

response = HTTPNotFound()
response.content_type = 'application/json'
response.text = {'message': 'not found'}
return response

然而,每次都这样做是非常不方便的。另一种可能的解决方案是使用@view_config装饰器:

@view_config(context=HTTPNotFound, renderer='json')
def not_found(request):
    return {'message': 'not found'}

然后提出该异常使用此视图。但是,我无法将其广泛应用于应用程序。如果我将此视图函数移动到__init__.py,它将停止被调用。所以我的问题是,如何从我在应用中引发的任何异常中返回json响应而不是html

3 个答案:

答案 0 :(得分:0)

来自docs

  

将默认渲染器与所有视图配置相关联(甚至   不具有渲染器属性的那些),传递None作为名称   属性为渲染器标记:

     

config.add_renderer(None, 'mypackage.json_renderer_factory')

在你的情况下:

config.add_renderer(None, 'pyramid.renderers.json_renderer_factory')

答案 1 :(得分:0)

add_renderer需要工厂实施

json_renderer_factory = JSON()

第二个解决方案(覆盖exception view)确实应该有效。您是否在项目中启用了声明性配置?尝试使用命令式样式config.add_view(...)。另外,尝试检查日志,mb使用context = HTTPNotFound

调用另一个视图

答案 2 :(得分:0)

添加____init__.py

def request_factory(environ):
    environ['HTTP_ACCEPT'] = 'application/json'
    request = Request(environ)
    request.response = Response()
    request.add_response_callback(finish_callback)
    return request

def finish_callback(peticion, respuesta):
    respuesta.headerlist.extend(
        (
            ('Access-Control-Allow-Origin', '*'),
            ('Access-Control-Allow-Headers', 'WWW-Authorization'),
            ('Access-Control-Allow-Headers', 'Content-Type'),
        )
    )
    return respuesta

稍后,在 main()

中添加request_factory
config.set_request_factory(request_factory)

适合我。这不是最好的选择,但它对我有用

来源: http://docs.pylonsproject.org/projects/pyramid/en/latest/api/httpexceptions.html http://docs.pylonsproject.org/projects/pyramid/en/latest/narr/hooks.html