我想使用 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
我错过了什么?
最佳答案
您需要 bytes
或 str
,而不是 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对于 str
和 this 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/