直接上代码:
def download(request): # 从数据库查询数据 data_list = Info.objects.all() # 定义返回对象 response = HttpResponse() # 给返回对象定义解析类型 response['Content-Type'] = 'csv' # 声明一个csv的响应 response['Content-Disposition'] = 'attachment;filename="data.csv"' # csv的响应编码格式声明 response.write(codecs.BOM_UTF8) # 把响应设置成文件句柄 writer_obj = csv.writer(response) # 先写入表格头 writer_obj.writerow(["姓名", "年龄", "地址"]) # 写入数据 for info in data_list: writer_obj.writerow([info.name, info.age, info.address]) return response
参考1:
https://www.cnblogs.com/haoshine/p/5695760.html
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import csv import codecs import datetime from django.db import connection from django.contrib.auth.models import User from django.http import HttpResponse from models import * def output(request, user_id, node_id, function_id): function_id = int(function_id) user_id = int(user_id) node_id= int(node_id) # 指定csv请求回应 response = HttpResponse(content_type='text/csv') user = User.objects.get(id=user_id) functions_has_permission = DataPermission.objects.filter(category=node_id) # 取出sql语句 function_obj = DataPermission.objects.get(id=function_id) function_obj_sql = function_obj.sql # 执行sql语句,并执行。保存执行结果和字段名 cursor = connection.cursor() cursor.execute(function_obj_sql) results = cursor.fetchall() descriptions = cursor.description descriptions_long = len(descriptions) description_list = [None] * descriptions_long i = 0 for description in descriptions: description_list[i] = description[0] i = i + 1 # 将执行结果从元组形式转化为列表形式。 i=0 results_long = len(results) results_list = [None] * results_long for i in range(results_long): results_list[i] = list(results[i]) # print(results_list) # 为文件取名字 now = datetime.datetime.now() now = str(now.isoformat()) name = (now + '.csv').replace(':', '') # 声明一个csv的响应 response['Content-Disposition'] = 'attachment; filename="%s"' % name # csv的响应的编码格式声明 response.write(codecs.BOM_UTF8) writer = csv.writer(response) # 转码问题 a = u'中' for result in results_list: i=0 for item in result: if type(item) == type(a): # 如果是unicode类型,那么编码成utf-8 result[i] = item.encode('utf-8') i = i + 1 # with open(response, 'wb') as f: writer.writerow(description_list) for result in results_list: writer.writerow(result) i = i + 1 response.close() return response
导出的文件,中文如果显示成乱码
解决方法:将上面代码中的'utf-8' 改成 'gb2312'
result[i] = item.encode('gb2312')
参考2:
抽取数据库文件: def exportmysql(request): conn= MySQLdb.connect( host='192.168.137.3', port = 3306, user='root', passwd='1234567', db ='DEVOPS', charset='UTF8' ) cur = conn.cursor() a = cur.execute("select ip,info,env from machine_info") info = cur.fetchall() response = HttpResponse(content_type='text/csv') response['Content-Disposition'] = 'attachment; filename="somefilename.csv"' writer = csv.writer(response) for row in info: writer.writerow(row) return response
参考3:
最近一个用django开发的web项目要进行数据的导入导出,所以有必要了解下。
django中主要用HttpResponse将请求结果返回给浏览器,所以文件的下载也是通过改对象进行处理的,具体的一个列子的代码如下:
[python] view plain copy #文件下载 def download(request): """ Send a file through Django without loading the whole file into memory at once. The FileWrapper will turn the file object into an iterator for chunks of 8KB. """ #读取mongodb的文件到临时文件中 fileid_=request.GET["fileid"] filepath_ = ('%s/%s'%(MEDIA_ROOT, fileid_)) #文件全路径 file_=TFiles.objects.get(fileid=int(fileid_)) filename_=file_.filename filetype_=file_.filetype if os.path.isfile(filepath_): pass else: mongoLoad(fileid_) #下载文件 def readFile(fn, buf_size=262144):#大文件下载,设定缓存大小 f = open(fn, "rb") while True:#循环读取 c = f.read(buf_size) if c: yield c else: break f.close() response = HttpResponse(readFile(filepath_), content_type='APPLICATION/OCTET-STREAM') #设定文件头,这种设定可以让任意文件都能正确下载,而且已知文本文件不是本地打开 response['Content-Disposition'] = 'attachment; filename='+filename_.encode('utf-8') + filetype_.encode('utf-8')#设定传输给客户端的文件名称 response['Content-Length'] = os.path.getsize(filepath_)#传输给客户端的文件大小 return response
=====================
Python+Django实现文件的下载
HttpResponse, StreamingHttpResponse, FileResponse
https://blog.csdn.net/li627528647/article/details/77544136