一.先写导出按钮接口

  1.此接口对用户权限进行判断

  2.此接口将前端的参数组合拼凑到下一个接口的url中去,用于条件筛选

  3.用户有权限的情况下将用户的权限信息保存到redis中去,并将token写到url的参数中,以便对用户下载时权限的验证

class ExportInfoButtonView(APIView):
permission_classes = [SupserPermisson,] def get(self, request,pk):
res = {'error':'','success':''} cinema_obj = Cinema.objects.filter(cinema_code=pk)
if not cinema_obj:
res['error'] = '信息不存在'
return JsonResponse(data=res, code=400, desc="success", status=status.HTTP_400_BAD_REQUEST)
params_dic=dict(request.query_params)
del_keys=[]
for i in params_dic:
if params_dic[i][0] == '':
del_keys.append(i)
else:
params_dic[i] = params_dic[i][0]
if del_keys:
for key in del_keys:
params_dic.pop(key)
params_dic['token'] = make_token(request.user.username)
params = urlencode(params_dic,encoding='utf8')
data = {}
data['url'] = '127.0.0.1:8000/test/export_info_excel/{0}?{1}'.format(pk,params)
res['success'] = data
return JsonResponse(data=res, code=200, desc="success", status=status.HTTP_200_OK)

1.1 说明:创建token 和验证token的函数

import time
import hashlib
import redis
from ticket_audit import settings_sample
redis_obj = redis.Redis(host=settings_sample.REDIS_HOST, port=settings_sample.REDIS_PORT) def make_token(user): #创建token的函数 返回一个有过期时间的token
ti=str(time.time())
md5_obj = hashlib.md5(ti.encode('utf8'))
md5_obj.update(user.encode('utf8'))
token=md5_obj.hexdigest()
print(token)
redis_obj.set(token,'',ex=20)
return token def check_token(token): #token 验证函数,验证带过来的token是否在redis中存在
print(redis_obj.get(token),'这是题啃=======')
if redis_obj.get(token):
return True
return False

二.下载接口

class ExportCinemaMovieExcelView(GenericAPIView):
serializer_class = InfoSerializers
queryset = Info.objects.all()
filter_backends = (DjangoFilterBackend,)
filter_class = InofFilter def get(self, request, pk):
res = {'error': '', 'success': {}}
token = request.query_params.get('token', None)
     #验证用户token
if not token or not check_token(token):
res['error'] = '用户没有权限'
return JsonResponse(data=res, code=401, desc="success", status=status.HTTP_401_UNAUTHORIZED)
info_obj = Info.objects.filter(code=pk)
if not cinfo_obj:
res['error'] = '不存在'
return JsonResponse(data=res, code=400, desc="success", status=status.HTTP_400_BAD_REQUEST) dic,_ = info_data_to_dict(pk, report_data, data1, data2)
     #获取到数据之后 将数据写入到excel中去
name,file_name = export_cinema_movie_excel(dic)
    #读取刚刚写好的excel文件 并将文件返回给前端
with open(name, 'rb') as model_excel:
result = model_excel.read()
response = HttpResponse(result)
response['Content-Disposition'] = 'attachment; filename=%s'%file_name
os.remove(name)
return response

2.1函数export_cinema_movie_excel

from io import BytesIO,StringIO

import datetime

# 定义时间标志变量
import xlwt as xlwt
from django.http import HttpResponse def expor_info_excel(result):
sheet_time = datetime.datetime.now()
sheet_mark = sheet_time.strftime('%Y-%m-%d')
book_mark = sheet_time.strftime('%Y%m%d') # 查询数据结果和字段名字 赋值给两个变量
result = result #查询的数据信息 fields = ['a','b','c','d','e','f','试试人数','生物偏差','城市偏差'] # 查询到的标题描述信息 response = HttpResponse(content_type='application/vnd.ms-excel') # 指定返回为excel文件
response['Content-Disposition'] = 'attachment;filename=cinema_movie_%s.xls' %book_mark # 指定返回文件名
wb = xlwt.Workbook(encoding='utf-8') # 设定编码类型为utf8
sheet = wb.add_sheet(sheet_mark) # excel里添加类别 for field in range(0,len(fields)):
sheet.write(0,field,fields[field])
#数据坐标0,0 ~ row,col row取决于:result的行数;col取决于fields的总数
# for row in range(1,len(result)+1):
row = 1
j = 1
while row <= len(result):
for i in result:
sheet.write(row, 0, j)
sheet.write(row, 1, i)
sheet.write(row, 2, result[i].get('num_a',None))
sheet.write(row, 3, result[i].get('num_b',None))
sheet.write(row, 4, result[i].get('report_c',None))
sheet.write(row, 5, result[i].get('num_d',None))
sheet.write(row, 6, result[i].get('num_r',None))
sheet.write(row, 7, result[i].get('report_f',None))
sheet.write(row, 8, result[i].get('report_g',None))
row += 1
j += 1 import os
name=os.getcwd()+'/temp/cinema_movie_%s.xls'%book_mark
fields_name = 'cinema_movie_%s.xls'%book_mark
wb.save(name)#将数据写入到这个地址的这个xls文件中
return name, fields_name

