【问题标题】:How to get request parameters from an encoded URL in Django?如何从 Django 中的编码 URL 获取请求参数?
【发布时间】:2019-08-03 08:25:06
【问题描述】:

我正在使用 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 # Should yield a dict -> {foo=[bar,baz]}

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

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

【问题讨论】:

  • 你为什么要这样发送数据?能改吗?
  • 之所以以那种形式接收数据,是因为API接收了大量的输入参数。我无法改变这一点,因为我不拥有我客户的代码。即使我这样做了,这仍然是禁止 POST 的最佳方式。
  • 在 URL 中发送结构化表单参数没有标准,因此request.query_params 不能只解析声称包含结构的随机格式。我们只有url-encoded query parameters,其中包含一系列name=value 对,由& 分隔。
  • 所以你真正应该做的是to prefix the json string with a key name,所以它至少可以被提取为另一个查询参数。请注意,URL 有一个rather low length limit

标签: python json django django-rest-framework urlencode


【解决方案1】:

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 百分比编码。

例如

/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)

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-20
      • 1970-01-01
      • 2012-09-16
      • 2019-07-27
      • 1970-01-01
      • 2011-05-08
      • 1970-01-01
      相关资源
      最近更新 更多