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

8 篇文章 0 订阅
4 篇文章 0 订阅

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

1、主要思路:

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

2、a标签实现:

<a href="/static/xxx.xlsx">下载模板</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

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>批量导入客户数据</title>
</head>
<body>

<h2>批量导入</h2>
<form action="">
    <a href="{% url 'crm_download' %}">下载模板</a>
    <p><input type="file" name="xsfile"></p>
    <p><input type="submit" value="提交"></p>
</form>


</body>
</html>

二、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 = $('<form action="‘ +  url + ’" method="post"></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

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,我们需要安装Djangodjango-widget-tweaks: ``` pip install django pip install django-widget-tweaks ``` 接下来,创建Django项目和应用程序: ``` django-admin startproject progress_bar_project cd progress_bar_project python manage.py startapp progress_bar ``` 在`progress_bar`应用程序中创建一个模型: ```python from django.db import models class Task(models.Model): name = models.CharField(max_length=100) progress = models.IntegerField(default=0) ``` 然后,我们需要创建一个视图函数来处理进度条的更新。在`progress_bar/views.py`中添加以下代码: ```python from django.shortcuts import render from django.http import JsonResponse from django.views.decorators.csrf import csrf_exempt from .models import Task @csrf_exempt def update_progress(request): if request.method == 'POST': task_id = request.POST.get('task_id') progress = request.POST.get('progress') task = Task.objects.get(id=task_id) task.progress = progress task.save() return JsonResponse({'success': True}) ``` 在这个视图函数中,我们使用`JsonResponse`来返回一个JSON格式的响应,通知前端进度条已经更新成功。 接下来,我们需要创建一个模板来渲染进度条。在`progress_bar/templates`目录下创建一个名为`progress_bar.html`的文件,并添加以下代码: ```html {% load widget_tweaks %} {% block content %} <h1>Progress Bar</h1> <form method="POST" id="progress-form"> {% csrf_token %} <input type="hidden" name="task_id" value="{{ task.id }}"> <div class="progress"> <div class="progress-bar" role="progressbar" aria-valuenow="{{ task.progress }}" aria-valuemin="0" aria-valuemax="100" style="width: {{ task.progress }}%;"> {{ task.progress }}% </div> </div> <br> <div class="form-group"> {% render_field progress|add_class:"form-control-range" %} </div> <button type="submit" class="btn btn-primary">Update Progress</button> </form> <script> $(function() { $('#progress-form').submit(function(event) { event.preventDefault(); $.ajax({ type: 'POST', url: '{% url "update_progress" %}', data: $(this).serialize(), success: function(response) { if (response.success) { alert('Progress updated successfully!'); } } }); }); }); </script> {% endblock %} ``` 在这个模板中,我们使用Django Widget Tweaks来渲染进度条的表单元素。我们还使用jQuery和Ajax来处理进度条的更新。当用户提交表单时,我们将进度值发送到服务器上的`update_progress`视图函数进行处理。 最后,我们需要创建一个URL路由来将请求发送到`update_progress`视图函数。在`progress_bar/urls.py`中添加以下代码: ```python from django.urls import path from . import views urlpatterns = [ path('update_progress/', views.update_progress, name='update_progress'), ] ``` 现在我们已经完成了进度条的管理功能,可以生成代码并运行Django应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值