将消息放入Azure队列

8 投票
3 回答
4979 浏览
提问于 2025-04-18 11:50

我按照Azure Python SDK上提供的步骤,把消息放进Azure队列里。当我尝试把消息放入队列时,

from azure.storage import QueueService
queue_service = QueueService(account_name, account_key)
queue_service.put_message('taskqueue', 'Hello world!')

消息确实放进了队列,但内容是空的。希望能得到一些帮助。

3 个回答

3

这里的问题是编码格式。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!'))
4

我遇到过这样的情况,它是这样工作的。

message = base64.b64encode(json.dumps(custom_logentry).encode('utf-8')).decode('utf-8')

后来我发现了一个设置队列服务实例编码功能的类似方法。

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!'))

源代码在这里。 https://github.com/Azure/azure-storage-python/blob/master/azure-storage-queue/azure/storage/queue/models.py

其他选项包括binary_base64encode和text_xmlencode等,具体取决于你的数据使用什么编码。

6

看起来官方的文档需要更新了。我们需要对字符串进行编码,而这个在文档里没有提到。

下面的代码我测试过,能正常工作:

    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,方法名已经改了。

  • 所有的测试都是在Python 3.9下进行的。

撰写回答