我有以下代码段:
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
?
答案 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_factoryconfig.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