AJAX发布后使用Flask“ send_from_directory”下载文件的问题

时间:2019-07-12 19:57:08

标签: python flask download

我有一个“查看采购订单”按钮,单击该按钮会发送ajax帖子。提交帖子后,将从Dropbox下载文件并将其保存到名为“ temp_files”的目录中。此操作效果很好。但是,该代码并不遵循重定向到下载文件网址的方式。

我尝试在成功的帖子中告诉ajax遵循重定向,也尝试将文件作为附件返回。都没有工作。我可以在“网络”标签中找到该文件的URL,可以双击并开始下载文件。

以下是处理AJAX发布的路径以及文件下载的路径:

@tables_bp.route('/purchase_orders', methods=['GET', 'POST'])
@login_required
def purchase_orders():
    table = 'purchase_orders'
    # populate render_dict which helps make render_template
    # less verbose
    render_dict = helpers.render_args(table)
    # purchase order form creation
    po_form = PurchaseOrderForm()
... some other code ...
    if request.method == 'POST':
        po = request.form['po']
        oath2 = os.environ.get('OATH2')
        po_folder = os.environ.get('PO_FOLDER')
        helpers.Dropbox_Excel_Worker(
            po_folder, po, oath2, PurchaseOrders
        )
        return redirect(url_for('tables.file_view', filename="temp_po.xlsx"))
... other form handlers below ...
@tables_bp.route('/purchase_orders/<filename>', methods=['GET', 'POST'])
@login_required
def file_view(filename):
    return send_from_directory(current_app.config['TEMP_FILES'], filename)

这是helpers.Dropbox_Excel_Worker函数,该函数已成功下载文件并将其保存在temp_files目录中。

def Dropbox_Excel_Worker(file_folder, po_num, oath2, PurchaseOrders):
    file = "/{}.xlsx".format(po_num)
    try:
        dbx = dropbox.Dropbox(oath2)
        metadata, res = dbx.files_download(file_folder + file)

        with closing(res) as result:
            byte_data = res.content
            file_stream = io.BytesIO(byte_data)

        workbook = openpyxl.load_workbook(file_stream)
        application = current_app._get_current_object()
        with application.app_context():
            file_name = secure_filename("temp_po.xlsx")
            temp_file = os.path.join(current_app.config['TEMP_FILES'], file_name)
            workbook.save(temp_file)

有时烧瓶控制台返回两个:

127.0.0.1 - - [12/Jul/2019 15:49:42] "POST /tables/purchase_orders HTTP/1.1" 302 -
C:\Users\napaf\Desktop\programming\adco_flask\temp_files
127.0.0.1 - - [12/Jul/2019 15:49:42] "GET /tables/purchase_orders/temp_po.xlsx HTTP/1.1" 200 -

有时仅返回成功的POST。我不确定为什么,但是此信息可能会有所帮助。无论哪种情况,文件都不会开始下载。 编辑:我有它,所以它总是返回excel文件的GET。我仍然可以使用chrome的开发者工具在“网络”标签中找到并下载。它仍然不会自动返回文件。

1 个答案:

答案 0 :(得分:0)

所以我最终找到了解决方法。如果有人可以对此进行评论,请这样做。在javascript中,我将ajax成功更改为:

success: function(){
            $('#loadingmessage').hide();
            location.href = "/tables/purchase_orders/temp_po.xlsx";

现在可以成功下载文件。