我正在使用以下语法创建一个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}这似乎可以作为一种解决办法,但有没有更好的解决方法?
发布于 2020-03-01 18:11:10
密码是传输连接中需要安全引用的部分。
将连接的用户名、密码、主机名存储为环境变量,并在应用程序中读取它们。
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}'https://stackoverflow.com/questions/60394534
复制相似问题