如何从Django中的编码URL获取请求参数?

问题描述 投票:-1回答:2

我正在使用Django Rest Framework。

API使用编码到URL中的json对象接收GET请求。例如:

/endpoint?%7B%0D%0A++%22foo%22%3A%5B%22bar%22%2C%22baz%22%5D%0D%0A%7D

解码参数在哪里

{
  "foo":["bar","baz"]
}

我在Django或DRF的文档中找不到任何指向框架如何处理它的内容,以便通过执行以下操作来获取带有json对象的QueryDict

request.query_params # Should yield a dict -> {foo=[bar,baz]}

如何在Django Rest Framework中解码JSON编码的URL?

请注意,我的实际参数要复杂得多。使用POST不是因为调用者严重依赖于缓存和书签

python json django django-rest-framework urlencode
2个回答
2
投票

Django request.GET对象和Django REST添加的request.query_params别名只能解析application/x-www-form-urlencoded query strings,即使用HTML表单编码的类型。此格式只能编码键值对。将JSON编码为查询字符串没有标准,部分原因是URL具有rather limited amount of space

如果你必须在查询字符串中使用JSON,那么如果你使用prefixed the JSON data with a key name它会更容易,所以你至少可以让Django为你处理URL百分比编码。

EG

/endpoint?json=%7B%0D%0A++%22foo%22%3A%5B%22bar%22%2C%22baz%22%5D%0D%0A%7D

可以通过以下方式访问和解码:

import json

json_string = request.query_params['json']
data = json.loads(json_string)

如果你不能添加json=前缀,你需要使用urllib.parse.unquote_plus()中的request.META['QUERY_STRING'] value解码自己的URL百分比编码:

from urllib.parse import unquote_plus
import json

json_string = unquote_plus(request.META['QUERY_STRING'])
data = json.loads(json_string)

-1
投票

Urllib应该这样做:

from urllib.parse import unquote
url = "endpoint?%7B%0D%0A++%22foo%22%3A%5B%22bar%22%2C%22baz%22%5D%0D%0A%7D"
url = unquote(url)
print(url)

以上几乎可以工作,但编码可能不正确,不确定:

endpoint?{
++"foo":["bar","baz"]
}
© www.soinside.com 2019 - 2024. All rights reserved.