从 URL 检索参数

2025-01-13 08:52:00
admin
原创
122
摘要:问题描述:给定如下 URL,我该如何解析查询参数的值?例如,在本例中我想要的值some_key 。/some_path?some_key=some_value' 我在我的环境中使用 Django;request对象上有没有可以帮助我的方法?我尝试使用self.request.get('some_key'),但...

问题描述:

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

/some_path?some_key=some_value'

我在我的环境中使用 Django;request对象上有没有可以帮助我的方法?

我尝试使用self.request.get('some_key'),但它并没有像我所希望的那样返回值some_value


解决方案 1:

这不是针对 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”文档

解决方案 2:

我很震惊这个解决方案还没有出现在这里。使用:

request.GET.get('variable_name')

这将从“GET”字典中“获取”变量,如果存在则返回“variable_name”值,如果不存在则返回 None 对象。

解决方案 3:

对于 Python > 3.4

from urllib import parse
url = 'http://foo.appspot.com/abc?def=ghi'
query_def=parse.parse_qs(parse.urlparse(url).query)['def'][0]

解决方案 4:

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]

解决方案 5:

有一个名为 furl 的新库。我发现这个库是执行 url 代数运算最符合 Python 风格的库。安装方法:

pip install furl

代码:

from furl import furl
f = furl("/abc?def='ghi'") 
print f.args['def']

解决方案 6:

我知道这有点晚了,但因为我今天发现自己在这里,所以我认为这对其他人来说可能是一个有用的答案。

import urlparse
url = 'http://example.com/?q=abc&p=123'
parsed = urlparse.urlparse(url)
params = urlparse.parse_qsl(parsed.query)
for x,y in params:
    print "Parameter = "+x,"Value = "+y

使用 parse_qsl(),“数据将作为名称、值对的列表返回。”

解决方案 7:

在纯 Python 中:

def get_param_from_url(url, param_name):
    return [i.split("=")[-1] for i in url.split("?", 1)[-1].split("&") if i.startswith(param_name + "=")][0]

解决方案 8:

您引用的 URL 是查询类型,我看到请求对象支持一种名为参数的方法来获取查询参数。您可能还想self.request.get('def')直接尝试从对象中获取值。

解决方案 9:

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)

希望这有帮助

解决方案 10:

没有必要做任何这些。只有

self.request.get('variable_name')

请注意,我没有指定方法(GET、POST 等)。这有据可查,这是一个例子

事实上,你使用 Django 模板并不意味着处理程序也会由 Django 处理

解决方案 11:

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

urlparse.parse_qs()

解决方案 12:

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

解决方案 13:

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

解决方案 14:

有一个很好的库 w3lib.url

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

解决方案 15:

在原始 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'}

解决方案 16:

顺便说一句,我在使用 parse_qs() 和获取空值参数时遇到了问题,并且了解到您必须传递第二个可选参数“keep_blank_values”才能返回查询字符串中不包含任何值的参数列表。它默认为 false。一些糟糕的 API 要求参数存在,即使它们不包含任何值

for k,v in urlparse.parse_qs(p.query, True).items():
  print k

解决方案 17:

参数 = dict([part.split('=') for part in get_parsed_url[4].split('&')])

这个很简单。变量参数将包含所有参数的字典。

解决方案 18:

我发现 Tornado 用户没有答案:

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

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

tornado.web.RequestHandler

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

解决方案 19:

我不想使用额外的库。这里建议的简单方法也没有用。最后,不是在请求对象上,但我可以通过以下方式轻松获取 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

解决方案 20:

您只能使用 request.GET.get() 方法

urls.py:

    path('some_path', views.func),

视图.py:

def func(request):
    some_key = request.GET.get('some_key', None)
    ...

解决方案 21:

不使用 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']
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用