2011-12-20 52 views
1

现在我建立了我的功能,这样同样的观点方法

@view_config(
    route_name = 'route_name', 
    permissions = 'permissions', 
    renderer = 'r.mako' 
) 
def r(request): 
    # stuff goes here 

内渲染器之间进行切换简单的方法,我想补充的功能,例如,我检查某些条件(使用AJAX)我会用一个模板,否则使用另一个。有没有办法在金字塔中做到这一点?谢谢

+0

这[博客文章](http://cecilphillip.com/content-negotiation-with-the-pyramid-web-framework/)回答你的问题。 – 2018-03-06 15:33:30

回答

14

那么,如果你可以通过谓词确定你想要做什么,那么你可以用不同的渲染器多次添加视图。例如

@view_config(route_name='route', xhr=True, renderer='json') 
@view_config(route_name='route', renderer='r.mako') 
@view_config(route_name='route', request_param='fmt=json', renderer='json') 
def r(request): 
    # ... 

或者你可以手动覆盖渲染通过request.override_renderer = 'b.mako'

http://docs.pylonsproject.org/projects/pyramid/en/1.3-branch/narr/renderers.html#overriding-a-renderer-at-runtime

或者你可以明确地渲染通过从视图中的renderrender_to_response方法的响应,作为如果您返回视图中的Response对象,则会忽略参数renderer

请注意,第一个示例中的xhr谓词应该足以检查ajax请求。还要注意,如果你不想要,你不必为两者使用相同的视图,只需要依赖。

+0

此外,view_config的'accept'参数可用于呈现请求的格式。例如'@view_config(route_name =“route”,accept =“application/json”,renderer =“json”)''。 – 2011-12-20 14:58:33

+1

'accept'不可靠,除非将其添加到该“组”中的所有视图。它受到accept头中的质量因素的影响,所以另一个视图应该是'accept ='text/html',或者json总是被选中,因为如果你记得大多数浏览器指定'accept ='*/*' '。 – 2011-12-20 15:54:37