python urllib:构建URL,包括带关键字和不带关键字的参数
我正在python中使用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 =
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¶meter2=value2&kiosk&other_parameter