导出excel,并将数据返回给前端(包含权限判断)的更多相关文章

  1. Java利用POI导入导出Excel中的数据

         首先谈一下今天发生的一件开心的事,本着一颗android的心我被分配到了PB组,身在曹营心在汉啊!好吧,今天要记录和分享的是Java利用POI导入导出Excel中的数据.下面POI包的下载地 ...

  2. php 导出excel 10万数据

    php导出excel 10万数据(此代码主要测试用) 在工作当中要对一些基本信息和其他信息导出 起初信息比较小无所谓.... 但当信息超出65535的时候 发现点问题了 超出了 而且 反应速度很慢 实 ...

  3. C#导入导出Excel表的数据

    一:C#导入导出EXCEL文件的类 代码如下: 首先将Microsoft Excel 14.0 Object Library 引用导入 using System; using System.Data; ...

  4. C#弹出窗体、C#导出Excel、C#数据展示框、C#弹出框

    1.new 一个窗体,然后设置窗体属性. 2.添加数据展示控件,显示数据. 3.添加按钮控件,调用导出Excel代码,实现导出Excel功能. using System; using System.C ...

  5. thinkphp导入导出excel表单数据

    在PHP项目经常要导入导出Excel表单. 先去下载PHPExcel类库文件,放到相应位置. 我在thinkphp框架中的位置为ThinkPHP/Library/Org/Util/ 导入 在页面上传e ...

  6. 使用NPOI导入导出Excel(xls/xlsx)数据到DataTable中

    using System; using System.Collections.Generic; using System.Text; using System.IO; using NPOI.SS.Us ...

  7. poi导出excel,表头数据动态拼装

    /* * 第一步:拼装表头和数据 */ // 放多个sheet的集合 List<Map<String,Object>> datas = new ArrayList<Map ...

  8. winfrom 使用NPOI导入导出Excel(xls/xlsx)数据到DataTable中

    1.通过NUGET管理器下载nopi,在引入命令空间 using System; using System.Collections.Generic; using System.Text; using ...

  9. 关于JavaDate数据返回到前端变数字的问题(并引申到前后端时间的传输)

    不知道为什么,前端显示的所有数据项都没有错,就只有时间那一项很奇怪,是一串数字,而且这个数字在数据库怎么都找不到…… 然后我在后端从service到controller都debug了一遍,发现数据都没 ...

随机推荐

  1. python-之-深浅拷贝二(元组)

    元组比较特殊 1.----元组本身为不可变类型 import copy v1 = (1, 2, 3, 4) v2 = copy.copy(v1) print(id(v1), id(v2)) v3 = ...

  2. 原生Ajax实现异步交互

    实现Ajax主要依靠XMLHttpRequest对象,所以首先要创建XMLHttpRequest对象 function getXhr(){ var xhr = null; if(window.XMLH ...

  3. centos7 eclispe 编译C++遇到的问题总结

    最近由于工作的需要,又开始回归之前已经遗忘了的技术.arm嵌入式这个古老的名词. 开始选择了linuxminit,开始的linuxminit17以前还可以,可是用了一下linuxminit19,发现r ...

  4. jQuery 核心函数

    $() ;/  jQuery () ;  就代表调用 jQuery 的核心函数. 1. 接收一个函数. $(function(){ alret('hello world'); }); 2. 接收一个字 ...

  5. Zabbix增加邮箱后Server宕处理

    zabbix版本:4.1  DB为Mysql 过程: 1,为了增加邮件报警功能,按照网上文章,开始增加发送邮件模块.先停postfix,后安装mailx和sendmail. systemctl lis ...

  6. mongo中的游标与数据一致性的取舍

    除了特殊注释外,本文的测试结果均基于 spring-data-mongodb:1.10.6.RELEASE(spring-boot-starter:1.5.6.RELEASE),MongoDB 3.0 ...

  7. 无线局域网(WLAN)

    无线局域网根据结构可以分为两大类:有固定基础设施的无线局域网和无固定基础设施的局域网. 有固定基础设施是指网络中已经预先存在了一批固定的数据处理和转发设备,这些固定设备可以通过有线方式连接其他网络或 ...

  8. golang反射

    要点 1.变量 2.反射 3.结构体反射 4.反射总结以及应用场景 一.变量介绍 1.变量的内在机制 A.类型信息,这部分是元信息,是预定义好的 B.值类型,这部分是程序运行过程中,动态改变的 var ...

  9. 第七届蓝桥杯大赛个人赛决赛(软件类C语言B组)第一题:一步之遥

      这题好多人用爆搜/bfs来做,然而这题可用exgcd(扩展欧几里得)做,而且很简便. 先附原题: 一步之遥 从昏迷中醒来,小明发现自己被关在X星球的废矿车里. 矿车停在平直的废弃的轨道上. 他的面 ...

  10. ATL编程初级教程(图文事例)(VC6)

    http://blog.csdn.net/titilima/archive/2004/07/18/44273.aspx 介绍 本教程的目的是告诉你如何使用ATL创建一个COM服务器,并使用Visual ...