【问题标题】:json renderer for HTTPException in pyramid金字塔中HTTPException的json渲染器
【发布时间】:2016-09-27 04:01:49
【问题描述】:

我有以下代码sn-p:

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

【问题讨论】:

  • @view_configconfig.scan() 一起使用,你可以用config.add_view(...) 替换它,它会做同样的事情。现在你可以把它放在你的__init__.py

标签: python json pyramid


【解决方案1】:

来自docs

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

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

在你的情况下:

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

【讨论】:

  • 如果我理解正确,将其添加到主 config.add_renderer(None, 'pyramid.renderers.JSON') 应该可以解决问题吗?但是,似乎不起作用,我仍然得到 html。
  • config.add_renderer(None, 'pyramid.renderers.json_renderer_factory')
  • 看代码,json_renderer_factory是为了向后兼容而留下的,指向JSON。尽管如此,我都尝试了,两次都得到了完全相同的 html 输出。
【解决方案2】:

add_renderer 期望工厂实现

json_renderer_factory = JSON()

第二个解决方案(覆盖exception view)应该可以正常工作。您是否在项目中启用声明性配置?尝试使用命令式的 config.add_view(...)。此外,尝试检查日志,mb 另一个视图调用 context=HTTPNotFound

【讨论】:

    【解决方案3】:

    添加____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
    

    稍后,在ma​​in()中添加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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-07
      • 2023-03-11
      • 1970-01-01
      • 2017-09-13
      • 1970-01-01
      • 2015-12-19
      • 2015-05-20
      • 2017-07-01
      相关资源
      最近更新 更多