python - 如何使用 Python 中 Azure Functions 的 Azure Blob 存储绑定(bind)将 JSON 数据上传到 Azure 存储 Blob

标签 python azure azure-functions azure-blob-storage

我想使用 Python 中的 Azure Functions 将 JSON 数据作为 .json 文件上传到 Azure 存储 blob。

因为我使用的是 Azure Functions 而不是实际的服务器,所以我不想(也可能无法)在本地内存中创建临时文件并使用 Azure Blob 存储客户端库 v2.1 将该文件上传到 Azure Blob 存储对于Python( reference link here )。因此,我想使用 Azure Functions 的输出 blob 存储绑定(bind) ( reference link here )。

我正在使用 HTTP 触发器在 Azure Functions 中对此进行测试。我通过输入 blob 存储绑定(bind)接收 Azure blob(工作正常),对其进行处理,并通过上传覆盖它的新 Azure blob 来更新它(这是我需要帮助的)。我的 function.json 文件如下所示:

{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "authLevel": "anonymous",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "name": "inputblob",
      "type": "blob",
      "path": "{containerName}/{blobName}.json",
      "connection": "MyStorageConnectionAppSetting",
      "direction": "in"
    },
    {
      "name": "outputblob",
      "type": "blob",
      "path": "{containerName}/{blobName}.json",
      "connection": "MyStorageConnectionAppSetting",
      "direction": "out"
    },
    {
      "type": "http",
      "direction": "out",
      "name": "$return"
    }
  ]
}

我的 Python 代码如下所示:

import logging
import azure.functions as func
import azure.storage.blob
from azure.storage.blob import BlobServiceClient, BlobClient, ContainerClient
import json, os

def main(req: func.HttpRequest, inputblob: func.InputStream, outputblob: func.Out[func.InputStream]) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed a request.')

    # Initialize variable for tracking any changes
    anyChanges= False

    # Read JSON file
    jsonData= json.loads(inputblob.read())

    # Make changes to jsonData (omitted for simplicity) and update anyChanges

    # Upload new JSON file
    if anyChanges:
        outputblob.set(jsonData)

    return func.HttpResponse(f"Input data: {jsonData}. Any changes: {anyChanges}.")

但是,这根本不起作用,会引发以下错误 ( screenshot ):

Value 'func.Out' is unsubscriptable

我错过了什么?

最佳答案

您需要 bytesstr,而不是 InputStream,如下所示:

def main(inputblob: func.InputStream, outputblob: func.Out[bytes], context: func.Context):
    ...
    # Write to output blob
    outputblob.set(jsonData)

输入流 represents an input blob .

参见this sample对于 strthis one对于字节

稍后更新:

json.loads() 的调用返回一个字典,并且由于某种原因 outputblob.set() 出现异常,需要一些处理,如下所示:

def main(req: func.HttpRequest,
         inputblob: func.InputStream,
         outputblob: func.Out[bytes]) -> func.HttpResponse:

    jsonData = json.loads(inputblob.read())
    outputblob.set(str(jsonData))

    return func.HttpResponse(f"Input JSON: {jsonData}")

这应该可以工作(它可以在 func 版本上工作 至少2.7.1948)。

关于python - 如何使用 Python 中 Azure Functions 的 Azure Blob 存储绑定(bind)将 JSON 数据上传到 Azure 存储 Blob,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59260913/

相关文章:

python - 无法在 aws lambda 上导入 lxml etree

python - glob 文件用作 python 脚本中 python 脚本的输入。

c# - 用于挂载azure云驱动器的控制台应用程序

c# - log4net 从自定义 appender 访问上下文属性

c# - Application Insights 上未显示异常详细信息

python - subprocess.Popen 系统属性 arg 中的空格

python - 合并公共(public)键中具有相同值的多个字典列表

Azure DevOps,如何在 DevOps 待办事项中添加 "Work Item type"

azure - 无法连接到 "Jenkins-On-Azure"

azure - 依赖注入(inject)容器是否在同一个包中的 azure 函数之间共享?