Я создаю приложение 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}
В качестве обходного пути это нормально, но есть ли лучшее решение?