python - Python Django 使用 Ajax 将文件下载到客户端机器
问题描述
我正在尝试通过 jQuery Ajax 调用将 CSV 文件从服务器下载到客户端计算机,但由于某种原因,返回响应没有触发下载。我知道还有其他几个非常相似的问题,但是,它们都没有专门将 ajax 与 Django 一起使用(我发现了),所以我不确定是否需要做一些不同的事情。我能找到的最接近的是这个:使用 ajax 请求下载文件,成功时将 window.location 设置为 download.php 文件,但这似乎并不适用。我能够找到的所有内容,包括 django 文档,都使用了一些与我所拥有的非常相似的方法,但是我尝试过的每个变体都会产生或多或少相同的结果 - 没有下载任何内容。
我已经确认除了views.py 中的最后一个步骤之外,该过程的每个步骤都正确执行。
下载页面.html:
{% extends 'base.html' %}
{% load staticfiles %}
<script>
$(function() {
$('#download').on('click', function () {
var pk = $(this).val();
$.ajax({
url: '/ajax/download/',
data: {'pk': pk}
});
});
});
</script>
{% block body %}
...
<button id="download" value="{{ view_id }}">Download</button>
...
{% endblock %}
网址.py:
urlpatterns = [
...
url(r'^ajax/download/', views.download, name='download'),
...
]
视图.py:
import pathlib2
from django.http import HttpResponse
from src.apps.main.models import DataModel
def download(request):
pk = request.GET.get('pk', None)
fname, fpath = DataModel.export_to_csv(pk) # does the export and returns fullpath to file
if pathlib2.Path(fpath).exists():
file_download = open(fpath, 'r')
response = HttpResponse(file_download, content_type='application/csv')
response['Content-Disposition'] = 'attachment; filename="{}"'.format(fname)
return response
它一直到应该返回响应的地步,然后什么也没有发生。没有警告或错误,它似乎只是默默地完成,而不会触发客户端的下载。我猜我需要做一些不同的事情来返回文件,但我无法确定那是什么。
解决方案
推荐阅读
- python-3.x - 通过 Python3 在 Linux 中关闭屏幕
- php - 在给定文本中查找 PHP 中特定对象的模式
- macos - 无法 mkbundle 可以在 MacOS 上成功运行和代码签名的 Mach-o 可执行文件
- generics - 是否可以在具有泛型参数和返回类型的结构中使用闭包?
- jberet - BeanIO 项目阅读器评论需要 reader.markSupported() 返回 true
- postgresql - Postgres SQL - 将子句输出到标量变量
- authentication - 如何在我的新 Asp.net 核心 Web API 中从旧数据库中验证用户?
- airflow - sqlite3.OperationalError: no such table: dag when running in tox environment
- python - PyInstaller & Pymeasure : NotImplementedError
- c# - VS 更新后 SigninManager.SignOutAsync() 在 IIS Express 中不起作用