python urllib:构建URL,包括带关键字和不带关键字的参数

python urllib:构建URL,包括带关键字和不带关键字的参数,python,python-3.x,urllib,Python,Python 3.x,Urllib,我正在python中使用urllib构建grafana链接,如下所示: from urllib.parse import urlencode, urlunsplit parameters = { "parameter1":"value1", "parameter2":"value2" } query = urlencode( query = parameters, doseq =

我正在python中使用
urllib
构建grafana链接,如下所示:

from urllib.parse import urlencode, urlunsplit

parameters = {
    "parameter1":"value1",
    "parameter2":"value2"
}

query = urlencode(
    query = parameters,
    doseq = True
)

link = urlunsplit((
    "https",
    "my_grafana.com",
    "/graph",
    query,
    ""
))
链接
在这种情况下将是
'https://my_grafana.com/graph?parameter1=value1¶meter2=value2“
。我现在想添加没有关键字的参数,例如“kiosk”。链接应该看起来像
'https://my_grafana.com/graph?parameter1=value1¶meter2=value2&kiosk&other_parameter“

由于
urlencode
返回一个字符串,该字符串带有参数,在将其交给
urlunsplit
之前,我可以像下面的示例中那样操作该字符串:

no_keyword_parameters = ["kiosk","other_parameter"]
query = "&".join([query, *no_keyword_parameters])
我想知道您是否可以直接使用
urlencode
将带关键字和不带关键字的参数放在一起。我尝试将“kiosk”作为字典条目,并将
None
作为内容(
{“kiosk”:None}
),但它在url中包含
None
。我给出了元组列表而不是参数字典的方法也没有成功


谢谢您的帮助。

您所做的看起来很好,您可以这样做,也可以在自己的编码函数中对其进行形式化,但是
urllib.parse.urlencode
似乎不理解无值参数的概念。如果您查看(使用
doseq
可以得到与您的问题相关的部分的相同变化):

也就是说,你必须有一个键、值对(解压两个值),它们引用到的任何东西(发生在省略号中)都将是一个
str
连接到
=
。因此,即使通过使用自定义的
qoute\u,也无法真正更改其功能

该链接实现是随CPython提供的,但也是期望的:键/值对,因此行为实际上是指定/记录的:

结果字符串是由“&”字符分隔的一系列键=值对

如所述,
urlencode
使用
k+'='+v
构建查询
您可以手动添加非值参数:

from urllib.parse import urlencode, urlunsplit, quote_plus

parameters = {"parameter1": "value1", "parameter2": "value2"}
no_value_parameters = ["kiosk", "other_parameter"]
no_value_parameters_quoted = [quote_plus(p) for p in no_value_parameters]

query = urlencode(query=parameters, doseq=True)
link = urlunsplit(("https", "my_grafana.com", "/graph", query, ""))
link = f"{link}&{'&'.join(no_value_parameters_quoted)}"
print(link)
输出:


也许graphana可以使用空的
kiosk=
other_参数=
-然后你可以使用
{“kiosk”:“}
@furas:我试过了,但grafana没有这样接受它。
from urllib.parse import urlencode, urlunsplit, quote_plus

parameters = {"parameter1": "value1", "parameter2": "value2"}
no_value_parameters = ["kiosk", "other_parameter"]
no_value_parameters_quoted = [quote_plus(p) for p in no_value_parameters]

query = urlencode(query=parameters, doseq=True)
link = urlunsplit(("https", "my_grafana.com", "/graph", query, ""))
link = f"{link}&{'&'.join(no_value_parameters_quoted)}"
print(link)
https://my_grafana.com/graph?parameter1=value1&parameter2=value2&kiosk&other_parameter