如何在金字塔中提供不同的视图来提供不同的内容类型?

时间:2013-11-05 07:37:51

标签: python pyramid

文档似乎表明您可以使用'accept'view_config参数,如下所示:

@view_config(
    route_name='data',
    request_method='POST',
    accept='application/json',
    renderer='json',
)
def json_post_view(self):
  ...

@view_config(
    route_name='data',
    request_method='POST',
    renderer='blah:templates/data.mako',
)
def form_post_view(self):
  ...

然而,实际上,使用wget发布到网址,就像这样:

wget -q -O - --post-file=data.json http://localhost:6543/data

或:

wget -q -O - --post-file=data.json --header="Content-type: application/json" http://localhost:6543/data

或使用浏览器发布到网址...

所有导致同样的事情;调用json_post_view()视图。

我在这里做错了什么? accept参数似乎根本不做任何事情。

2 个答案:

答案 0 :(得分:7)

您希望使用谓词分派到不同的视图,就像您所做的那样。但accept用于Accept标题,用于形成您的回复。传入的数据位于Content-Type标头中,其中金字塔没有默认谓词。但是,您可以轻松编写自己的。

class ContentTypePredicate(object):
    def __init__(self, val, config):
        self.val = val

    def text(self):
        return 'content type = %s' % self.val
    phash = text

    def __call__(self, context, request):
        return request.content_type == self.val

config.add_view_predicate('content_type', ContentTypePredicate)

@view_config(content_type='application/json')
# ...

答案 1 :(得分:3)

Content-type标头指定请求正文的类型。对于您希望服务器返回的类型,您应该使用Accept标题。

来源:http://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Requests