24

我看到'对不起,尚未实施。请将“?format=json”附加到您的网址。'。我总是需要附加字符串“?format = json”。我可以默认以 JSON 格式输出吗?

问候, 维塔利

4

5 回答 5

41

sweetpie 食谱中,为了更改默认格式,您需要覆盖 ModelResource 上的 determine_format() 方法:

class MyResource(ModelResource):
    ....
    def determine_format(self, request):
        return 'application/json'

上面的链接演示了确定输出格式的替代方法。

另外,我不认为一个有效的答案本质上是“你不需要这个”。

编辑

看来 GregM 的答案可能是(我还没有测试过)新版本的 TastyPie 最正确的答案,根据将以下内容放入您的文档中,settings.py将序列化输出限制为 json。

 TASTYPIE_DEFAULT_FORMATS = ['json']
于 2013-02-12T04:16:02.703 回答
10

从 sweetpie 0.9.13 开始,如果您不需要 XML 支持,您可以通过在文件中设置TASTYPIE_DEFAULT_FORMATS为来全局禁用它。然后,请求应默认为 JSON。['json']settings.py

于 2013-05-21T15:15:11.710 回答
2

我已经测试了将 TASTYPIE_DEFAULT_FORMATS 设置为 ['json'] 但它不会阻止从浏览器查看 API 时出现“抱歉尚未实现”消息。

我可以通过中间件中将“Accept”标头强制为“application/json”来消除该警告:

class TastyJSONMiddleware(object):
    """
    A Django middleware to make the Tastypie API always output in JSON format
    instead of telling browsers that they haven't yet implemented text/html or
    whatever.

    WARNING: This includes a hardcoded url path for /api/.  This is not 'DRY'
    because it means you have to edit two places if you ever move your API
    path.
    """

    api_prefix = '/api/'

    def process_request(self, request):
        if request.path.startswith(self.api_prefix):
            request.META['HTTP_ACCEPT'] = 'application/json'
于 2013-06-14T17:54:04.130 回答
1

要检查/测试您的 REST API,请使用 Rest 客户端而不是浏览器,最好是知道如何漂亮地打印 JSON 的浏览器。我使用 Google Chrome 的 Postman 插件。

如果你想在命令行中使用漂亮的 json:

curl https://api.twitter.com/1.1/search/tweets.json | python -m json.tool
于 2012-01-02T11:40:20.920 回答
1

Tasytpie 的默认设置为“应用程序/json”。但这被浏览器请求覆盖。

根据 Tastypie 的说法,默认值被Request Header ACCEPT和您在GET中的格式规范覆盖,即。? 格式=json。当您从浏览器发送请求时,如果您看到发送的请求 HTTP 标头,它类似于 -

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

application/xml覆盖 Tastypie 资源中的默认值。因此,您可以将浏览器标头设置为具有“应用程序/json”(坏主意),或者您只需在 GET 中指定。

如果您使用 CURL 访问相同的 API url,您将看到 JSON 输出而无需在 GET 中指定。

于 2012-10-28T21:30:24.197 回答