使用 Django 1.7,每当我在 View 中返回以下 JsonResponse 时:
from django.http import JsonResponse
token = "1$aEJUhbdpO3cNrXUmFgvuR2SkXTP9="
response = JsonResponse({"token": token})
return response
我从网络浏览器/cURL 收到以下 HTTP 响应:
"{\"token\": \"1$aEJUhbdpO3cNrXUmFgvuR2SkXTP9=\"}"
我想要的,以及我在 Django 1.3 中拥有的是:
{"token": "1$aEJUhbdpO3cNrXUmFgvuR2SkXTP9="}
我有两个生产中的移动应用程序依赖于使用 Django 的私有(private) API,不幸的是,他们期待第二种响应,没有额外的引号(引号包围整个 JSON 使其成为一个字符串)并且没有引号逃脱。
我的问题是,是否有一些内置方法可以强制 Django 响应不转义 JSON 响应?
我编写了以下中间件来完成它,但是......这似乎是一种非常脆弱的蛮力方式:
class UnescapeJSON(object):
def process_response(self, request, response):
"""
Directly edit response object here, searching for and replacing terms
in the html.
"""
if re.search('^/api/.*', request.path):
r = response.content
r = r.replace('\\', '')
r = r.lstrip('"')
r = r.rstrip('"')
response.content = r
return response
所以我希望有更聪明的方法。
背景故事是我正在尝试将旧的遗留代码库从 Django 1.3 更新到 1.8。我目前在我的本地开发环境中使用 1.7。 Django 1.3 以正确的方式返回 JSON,没有额外的引号和反斜杠。
以这种方式返回 JSON 的一个好处是:
{"token": "1$aEJUhbdpO3cNrXUmFgvuR2SkXTP9="}
...是我正在使用 jQuery.post({success:...})
来处理这个 JSON 响应,它会自动运行 jQuery.parseJSON()
对我来说,把它变成一个我可以用点符号访问的 JSON 对象。
我不能只在客户端修复字符串并手动重新运行 parseJSON()
,因为这将涉及让我的所有用户升级他们的移动应用程序。
所以我必须按照上面的格式获取 JSON,否则我的移动 API 就会被破坏。
我应该补充一点信息。这个 API 使用的是 Django Piston :(。我使用的是我发现的 1.7x 兼容版本。我现在不可能在 Django REST Framework 中交换。相信我,我会尽快。
最佳答案
对于那些在 Google 上找到此线程的人,放弃 JsonResponse。如果您尝试使用 jsonp,则会抛出错误
"TypeError: In order to allow non-dict objects to be serialized set the safe parameter to False"
如果您将 safe 设置为 False,您将收到带有引号的响应,然后在客户端失败。相反
return HttpResponse(response_data, content_type='application/json')
关于python - 我怎样才能让 Django 返回 JsonResponse 而没有额外的引号或引号转义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30655567/