如何正确处理在访问密钥中包含“/”字符的芹菜和Azure存储队列?

2024-10-03 06:23:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用以下语法创建芹菜应用程序

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}

这似乎是一个不错的解决办法,但有更好的解决办法吗


Tags: fromnonebackendurlparsemy地址密钥
1条回答
网友
1楼 · 发布于 2024-10-03 06:23:33

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

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

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}'

相关问题 更多 >