【问题标题】:Best way to get query string from a URL in python?从python中的URL获取查询字符串的最佳方法?
【发布时间】:2012-07-01 09:36:04
【问题描述】:

我需要从这个 URL https://stackoverflow.com/questions/ask?next=1&value=3 获取查询字符串,我不想使用 request.META。我发现还有两种获取查询字符串的方法:

  1. 使用 urlparse urlparse.urlparse(url).query

  2. 使用网址编码 使用 urlencode 并将 request.GET params 字典传入其中以获取字符串表示形式。

那么哪种方式更好呢?我的同事更喜欢 urlencode,但没有提供令人满意的解释。他们声称 urlparse 在内部调用 urlencode,这是我不确定的,因为 urlencode 存在于 urllib 模块中。

【问题讨论】:

    标签: python django comparison urlencode urlparse


    【解决方案1】:

    您可以像这样使用 GET 参数制作查询字符串

    request.GET.urlencode()
    

    这不包括? 前缀,并且它可能不会以与原始请求相同的顺序返回密钥。

    【讨论】:

    • 需要注意的是,由于 QueryDict 包装了一个无序的字典,request.GET.urlencode() 可能不会按照它们在原始请求 URI 中出现的顺序返回键。
    • 这实际上是字典的基础。此外,如果大多数查询字符串是键控的,则应将其视为无序的。如果它是一个真实的列表,它将被排序。
    【解决方案2】:

    第三个选项:

    >>> from urlparse import urlparse, parse_qs
    >>> url = 'http://something.com?blah=1&x=2'
    >>> urlparse(url).query
    'blah=1&x=2'
    >>> parse_qs(urlparse(url).query)
    {'blah': ['1'], 'x': ['2']}
    

    在 Python 3+ 中,这可以作为:

    from urllib.parse import parse_qs
    

    Documentation for urllib.parse

    【讨论】:

    • 好的,不太清楚为什么您想要查询字符串而不对其进行处理,但使用 urlparse 是最易读和易于理解的方式。
    • 这对我很有帮助 - 我需要一个包含请求 URL 参数的地图(或一些对象)!
    【解决方案3】:

    我更喜欢使用

    request.META['QUERY_STRING']
    

    来自文档:

    https://docs.djangoproject.com/en/stable/ref/request-response/#django.http.HttpRequest.META

    这不包括? 前缀。

    【讨论】:

      猜你喜欢
      • 2012-04-24
      • 2012-11-25
      • 1970-01-01
      • 2020-07-10
      • 2020-10-04
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      相关资源
      最近更新 更多