给定如下的URL,如何解析查询参数的值?例如,在本例中,我想要some_key的值。

/some_path?some_key=some_value'

我在我的环境中使用Django;请求对象上是否有可以帮助我的方法?

我尝试使用self.request.get('some_key'),但它没有返回值some_value,因为我希望。


当前回答

def getParams(url):
    params = url.split("?")[1]
    params = params.split('=')
    pairs = zip(params[0::2], params[1::2])
    answer = dict((k,v) for k,v in pairs)

希望这能有所帮助

其他回答

import cgitb
cgitb.enable()

import cgi
print "Content-Type: text/plain;charset=utf-8"
print
form = cgi.FieldStorage()
i = int(form.getvalue('a'))+int(form.getvalue('b'))
print i

这里的大多数答案建议使用parse_qs来解析URL字符串。这个方法总是以列表的形式返回值(而不是直接以字符串的形式),因为一个参数可以出现多次,例如:

http://example.com/?foo=bar&foo=baz&bar=baz

将返回:

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

这有点不方便,因为在大多数情况下,您要处理的URL没有多次具有相同的参数。该函数默认返回第一个值,如果有多个元素,则只返回一个列表。

from urllib import parse

def parse_urlargs(url):
    query = parse.parse_qs(parse.urlparse(url).query)
    return {k:v[0] if v and len(v) == 1 else v for k,v in query.items()}

例如,http://example.com/?foo=bar&foo=baz&bar=baz将返回:

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

这不是Django特有的,而是一般的Python。关于Django的具体答案,请看来自@jball037的这个

Python 2:

import urlparse

url = 'https://www.example.com/some_path?some_key=some_value'
parsed = urlparse.urlparse(url)
captured_value = urlparse.parse_qs(parsed.query)['some_key'][0]

print captured_value

Python 3:

from urllib.parse import urlparse
from urllib.parse import parse_qs

url = 'https://www.example.com/some_path?some_key=some_value'
parsed_url = urlparse(url)
captured_value = parse_qs(parsed_url.query)['some_key'][0]

print(captured_value)

Parse_qs返回一个列表。[0]获取列表的第一项,因此每个脚本的输出是some_value

下面是Python 3的'parse_qs'文档

我不想搞砸额外的库。这里建议的简单方法也没有奏效。最后,不是在请求对象上,但我可以通过self.GET.get('XXX')获得一个get参数,没有所有的麻烦:

...
def get_context_data(self, **kwargs):
    context = super(SomeView, self).get_context_data(**kwargs)
    context['XXX'] = self.GET.get('XXX')
...

Python 2.7.18, Django 1.11.20

urlparse模块提供了你需要的一切:

urlparse.parse_qs ()