如何通过 Python 中的 Flask 传递内存中的 Azure Blob
Posted
技术标签:
【中文标题】如何通过 Python 中的 Flask 传递内存中的 Azure Blob【英文标题】:How to pass an Azure Blob in memory through Flask in Python 【发布时间】:2021-06-09 17:50:05 【问题描述】:我在 python 和一般编程方面都是新手。我在这里的 Terraform Private Registry API 已经取得了相当大的进展。
我的情况是,我从 Azure Blob 存储中提取一个 zip,代码托管在托管标识 azure Web 应用程序中,并且它具有对该 blob 的权限。
本质上发生的事情是我将它拉下来,然后通过 send_file 传递出去。
但是,我不得不将它写入一个临时目录,该目录仍然存在。
所以最终,如果没有清理任务,这将填满垃圾文件。
我试图弄清楚如何在内存中完成这一切,或者使用临时文件和上下文,但它不起作用。当它到达 send_file 部分时,即使我把它放在 With 中,它也会传递垃圾或者说文件路径不存在。
感觉这应该是很有可能的,所以我希望有人可以指导我,甚至只是告诉我。我花了几个小时试图找出 iobytes 样式的流方法,但它有点超出我的能力,所以希望能得到帮助。
我什至会选择一种自动清理目录的方法,但据我了解,在 Flask 函数的 return 部分之后,你已经完成了,在它触发之后什么都没有。
@app.route('/v1/modules/<namespace>/<name>/<provider>/<version>/local.zip', methods=['GET'])
def downloadfile(namespace, name,provider,version):
bloburl = f'azblobstoragehost/azcontainer/v1/modules/namespace/name/provider/version/local.zip'
token_credential = DefaultAzureCredential()
blob_client = BlobClient.from_blob_url(bloburl, credential=token_credential)
download_stream = blob_client.download_blob()
# create a temporary directory using the context manager
#f = tempfile.TemporaryDirectory(dir = "temp")
f = tempfile.mkdtemp(dir = "temp") #this one works
with open(f'f/local.zip', "wb") as my_blob:
download_stream = blob_client.download_blob()
my_blob.write(download_stream.readall())
return send_file(f'my_blob.name')
【问题讨论】:
不需要先下载blob;除了流式传输 blob 内容之外,您还可以将 uri 返回到 blob,这允许内容直接从 blob 流式传输到客户端。有关更多信息,请参阅我的回答 here。这个答案不在 python 中,但至少应该给你一个视角。 谢谢@DavidMakogon 我会试一试的。我正在使用 Azure AD 托管标识,它可以使用该方法吗? 您应该能够生成一个共享访问签名,以提供对特定 blob 或容器的临时访问权限。有这方面的文档,所以我建议试一试。 【参考方案1】:感谢我付出了一些努力! 我有点担心使用 sas 以防它被窥探? 实际上有没有办法像我说的那样传递文件,或者没有什么好担心的,sas 不能被窥探和使用?
【讨论】:
以上是关于如何通过 Python 中的 Flask 传递内存中的 Azure Blob的主要内容,如果未能解决你的问题,请参考以下文章
如何使用flask将javascript数组传递给python脚本[使用flask示例]