首页 > 解决方案 > 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

它一直到应该返回响应的地步,然后什么也没有发生。没有警告或错误,它似乎只是默默地完成,而不会触发客户端的下载。我猜我需要做一些不同的事情来返回文件,但我无法确定那是什么。

标签: pythonjquerydjangoajax

解决方案


推荐阅读