Django 实现文件下载的方法(包括AJAX方式下载)

一、前端页面反向解析URL的思路

1、主要思路:

文件,让用户下载
    - a标签+静态文件
    - 设置响应头(django如何实现文件下载)

2、a标签实现:

下载模板

3、设置响应头:

方法一:使用HttpResponse

from django.shortcuts import HttpResponse  
def file_down(request):  
    file=open('/home/amarsoft/download/example.tar.gz','rb')  
    response =HttpResponse(file)  
    response['Content-Type']='application/octet-stream'  
    response['Content-Disposition']='attachment;filename="example.tar.gz"'  
    return response

方法二:使用StreamingHttpResponse

from django.http import StreamingHttpResponse  
def file_down(request):  
    file=open('/home/amarsoft/download/example.tar.gz','rb')  
    response =StreamingHttpResponse(file)  
    response['Content-Type']='application/octet-stream'  
    response['Content-Disposition']='attachment;filename="example.tar.gz"'  
    return response

方法三:使用FileResponse

from django.http import FileResponse  
def file_down(request):  
    file=open('/home/amarsoft/download/example.tar.gz','rb')  
    response =FileResponse(file)  
    response['Content-Type']='application/octet-stream'  
    response['Content-Disposition']='attachment;filename="example.tar.gz"'  
    return response

总结:对比
虽然使用这三种方式都能实现,但是推荐用FileResponse,在FileResponse中使用了缓存,更加节省资源。虽说是三种方式,但是原理相同,说白了就是一种方式。为了更好的实现文件下载,FileResponse对StreamingHttpResponse做了进一步的封装,即StreamingHttpResponse是FileResponse的父类。而HttpResponse,StreamingHttpResponse,FileResponse三者都继承了基类HttpResponseBase。HttpResponseBase类是一个字典类,其封装了一个_headers属性,该属性是一个字典类型,里面封装了response的头信息。因为该HttpResponseBase类被封装成了一个字典类,所以可以直接使用response[‘Content-Type’]这种形式访问,也可以使用response._headers[‘Content-Type’]访问。值得注意的是:
1.HttpResponseBase只有来设置response的头信息,并不能返回给客户端发生数据。
2.response.keys()这中形式不能访问到字典的方法,必须使用response._headers.keys()才能访问到字典的方法。

4、项目案例:

1.让公司内部可以批量导入客户资源信息;

2.首先要下载xlsx模板文件;

增加URL:

urlpatterns = [
    url(r'^stark/crm/login/', crm_views.login,name='crm_login'),
    url(r'^stark/crm/index/', crm_views.index,name='crm_index'),
    url(r'^stark/crm/Download/', crm_views.download,name='crm_download'),
]

编写download视图函数:

def download(request):
    file=open('static/xlsx/xlsx_file.xlsx','rb')
    response =FileResponse(file)
    response['Content-Type']='application/octet-stream'
    response['Content-Disposition']='attachment;filename="xlsx_file.xlsx"'
    return response

前端页面反向解析URL




    
    批量导入客户数据



批量导入

下载模板

二、ajax请求下载的思路

下面的方法是个技巧,

AJAX发送参数到后台后,后台处理后,传数据到前台,Ajax在success里面构建了一个from表单, 当后台传来的是文件时,自动点击提交按钮,文件就会被下载。

$.ajax({
    type: "POST",
    url: url,
    data: params,
   success: function(response, status, request) {
            var disp = request.getResponseHeader('Content-Disposition');
            if (disp && disp.search('attachment') != -1) { //判断是否为文件
                var form = $('
'); $('body').append(form); form.submit(); //自动提交 } } });

"CSRF token missing or incorrect."的解决方法

思路:屏蔽CSRF

django工程views.py添加屏蔽装饰器

from django.views.decorators.csrf import csrf_exempt 

@csrf_exempt
def some_view(request):
    #...

参考文献:
1、https://www.cnblogs.com/supery007/p/8146035.html 2019.6.27
2、https://blog.csdn.net/junehappylove/article/details/81287679 2019.6.27
3、https://www.cnblogs.com/zhujiabin/p/8260288.html 2019.6.27

你可能感兴趣的:(python,Django,网站开发)