【发布时间】:2019-11-22 14:21:12
【问题描述】:
我有一个按钮,“查看采购订单”,点击它会发送一个 ajax 帖子。提交帖子后,将从保管箱下载一个文件并保存到名为“temp_files”的目录中。这个动作效果很好。但是,代码不遵循重定向到下载文件 url。
我已经尝试告诉 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)
这是成功下载文件并将其保存在 temp_files 目录中的 helpers.Dropbox_Excel_Worker 函数。
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。我不确定为什么,但这些信息可能会有所帮助。在任何一种情况下,文件都不会开始下载。 编辑:我有它,所以它总是返回 GET 的 excel 文件。我仍然可以使用 chrome 的开发人员工具在网络选项卡中找到并下载它。但它仍然不会自动返回文件。
【问题讨论】: