Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用python创建下载API来下载文件_Python_Api_Flask_Download - Fatal编程技术网

如何使用python创建下载API来下载文件

如何使用python创建下载API来下载文件,python,api,flask,download,Python,Api,Flask,Download,我有一个python代码,它提供了从azure blob存储中下载图像文件的url。如果我们在浏览器中复制粘贴此url,它只需下载文件。我必须创建一个下载api,当调用它时,它将简单地下载文件。以下是我目前拥有的代码: from urllib.request import urlopen from flask import Flask, jsonify import uuid from flask_cors import CORS from datetime import datetime fr

我有一个python代码,它提供了从azure blob存储中下载图像文件的url。如果我们在浏览器中复制粘贴此url,它只需下载文件。我必须创建一个下载api,当调用它时,它将简单地下载文件。以下是我目前拥有的代码:

from urllib.request import urlopen
from flask import Flask, jsonify
import uuid
from flask_cors import CORS
from datetime import datetime
from azure.storage.blob import generate_blob_sas, AccountSasPermissions
import datetime
from datetime import timedelta


app = Flask(__name__)
CORS(app)

uid_secret_key = str(uuid.uuid4())

app.secret_key = uid_secret_key

# Make the WSGI interface available at the top level so wfastcgi can get it.
wsgi_app = app.wsgi_app


@app.route('/download')
def download():
    account_name = "deeusblobstorage"
    container_name = "rperodct"
    blob_name = "face_1_7285.jpg"
    account_key = "hMlIRXCjAomfDRfied8Y5FPwTVnWEkEDuVsw//CQtkiOdcFD/y5wUcxH9Ou7Ni+DtDQFwe23YbZ3Qia9gw=="
    url = f"https://{account_name}.blob.core.windows.net/{container_name}/{blob_name}"
    sas_token = generate_blob_sas(
        account_name=account_name,
        account_key=account_key,
        container_name=container_name,
        blob_name=blob_name,
        permission=AccountSasPermissions(read=True),
        expiry=datetime.datetime.utcnow() + timedelta(hours=1)
    )

    url_with_sas = f"{url}?{sas_token}"
    print(url_with_sas)
    urlopen(url_with_sas)


@app.route('/')
def hello_world():
    return jsonify({'Status': 'ok', 'date': '05.25.21'}), 200


if __name__ == '__main__':
    import os

    HOST = os.environ.get('SERVER_HOST', 'localhost')
    try:
        PORT = int(os.environ.get('SERVER_PORT', '5555'))
    except ValueError:
        PORT = 5555
    app.run(HOST, PORT)

/download
api包含一段代码,该代码以变量名
url\u with_sas
从azure容器获取blob的下载url。现在,我想让这个API在这样一种方式,如果我们点击这个,它应该自动从url下载文件。因此,我考虑添加
urlopen(url\u with_sas)
,它将打开url。但它似乎不起作用。有人能给我一些建议吗。谢谢

正如前面提到的评论一样,解决方案是通过
返回重定向(url\u with\u sas)
整个函数如下所示:

@app.route('/download')
def download():
    account_name = "deeusblobstorage"
    container_name = "rperodct"
    blob_name = "face_1_7285.jpg"
    account_key = "hMlIRXCjAomfDRfied8Y5FPwTVnWEkEDuVsw//CQtkiOdcFD/y5wUcxH9Ou7Ni+DtDQFwe23YbZ3Qia9gw=="
    url = f"https://{account_name}.blob.core.windows.net/{container_name}/{blob_name}"
    sas_token = generate_blob_sas(
        account_name=account_name,
        account_key=account_key,
        container_name=container_name,
        blob_name=blob_name,
        permission=AccountSasPermissions(read=True),
        expiry=datetime.datetime.utcnow() + timedelta(hours=1)
    )

    url_with_sas = f"{url}?{sas_token}"
    return redirect(url_with_sas)

您是要下载文件以便客户端下载文件,还是应该将其保存在服务器上?您是否尝试过使用
requests.get(url,allow\u redirects=True)
,我从未在这种情况下使用过urlopentbh@shiny是的,我正在尝试下载。此API将与一个按钮集成,因此用户将单击该按钮,文件将在其浏览器上下载。让我试试你的suggestion@shiny没用,好吧,让我设置你的代码,然后再试一次something@shiny谢谢,重定向效果很好。在我的问题中,我修改了帐户名和密钥,这就是它不起作用的原因。如果你能回答,我就接受。谢谢