直接上代码:
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
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