views.py 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. # Create your views here.
  2. import hashlib
  3. import time
  4. import uuid
  5. import requests
  6. from rest_framework.views import APIView
  7. from rest_framework.viewsets import ModelViewSet
  8. from background.Object import AmazonS3Util, RedisObject, TokenObject
  9. # from background.author import MyAuthentication
  10. from background.serializers import ProductInfoSerializer, VideoInSerializer, QuickStartInfoSerializer, \
  11. UpgradeFirmwareInfoSerializer
  12. from background.models import ProductInfo, VideoInfo, QuickStartInfo, UpgradeFirmwareInfo, WechatUserInfo
  13. from rest_framework.response import Response
  14. class ProductInfoSet(ModelViewSet):
  15. queryset = ProductInfo.objects.all()
  16. serializer_class = ProductInfoSerializer
  17. # authentication_classes = [MyAuthentication, ]
  18. class VideoInfoSet(ModelViewSet):
  19. # authentication_classes = [MyAuthentication, ]
  20. queryset = VideoInfo.objects.all()
  21. serializer_class = VideoInSerializer
  22. filterset_fields = ['id', 'product_info_id', 'title']
  23. class QuickStartInfoSet(ModelViewSet):
  24. # authentication_classes = [MyAuthentication, ]
  25. queryset = QuickStartInfo.objects.all()
  26. serializer_class = QuickStartInfoSerializer
  27. filterset_fields = ['id', 'product_info_id', 'title']
  28. class UpgradeFirmwareInfoSet(ModelViewSet):
  29. queryset = UpgradeFirmwareInfo.objects.all()
  30. serializer_class = UpgradeFirmwareInfoSerializer
  31. filterset_fields = ['id', 'product_info_id', 'title']
  32. # authentication_classes = [MyAuthentication, ]
  33. class GetUploadUrlView(APIView):
  34. def get(self, request):
  35. file_name = request.GET.get('file_name', None)
  36. file_type = request.GET.get('file_type', None)
  37. if not all([file_name]):
  38. return Response({'code': 444, 'result': {'error_msg': 'file_name参数有误'}})
  39. try:
  40. s3_obj = AmazonS3Util()
  41. if file_type == '1': # 说明书
  42. key_name = 'vsees/quick_start_file/{file_name}'.format(file_name=file_name)
  43. elif file_type == '2': # 升级文件
  44. key_name = 'vsees/upgrade_firmware_file/{file_name}'.format(file_name=file_name)
  45. else:
  46. return Response({'code': 444, 'result': {'error_msg': 'file_type参数有误'}})
  47. bucket_name = 'ansjerfilemanager'
  48. upload_url = s3_obj.generate_put_obj_url(bucket_name, key_name)
  49. return Response({'code': 0, 'result': {'uploadUrl': upload_url}})
  50. except Exception as e:
  51. return Response(
  52. {'code': 500, 'result': {'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e))}})
  53. class WechatLoginView(APIView):
  54. def get(self, request, *args, **kwargs):
  55. request.encoding = 'utf-8'
  56. operation = kwargs.get('operation')
  57. return self.validation(request.GET, operation, request)
  58. def post(self, request, *args, **kwargs):
  59. request.encoding = 'utf-8'
  60. operation = kwargs.get('operation')
  61. return self.validation(request.POST, operation, request)
  62. def validation(self, request_dict, operation, request):
  63. if operation == 'get-state': # 获取state值
  64. return self.get_state()
  65. elif operation == 'get-user': # 获取用户
  66. return self.get_user(request_dict)
  67. else:
  68. return Response({'code': 414, 'result': {'error_msg': '请求路径有误'}})
  69. @staticmethod
  70. def get_state():
  71. """
  72. 获取state
  73. @return: response
  74. """
  75. nwo_time = int(time.time())
  76. redis_obj = RedisObject()
  77. try:
  78. state = hashlib.md5((str(uuid.uuid1()) + str(nwo_time)).encode('utf-8')).hexdigest()
  79. state_statue = redis_obj.set_ex_data(state, 0, 300) # redis记录state
  80. if state_statue:
  81. return Response({'code': 0, 'result': {'state': state}})
  82. else:
  83. return Response({'code': 120, 'result': {'error_msg': '获取status失败'}})
  84. except Exception as e:
  85. return Response(
  86. {'code': 500, 'result': {'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e))}})
  87. @classmethod
  88. def get_user(cls, request_dict):
  89. """
  90. 获取用户信息
  91. @request_dict code:唯一标识
  92. @request_dict state:唯一标识
  93. return:
  94. """
  95. code = request_dict.get('code', None)
  96. state = request_dict.get('state', None)
  97. if not all([code, state]):
  98. return Response({'code': 444, 'result': {'error_msg': '缺少参数'}})
  99. # 验证state,获取token
  100. access_token = cls.get_access_token(state)
  101. if not access_token:
  102. return Response({'code': 120, 'result': {'error_msg': '获取token失败'}})
  103. data = {
  104. 'access_token': access_token,
  105. 'code': code
  106. }
  107. try:
  108. # 获取用户id
  109. get_userid_url = 'https://qyapi.weixin.qq.com/cgi-bin/auth/getuserinfo'
  110. response = requests.get(get_userid_url, params=data)
  111. data = response.json()
  112. user_id = data.get("userid")
  113. if user_id:
  114. user_name = cls.add_or_update_user_info(access_token, user_id)
  115. if not user_name:
  116. return Response({'code': 120, 'result': {'error_msg': '登录失败'}})
  117. token_obj = TokenObject()
  118. token = token_obj.generate(data={'userID': user_id, 'user': user_name})
  119. return Response({'code': 0, 'result': {'token': token}})
  120. else:
  121. errcode = data.get('errcode')
  122. errmsg = data.get('errmsg')
  123. return Response({'code': errcode, 'result': {'error_msg': errmsg}})
  124. except Exception as e:
  125. return Response(
  126. {'code': 500, 'result': {'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e))}})
  127. @classmethod
  128. def get_access_token(cls, state):
  129. redis_client = RedisObject()
  130. state_val = redis_client.get_data(state)
  131. # 验证state
  132. if state_val:
  133. redis_client.del_data(state)
  134. else:
  135. return False
  136. access_token = redis_client.get_data(key='enterprise_wechat_access_token')
  137. if access_token:
  138. return access_token
  139. data = {
  140. 'corpid': 'ww467ec1685e8262e6',
  141. 'corpsecret': 'IeUoaQ-0hEhEduCQq1zyfVXjfeZpMsThK1nklszRzUY'
  142. }
  143. # 获取access_token,redis中不存在该值时重新请求获取access_token(有效时长两小时)
  144. token_url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken'
  145. token_response = requests.get(token_url, params=data)
  146. data = token_response.json()
  147. if data.get('errcode') == 0:
  148. access_token = data['access_token']
  149. redis_client.set_data('enterprise_wechat_access_token', access_token)
  150. return access_token
  151. else:
  152. return False
  153. @classmethod
  154. def add_or_update_user_info(cls, access_token, user_id):
  155. now_time = int(time.time())
  156. data = {
  157. 'access_token': access_token,
  158. 'userid': user_id
  159. }
  160. # 获取用户信息
  161. token_url = 'https://qyapi.weixin.qq.com/cgi-bin/user/get'
  162. response = requests.get(token_url, params=data)
  163. data = response.json()
  164. wechat_user_qs = WechatUserInfo.objects.filter(user_id=user_id)
  165. if data.get('errcode') == 0:
  166. url_data = {
  167. 'name': data.get('name'),
  168. 'position': data.get('position'),
  169. 'status': data.get('status'),
  170. 'add_time': now_time,
  171. 'upd_time': now_time
  172. }
  173. if not wechat_user_qs.exists():
  174. url_data['user_id'] = user_id
  175. WechatUserInfo.objects.create(**url_data)
  176. else:
  177. wechat_user_qs.update(url_data)
  178. if data.get('status') == 1:
  179. return data.get('name')
  180. else:
  181. return False
  182. else:
  183. return False