我有一个“查看采购订单”按钮,单击该按钮会发送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的开发者工具在“网络”标签中找到并下载。它仍然不会自动返回文件。
答案 0 :(得分:0)
所以我最终找到了解决方法。如果有人可以对此进行评论,请这样做。在javascript中,我将ajax成功更改为:
success: function(){
$('#loadingmessage').hide();
location.href = "/tables/purchase_orders/temp_po.xlsx";
现在可以成功下载文件。