繁体   English   中英

如何在 Python 中使用 Azure Functions 的 Azure Blob 存储绑定将 JSON 数据上传到 Azure 存储 blob

[英]How to upload JSON data to Azure storage blob using Azure Blob storage bindings for Azure Functions in Python

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

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

我正在使用 HTTP 触发器在 Azure Functions 中对此进行测试。 我通过输入 blob 存储绑定(工作正常)接收 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}.")

但是,这根本不起作用,抛出以下错误(截图):

值 'func.Out' 是不可订阅的

我错过了什么?

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

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

InputStream 表示输入blob

这个样本str这一次bytes

稍后更新:

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 )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM