Как получить параметры запроса из закодированного URL в Django? - PullRequest
0 голосов
/ 12 марта 2019

Я использую Django Rest Framework.

API получает запросы GET с объектами json, закодированными в URL. Например:

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

Где декодированные параметры:

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

Я не могу найти ничего в документации для Django или DRF, указывающей на то, как фреймворк может справиться с этим, чтобы я получил QueryDict с объектами json в нем, выполнив что-то вроде:

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

Как я могу декодировать закодированные в JSON URL-адреса в Django Rest Framework?

Обратите внимание, что мои фактические параметры намного сложнее. Использование POST не является причиной, потому что вызывающая сторона в значительной степени полагается на кэширование и создание закладок

Ответы [ 2 ]

2 голосов
/ 12 марта 2019

Объект Django request.GET и псевдоним request.query_params, которые добавляет Django REST, могут анализировать только application/x-www-form-urlencoded строки запроса , тип, закодированный с использованием формы HTML. Этот формат может кодировать только пары ключ-значение. Не существует стандарта для кодирования JSON в строку запроса, отчасти потому, что URL имеют довольно ограниченный объем пространства .

Если вы должны использовать JSON в строке запроса, вам будет намного проще, если вы добавите префикс JSON к имени ключа , так что вы можете, по крайней мере, заставить Django обрабатывать кодировку процента URL. для вас.

* 1014 Е.Г. *

/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=, вам нужно декодировать процент URL, кодирующий себя, с помощью urllib.parse.unquote_plus(), из значения request.META['QUERY_STRING'] :

from urllib.parse import unquote_plus
import json

json_string = unquote_plus(request.META['QUERY_STRING'])
data = json.loads(json_string)
0 голосов
/ 12 марта 2019

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