【问题标题】:How do I deserialize a JSON string from a GET request in Django?如何从 Django 中的 GET 请求中反序列化 JSON 字符串?
【发布时间】:2012-10-01 11:42:09
【问题描述】:

我觉得我错过了一些非常明显的东西,但我看不到它。

在 ipython (Python 2.7) 中,这是可行的:

In [1]: json.loads('[]')
Out[1]: []

我正在尝试在 Django 视图中做一个等效的最小示例,以说服自己在转向真正的数据结构之前我可以阅读 JSON:

def submit(request):
    json_string = request.GET['json']
    parsed = json.loads(json_string)

    return HttpResponse(parsed)

我通过浏览器调用它

http://localhost:8001/submit/?json='[]'

我得到ValueError: No JSON object could be decoded

我做错了什么,我该如何调试它?这是某种编码问题吗?还是我错误地访问了 GET 的内容?还是别的什么?

我尝试将变量json_string 转储到文件和作为HttpResponse。两次我都得到'[]',这确实看起来很好......

编辑:

为了方便其他想了解如何调试 POST 的初学者,Django 的错误页面在异常中返回。一个快速而讨厌的 hack 是

import os
def debug_post(post_req):

    result = None
    try:
        result = submit_to_endpoint(post_req)
    except urllib2.URLError as e:
        out_fh = open('debug_post.tmp', 'w')
        out_fh.write(e.read())
        out_fh.close()
        os.system('firefox ' + 'debug.tmp')

    return result

【问题讨论】:

  • oO 有什么理由不使用 POST 吗?
  • @BasicWolf - 不,这似乎更易于测试(我可以将客户端的编码 URL 直接剪切并粘贴到浏览器中)。 POST 是更好的选择吗?为什么?

标签: python django json deserialization


【解决方案1】:

您已在 JSON 字符串中包含单引号。没有必要这样做,尤其是单引号在 JSON 中无效。你应该去http://localhost:8001/submit/?json=[]

【讨论】:

  • 好的,这行得通。所以在 ipython 的例子中,单引号代表一个 Python 字符串,但是在 GET 请求中,它们是作为文字字符传入的,对吗?
  • @ire_and_curses 是的——没错。不过,您将使用 POST 处理真正的 JSON 数据,对吧?
  • @Jon Clements - 我当然可以。有理由喜欢它吗(你能告诉我我是新手吗)?
【解决方案2】:

虽然 GET 可能看起来更容易甚至用于测试目的,但对于 JSON,您应该使用 POST 请求。 这在请求改变应用程序内部状态的情况下非常重要。例如。 /localhost/format/?json={disk_id : 1} 是改变应用程序状态的东西 :) 通常搜索引擎索引网站的链接,这些链接是 GET 请求。想象一下这样的链接被搜索引擎索引:即使在索引过程中,应用程序的内部状态也可以改变。

另一个原因是 Web 服务器、代理和浏览器实现的 URLS 缓存。猜猜看,GET 请求的响应通常会被缓存。

最后但并非最不重要的一点是,GET 请求参数应该只是在 Query string

localhost?key1=val1&key2=val2

格式,其中val's 是单值数据字段,而不是 JSON 数据。

所以,原因在于 HTTP 协议设计。您可以利用例如POST JSON 数据的 AJAX 技术足以避免上述所有情况。

我建议您熟悉RESTful Web 服务的概念 - 一个设计用户到 Web 应用程序通信的简单而强大的概念。

【讨论】:

  • 谢谢,这很有帮助。看起来我在通过 Firefox 转储预先构建的 url 时遇到了character limit。我现在已经切换到 POST。
  • 对于未来的 REST 初学者,我还注意到我找到了一种简单的方法来调试 POST 输出,它提供了与 GET 类似的功能。查看我的编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-16
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 2020-09-14
  • 1970-01-01
相关资源
最近更新 更多