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

4jb9z9bj  于 2023-08-08  发布在  Go
关注(0)|答案(3)|浏览(335)

使用Django Rest Framework
API接收GET请求,其中json对象编码到URL中。举例来说:
第一个月
其中解码的参数是

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

字符串
我在Django或DRF的文档中找不到任何关于框架如何处理这个问题的内容,所以我通过执行以下操作来获得一个包含json对象的QueryDict
request.query_params # Should yield a dict -> {foo=[bar,baz]}
如何在Django Rest Framework中解码JSON编码的URL?
请注意,我的实际参数要复杂得多。使用POST并不是一个简单的方法,因为调用者非常依赖缓存和书签

0s0u357o

0s0u357o1#

Django request.GET对象和Django REST添加的request.query_params别名只能解析application/x-www-form-urlencoded查询字符串,该类型使用HTML表单编码。此格式只能编码键值对。没有将JSON编码为查询字符串的标准,部分原因是URL具有rather limited amount of space
如果你必须在查询字符串中使用JSON,如果你使用prefixed the JSON data with a key name,那会容易得多,所以你至少可以让Django为你处理URL的百分比编码。
例如:

/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']值中解码URL百分比编码:

from urllib.parse import unquote_plus
import json

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

xmjla07d

xmjla07d2#

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"]
}

j0pj023g

j0pj023g3#

def getParams(request):
    url_string = request.META["QUERY_STRING"]
    params = {}
    url_params = url_string.split("&", 1)
    for url_param in url_params:
        print(url_param)
        url_param_values = url_param.split("=", 1)
        if len(url_param_values) == 2:
            params[url_param_values[0]] = url_param_values[1]
    return params

字符串
我创建此函数是为了获取类似于ref=Y3e8rowMetWiBA40f2HtBGsRfb76IOXykAMxcNcog7w=&vef=qDMdvZb+P9sNWbH/dYrDztq79SV6wQ+vf9z1qlUzf3U=的查询参数

相关问题