如何正确处理访问密钥中包含'/'字符的 Celery 和 Azure 存储队列?



我正在使用语法创建一个Celery应用程序

celery_app = Celery(
my_config_name,
backend=my_backend,
broker=my_broker,
)

对于my_broker,我使用的是读取的Azure存储帐户的地址

my_broker = "azurestoragequeues://:jrIEoHgyi7y8L7dJ+0CeYGnR9rHLwzMRsKzrmUle7ZL8OA/EaO5aBxqEYSB2VPXJ2v4C58D==@myazurequeue"

请注意,密码位包含一个"/"(这是相应的访问密钥,也可以在Azure门户中读取(。

如果我运行我的代码,我会得到

ValueError: invalid literal for int() with base 10: 'jrIEoHgyi7y8L7dJ+0CeYGnR9rHLwzMRsKzrmUle7ZL8OA'

这与我在中遇到的错误相同

from kombu.utils.url import parse_url
parse_url(my_broker)

一个似乎有效的修复方法是类似的方法

from kombu.utils.url import safequote
my_broker_fixed = "azurestoragequeues://:" + safequote(str.replace(my_broker, "azurestoragequeues://:", ""), safe = "=@")

它只能在访问密钥中编码"/"字符(但不能在地址的其余部分中编码(。当发射parse_url(my_broker)时,这也会很好地解析,因为它会产生

{'hostname': 'myazurequeue',
'password': 'jrIEoHgyi7y8L7dJ+0CeYGnR9rHLwzMRsKzrmUle7ZL8OA/EaO5aBxqEYSB2VPXJ2v4C58D==',
'port': None,
'transport': 'azurestoragequeues',
'userid': None,
'virtual_host': None}

这似乎可以作为一种变通方法,但有更好的解决方案吗?

密码是传输连接中需要安全引用的部分。

将连接的用户名、密码和主机名存储为环境变量,并在应用程序中读取这些变量。

from kombu.utils.url import safequote
TRANSPORT_USER = os.getenv('TRANSPORT_USER'),
TRANSPORT_PASS = safequote(os.getenv('TRANSPORT_PASS')),
TRANSPORT_HOST = os.getenv('TRANSPORT_HOST')
my_broker = f'azurestoragequeues://{TRANSPORT_USER}:{TRANSPORT_PASS}@{TRANSPORT_HOST}'

最新更新