当前位置: 首页 > 知识库问答 >
问题:

如何使用Python中Azure函数的Azure blob存储绑定将JSON数据上载到Azure存储blob

寇开畅
2023-03-14

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

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

我正在一个带有HTTP触发器的Azure函数中测试此功能。我通过输入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}.")

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

价值函数。“退出”是不可订阅的

我错过了什么?

共有1个答案

涂飞航
2023-03-14

您想要的是字节str,而不是输入流,如下所示:

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()返回一个字典,出于某种原因,输出blob。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}")

这应该行得通(至少在funcversion2.7.1948上可以)。

 类似资料:
  • 我是Azure Databricks的新手,我的导师建议我在 https://aischool.microsoft.com/en-us/machine-learning/learning-paths/AI-platform-engineering-bootcamps/custom-machine-learning-bootcamp 据我所知,Azure Blob存储还没有设置,因此我运行的代码(以

  • 我正在尝试创建一个Azure Function(. NET核心)以从存储帐户检索SaS,并且难以理解为什么我无法访问存储。 函数签名: 索引方法“GetBlobSaS”Microsoft时出错。蔚蓝色的网络作业。主机:无法将参数“storage”绑定到类型StorageAccount。确保绑定支持参数类型。如果您使用的是绑定扩展(例如Azure Storage、ServiceBus、Timers等

  • 我需要将特定的Postgres表定期自动备份到Azure blob存储中。< br >我使用“Azure database for Postgres”作为数据库。< br >在这种情况下,我有一个包含数百万时间序列数据的表。因此,我按天对数据进行了分区。现在,我只想保留最近几天的分区并分离 对于正常的数据库操作,我使用的是用C#编写的azure函数(使用NPgsql nuget包)。 有没有办法以

  • 我正在创建多个 Azure 函数(HTTP 触发器)来从 blob 存储中获取内容,获取单个 blob 的几个元数据值,并获取特定 blob 类型的所有元数据属性。 我对使用绑定与使用blob存储的rest API与azure-storage sdk感到困惑。 创建azure函数时使用哪种方法最好?如果您能给我指出一些此类示例留档,那也会很有帮助。谢谢你。

  • 告诉我如何在Azure存储帐户中存储PostgreSQL数据库数据。PostgreSQL部署到Azure容器实例。当我重新启动Azure容器实例时,所有数据都会消失。Dockerfile 来自Timescale/Timescaledb:Latest-PG12 az容器创建--resource-group test-env--name test-env--image test-env.azureca

  • 我已经定义了一个Azure函数,它使用Azure存储队列触发器和Blob输入绑定。我已经为队列触发器准备了一个POCO,但是如何在blob输入绑定中将该POCO与绑定表达式一起使用呢? 建筑: Azure功能2。x POCO: Azure功能: 队列消息: 错误消息: 系统私有的CoreLib:执行函数profileImageUpload时发生异常。微软蔚蓝色的WebJobs。主机:异常绑定参数“