【问题标题】:How to create download API to download files using python flask如何创建下载 API 以使用 python 烧瓶下载文件
【发布时间】:2021-05-25 14:27:46
【问题描述】:

我有一个 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_with_sas 中的azure 容器获取blob 下载url 的代码。现在我想以这样的方式制作这个 API,如果我们点击它,它应该自动从 url 下载文件。所以为此我想添加urlopen(url_with_sas) 它将打开网址。但似乎它不起作用。任何人都可以为此提出一些建议。谢谢

【问题讨论】:

  • 您是要下载它以便客户端下载文件还是应该将其保存在服务器上?您是否尝试过使用requests.get(url, allow_redirects=True),我从未在这种情况下使用过urlopen tbh
  • @shiny 是的,我正在尝试下载。此 API 将与按钮集成,因此用户将单击该按钮并将文件下载到他的浏览器中。让我试试你的建议
  • @shiny 没用
  • 好的,让我设置你的代码并尝试一下
  • @shiny 谢谢它与重定向工作得很好。在我的问题中,我修改了帐户名和密钥,这就是它不起作用的原因。如果你能回答,我会接受。谢谢

标签: python api flask download


【解决方案1】:

正如评论中提到的,解决方案是通过return redirect(url_with_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)

【讨论】:

    猜你喜欢
    • 2014-08-25
    • 2021-07-15
    • 1970-01-01
    • 2020-12-27
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 2016-07-26
    • 1970-01-01
    相关资源
    最近更新 更多