Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从Django中的编码URL获取请求参数?_Python_Json_Django_Django Rest Framework_Urlencode - Fatal编程技术网

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

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#

我正在使用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#应该生成一个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)