Python 如何从Django中的编码URL获取请求参数?
我正在使用Django Rest框架 API接收带有编码到URL中的json对象的GET请求。例如:Python 如何从Django中的编码URL获取请求参数?,python,json,django,django-rest-framework,urlencode,Python,Json,Django,Django Rest Framework,Urlencode,我正在使用Django Rest框架 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#
/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#应该生成一个dict->{foo=[bar,baz]}
如何在Django Rest框架中解码JSON编码的URL
请注意,我的实际参数要复杂得多。使用POST不是一个好方法,因为调用方严重依赖缓存和书签应该这样做:
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"]
}
Django
request.GET
对象和Django REST添加的request.query\u params
别名只能解析使用HTML表单编码的类型。此格式只能对键值对进行编码。没有将JSON编码为查询字符串的标准,部分原因是URL具有
如果必须在查询字符串中使用JSON,那么使用JSON会容易得多,因此至少可以让Django为您处理URL百分比编码
例如
可通过以下方式访问和解码:
import json
json_string = request.query_params['json']
data = json.loads(json_string)
如果无法添加json=
前缀,则需要从以下位置解码自己编码的URL百分比:
你为什么这样发送数据?你能改变它吗?以这种形式接收数据的原因是API接收大量的输入参数。我不能改变这一点,因为我不拥有我客户的代码。即使我这样做了,这仍然是阻止POST的最佳方式。URL中没有发送结构化表单参数的标准,因此
request.query\u params
不能只解析声称包含结构的随机格式。我们所拥有的是,它包含一系列由&
分隔的name=value
对。因此,您真正应该做的是,至少可以将其提取为另一个查询参数。请注意,URL有一个特殊的功能。
import json
json_string = request.query_params['json']
data = json.loads(json_string)
from urllib.parse import unquote_plus
import json
json_string = unquote_plus(request.META['QUERY_STRING'])
data = json.loads(json_string)