我按照给出的详细信息将消息放入Azure Python SDK的azure队列中。当我尝试将消息放入队列时,
from azure.storage import QueueService
queue_service = QueueService(account_name, account_key)
queue_service.put_message('taskqueue', 'Hello world!')
消息放入队列但是为空。任何帮助将不胜感激。
答案 0 :(得分:2)
这里的问题是编码格式。 python的默认编码格式是“ASCII”,而消息需要在放入队列之前以base-64格式编码。以下代码完成了这项工作。
from azure.storage import QueueService
import base64
queue_service = QueueService(account_name, account_key)
queue_service.put_message('taskqueue', base64.b64encode('Hello world!'))
答案 1 :(得分:2)
我遇到了这种情况,它像这样工作。
message = base64.b64encode(json.dumps(custom_logentry).encode('utf-8')).decode('utf-8')
后来我发现了一种设置QueueService实例的编码功能的等效方法
from azure.storage.queue import QueueService, QueueMessageFormat
queue_service = QueueService(account_name, account_key)
queue_service.encode_function = QueueMessageFormat.text_base64encode
queue_service.put_message('taskqueue', base64.b64encode('Hello world!'))
其他选项包括binary_base64encode和text_xmlencode等,具体取决于数据使用的编码方式。
答案 2 :(得分:1)
似乎官方文档[1]需要更新。我们需要对文档中缺少的字符串进行编码。
在代码下方,我为我测试并工作:
from azure.storage.queue import (
QueueClient,
BinaryBase64EncodePolicy,
BinaryBase64DecodePolicy
)
...
queue_client = QueueClient.from_connection_string(
AZURE_STORAGE_CONNECTION_STRING,
QUEUE_NAME
)
# Setup Base64 encoding and decoding functions
queue_client.message_encode_policy = BinaryBase64EncodePolicy()
queue_client.message_decode_policy = BinaryBase64DecodePolicy()
message = 'Hello World'
message_bytes = message.encode('ascii')
queue_client.send_message(
queue_client.message_encode_policy.encode(content=message_bytes)
)
我们不能直接将字符串用于 queue_client.message_encode_policy.encode 甚至普通的 base64.b64encode('hello')方法,因为字节喜欢对象是必需的。
In [6]: base64.b64encode('hello')
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-6-b1f43373737a> in <module>
----> 1 base64.b64encode('hello')
/usr/local/Cellar/python@3.9/3.9.0_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/base64.py in b64encode(s, altchars)
...
TypeError: a bytes-like object is required, not 'str'
另外,上面的代码使用的是最新的SDK [2],方法名称已更改。
所有内容都在Python 3.9下进行了测试