从URL中获取参数

250

如何解析以下URL中的查询参数值?例如,在此情况下,我想要some_key的值是多少?

给定类似以下的URL:

http://www.example.com/?foo=bar&baz=qux&some_key=some_value
/some_path?some_key=some_value'
我在我的Django环境中使用;有没有request对象上的方法可以帮助我吗? 我尝试使用self.request.get('some_key'),但它并没有像我希望的那样返回值some_value
21个回答

4

没有必要做任何那样的事情。仅使用

self.request.get('variable_name')

请注意,我没有指定方法(GET、POST等)。这是文档良好的这是一个例子
使用Django模板并不意味着处理程序也由Django处理。

3
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

3

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

2

有一个很好的库w3lib.url

from w3lib.url import url_query_parameter
url = "/abc?def=ghi"
print url_query_parameter(url, 'def')
ghi

2

使用原始的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'}

0

不使用Django并在Python 3.9上尝试。也可以使用以下处理程序代码片段检索:

将URL视为-

http://localhost:8081/api/v1/users?query_key=abcdef12345

并且处理方法如下:

@routes.get('/api/v1/users')
async def handler_users(request):
    query_key = request.url.query['query_key']

0
顺便说一下,我在使用parse_qs()时遇到了问题,无法获取空值参数,并且了解到必须传递第二个可选参数'keep_blank_values'才能返回一个查询字符串中不包含任何值的参数列表。它默认为false。一些糟糕编写的API要求即使参数没有值也必须存在。
for k,v in urlparse.parse_qs(p.query, True).items():
  print k

0
参数 = dict([part.split('=') for part in get_parsed_url[4].split('&')])
这是一个简单的例子。变量参数将包含所有参数的字典。

0

我不想去处理额外的库。这里提出的简单方法也没有奏效。最终,我并没有在请求对象上获取到GET参数,但是我可以通过self.GET.get('XXX')轻松地获得它,而不需要那么麻烦。

...
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


0

我看到没有为Tornado用户提供答案:

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

这个方法必须在派生自以下处理程序内部工作:

tornado.web.RequestHandler

当请求的键无法找到时,此方法将返回“None”作为答案。这样可以节省一些异常处理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接