【问题标题】:Pushing Azure Blob Storage Data directly into a POST request using Python使用 Python 将 Azure Blob 存储数据直接推送到 POST 请求中
【发布时间】:2021-01-07 02:45:56
【问题描述】:

我正在努力将数据从 Azure Blob 发送到接受 POST 请求以上传应为 xlsx 或 csv 格式的文件的平台。

为了使我的代码正常工作,首先需要使用 open() 库将 blob 数据写入文件,然后将文件作为 io.BufferedReader 读回算法中 然后可以在 requests.post 文件参数中使用它,这是一个 json

问题: 我的问题是我需要使用 azure function app 在生产环境中运行此代码。应用程序不允许我简单地使用 os 和 open() 我尝试使用 io.BytesIO 从 blob 获取字节数据,但 API 无法将其识别为 csv 或 xlsx 文件

有没有办法使用内存中的数据并将其用于 POST 请求?

这是我的代码:

# GETTING BLOB DATA AND UPLOADING IT USING POST REQUEST

from datetime import datetime, timezone, timedelta
import requests
import json
import os
from requests.auth import HTTPBasicAuth
from azure.storage.blob import BlobClient

# Get excel or csv file from azure blob storage (stored as blob)

# 1. Getting the blob data
connect_str = os.getenv("AZURE_STORAGE_CONNECTION_STRING") # Hard coding key when in production
container_name = 'CONTAINER_NAME'
blob_name = 'TEST.xlsx'
blob_client = BlobClient.from_connection_string(connect_str,container_name,blob_name)
data = blob_client.download_blob()

# Writing the Data into a file and then
# Reading back into the program to create
# io.BufferedReader <name='TEST.xlsx'> object for POST request

with open(blob_name,'wb') as file_content:
    file_content.write(data.readall())
    file_content.close()

f_data = open(blob_name,'rb')

_id = 'jkdfhiuweh93o0' # list_id for post request
file_name = "TEST"
url = "https://platform.com/api/uploadFile" # API endpoint
auth = {"X-Gatekeeper-SessionToken": "915760344f3a450e83e5fae98a78d87e"}
body = {"id": _id,'listname':file_name}

# Making a POST request and uploading the data
file_upload = requests.post(url, headers=auth, files=f_data, data=body)
print(file_upload.json())

我一直在寻找解决方案好几个星期,但没有运气...... 非常感谢任何 cmets 和帮助。

【问题讨论】:

  • 你好。由于您正在运行python。你试过直接使用pypi.org/project/azure-storage-blob
  • 感谢@Jean-MarcVolle 的回复 是的,我已经使用了该库,它也只显示了一种下载文件的方法。正如我所解释的,我似乎无法在 azure function app 中使用 os 来临时下载和上传文件。
  • 你指的azure函数应用是什么?
  • 我在此处发布的代码将成为基于 HTTP 触发器的函数应用程序 (docs.microsoft.com/en-us/azure/azure-functions/…) 的一部分。因此代码将嵌入 init.py 文件中,并在调用 GET 请求到 azure 函数应用时执行。我只需要一种从 blob 获取数据的方法,将其转换为 io.BufferedReader 并将该文件添加到 POST 请求中,而无需保存和读取文件
  • 能否请您提供有关您的帖子 api 的代码?

标签: python-3.x azure python-requests azure-blob-storage azure-function-app


【解决方案1】:

最后,使用requests.post并嵌入一个不是从网上获取的文件的方法是使用tempfile库。

解决办法

import tempfile, requests, json
from azure.storage.blob import BlobClient

token = {"X-Gatekeeper-SessionToken": "2444e9b6e3544cae6d8e9e6f4a5894"}
connect_str = '<Connection String - App Key 1>' # Obtained from azure storage account
container_name = '<Container Name>'
blob_name = "TEST.xlsx"
blob_client = BlobClient.from_connection_string(connect_str,container_name,blob_name)
data = blob_client.download_blob()

file_name = blob_name.split(".")[0]
file_format = blob_name.split(".")[-1]

# Temporarily Storing file in temp directory
temp_file = tempfile.NamedTemporaryFile('w+b', prefix=file_name, suffix="."+file_format)
temp_file.write(data.readall())
access_file = open(temp_file.name,'rb')

f_data = {'file':access_file,'Name':blob_name}

_id = 12345 #Each list (TEST.xlsx) has an id associated with it
if _id == 404:
    body = {"listname":file_name}
else:
    body = {"id": _id,'listname':file_name}

file_name = blob_name.split(".")[0]

url = "https://manage.fastfieldforms.com/api/lookuplist"


resp = requests.post(url, headers=token, files=f_data, data=body)
print(resp.json())
access_file.close()
temp_file.close()

【讨论】:

  • 感谢分享。这正是我一直在寻找的。最美好的祝愿
猜你喜欢
  • 2021-04-29
  • 2019-03-20
  • 1970-01-01
  • 2020-08-01
  • 2020-04-03
  • 2019-04-12
  • 2019-07-06
  • 2019-01-20
  • 2020-06-07
相关资源
最近更新 更多