2

文档似乎表明您可以为此使用 '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 发布到 url,如下所示:

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() 视图。

我在这里做错了什么?接受参数似乎根本没有做任何事情。

4

2 回答 2

9

正如您所做的那样,您想使用谓词分派到不同的视图。但是,用于形成您的响应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')
# ...
于 2013-11-05T16:06:14.513 回答
3

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

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

于 2013-11-05T09:21:58.653 回答