一、django 中下载文件
在实际的项目中很多时候需要用到下载功能,如导excel、pdf或者文件下载,当然你可以使用web服务自己搭建可以用于下载的资源服务器,如nginx,这里我们主要介绍django中的文件下载。
1、前端
实现方式:a标签+响应头信息(当然你可以选择form实现)
<div class="col-md-4"><a href="{% url ‘download‘ %}" rel="external nofollow" >点我下载</a></div>
2、Url
路由url:
url(r‘^download/‘,views.download,name="download"),
3、后端
方式一:使用HttpResponse
views.py代码
from django.shortcuts import HttpResponse
def download(request):
file = open(‘crm/models.py‘, ‘rb‘)
response = HttpResponse(file)
response[‘Content-Type‘] = ‘application/octet-stream‘ #设置头信息,告诉浏览器这是个文件
response[‘Content-Disposition‘] = ‘attachment;filename="models.py"‘
return response
方式二:使用StreamingHttpResponse
其他逻辑不变,主要变化在后端处理
from django.http import StreamingHttpResponse
def download(request):
file=open(‘crm/models.py‘,‘rb‘)
response =StreamingHttpResponse(file)
response[‘Content-Type‘]=‘application/octet-stream‘
response[‘Content-Disposition‘]=‘attachment;filename="models.py"‘
return response
方式三:使用FileResponse
from django.http import FileResponse
def download(request):
file=open(‘crm/models.py‘,‘rb‘)
response =FileResponse(file)
response[‘Content-Type‘]=‘application/octet-stream‘
response[‘Content-Disposition‘]=‘attachment;filename="models.py"‘
return response
使用总结
三种http响应对象在django官网都有介绍.入口:https://docs.djangoproject.com/en/1.11/ref/request-response/
推荐使用FileResponse,从源码中可以看出FileResponse是StreamingHttpResponse的子类,内部使用迭代器进行数据流传输。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
二、django导出excel文件
1、前端
实现方式:a标签+响应头信息(当然你可以选择form实现)
<div class="col-md-4"><a href="{% url ‘download‘ %}" rel="external nofollow" >点我下载</a></div>
2、Url
路由url:
url(r‘^download/‘,views.download,name="download"),
3、后端
# 导入render和HttpResponse模块from django.shortcuts import render, HttpResponsefrom io import BytesIOimport xlwt# 导出excel数据def download(request): # 设置HTTPResponse的类型 response = HttpResponse(content_type=‘application/vnd.ms-excel‘) response[‘Content-Disposition‘] = ‘attachment;filename=test.xls‘ # 创建一个文件对象 wb = xlwt.Workbook(encoding=‘utf8‘) # 创建一个sheet对象 sheet = wb.add_sheet(‘order-sheet‘) # 设置文件头的样式,这个不是必须的可以根据自己的需求进行更改 style_heading = xlwt.easyxf(""" font: name Arial, colour_index white, bold on, height 0xA0; align: wrap off, vert center, horiz center; pattern: pattern solid, fore-colour 0x19; borders: left THIN, right THIN, top THIN, bottom THIN; """) # 写入文件标题 sheet.write(0, 0, ‘申请编号‘, style_heading) sheet.write(0, 1, ‘客户名称‘, style_heading) sheet.write(0, 2, ‘联系方式‘, style_heading) sheet.write(0, 3, ‘身份证号码‘, style_heading) sheet.write(0, 4, ‘办理日期‘, style_heading) sheet.write(0, 5, ‘处理人‘, style_heading) sheet.write(0, 6, ‘处理状态‘, style_heading) sheet.write(0, 7, ‘处理时间‘, style_heading) # 写入数据 data_row = 1 # UserTable.objects.all()这个是查询条件,可以根据自己的实际需求做调整. a=models.UserTable.objects.all() print(a) for i in models.UserTable.objects.all(): # 格式化datetime pri_time = i.pri_date.strftime(‘%Y-%m-%d‘) oper_time = i.operating_time.strftime(‘%Y-%m-%d‘) sheet.write(data_row, 0, i.loan_id) sheet.write(data_row, 1, i.name) sheet.write(data_row, 2, i.user_phone) sheet.write(data_row, 3, i.user_card) sheet.write(data_row, 4, pri_time) sheet.write(data_row, 5, i.emp.emp_name) sheet.write(data_row, 6, i.statu.statu_name) sheet.write(data_row, 7, oper_time) data_row = data_row + 1 # 写入数据,使用原生SQL方式????????????????? # 写出到IO output = BytesIO() wb.save(output) # 重新定位到开始 output.seek(0) response.write(output.getvalue()) return response
整理自:
https://www.jb51.net/article/137790.htm
https://blog.csdn.net/qq_33196814/article/details/81486843
原文地址:https://www.cnblogs.com/xibuhaohao/p/10419105.html