文档似乎表明您可以使用'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参数似乎根本不做任何事情。
答案 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