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

/some_path?some_key=some_value'

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

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


当前回答

在原始python中解析它:

path = '/some_path?k1=v1&k2=v2&k3=v3'
_, query_string = path.split('?')
params  = dict(param.split('=') for param in query_string.split('&'))
print(params)

输出:

{'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}

其他回答

我发现对于Tornado的用户来说没有答案:

key = self.request.query_arguments.get("key", None)

此方法必须在派生自以下处理程序的处理程序中工作:

tornado.web.RequestHandler

当无法找到所请求的键时,此方法将返回None。这为您节省了一些异常处理。

没有必要做这些。只有

self.request.get('variable_name')

注意,我没有指定方法(GET、POST等)。这是一个很好的例子

你使用Django模板这一事实并不意味着Django也会处理这个处理器

import urlparse
url = 'http://example.com/?q=abc&p=123'
par = urlparse.parse_qs(urlparse.urlparse(url).query)

print par['q'][0], par['p'][0]

这里的大多数答案建议使用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'}

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)

希望这能有所帮助