views.py 9.1 KB

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