AppLogController.py 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. import time
  4. import boto3
  5. import botocore
  6. import oss2
  7. from django.views.generic.base import View
  8. from Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, REGION_NAME, LOG_BUCKET
  9. from Model.models import AppLogModel
  10. from Object.ResponseObject import ResponseObject
  11. from Object.TokenObject import TokenObject
  12. from Service.CommonService import CommonService
  13. from Service.ModelService import ModelService
  14. from django.conf import settings
  15. ACCESS_KEY_ID = settings.ACCESS_KEY_ID
  16. SECRET_ACCESS_KEY = settings.SECRET_ACCESS_KEY
  17. class AppLogView(View):
  18. def get(self, request, *args, **kwargs):
  19. request.encoding = 'utf-8'
  20. operation = kwargs.get('operation', None)
  21. return self.validate(request.GET, operation)
  22. def post(self, request, *args, **kwargs):
  23. request.encoding = 'utf-8'
  24. operation = kwargs.get('operation', None)
  25. return self.validate(request.POST, operation)
  26. def validate(self, request_dict, operation):
  27. token = request_dict.get('token', None)
  28. response = ResponseObject()
  29. if token is None:
  30. return response.json(444)
  31. token = TokenObject(token)
  32. if token.code != 0:
  33. return response.json(token.code)
  34. if operation == 'getUploadUrl':
  35. return self.get_upload_url(token.userID, request_dict, response)
  36. elif operation == 'add':
  37. return self.do_add(token.userID, request_dict, response)
  38. elif operation == 'queryByAdmin':
  39. return self.do_query_by_admin(token.userID, request_dict, response)
  40. elif operation == 'deleteByAdmin':
  41. return self.do_delete_by_admin(token.userID, request_dict, response)
  42. elif operation == 'downloadByAdmin':
  43. return response.json(404)
  44. else:
  45. return response.json(414)
  46. def get_upload_url(self, userID, request_dict, response):
  47. upload_type = request_dict.get('upload_type', None)
  48. if not upload_type:
  49. return response.json(444)
  50. name = CommonService.createOrderID()
  51. filename = str(name) + '.' + upload_type
  52. obj = 'app_log/{userID}/'.format(userID=userID) + filename
  53. aws_s3_client = boto3.client(
  54. 's3',
  55. region_name=REGION_NAME,
  56. aws_access_key_id=ACCESS_KEY_ID,
  57. aws_secret_access_key=SECRET_ACCESS_KEY,
  58. config=botocore.client.Config(signature_version='s3v4'),
  59. )
  60. response_url = aws_s3_client.generate_presigned_url(
  61. ClientMethod='put_object',
  62. Params={
  63. 'Bucket': LOG_BUCKET,
  64. 'Key': obj
  65. },
  66. ExpiresIn=3600
  67. )
  68. return response.json(0, {'put_url': response_url, 'filename': filename})
  69. def do_add(self, userID, request_dict, response):
  70. uid = request_dict.get('uid', None)
  71. average_delay = request_dict.get('average_delay', None)
  72. status = request_dict.get('status', None)
  73. filename = request_dict.get('filename', None)
  74. if uid is None or average_delay is None or status is None or filename is None:
  75. return response.json(444)
  76. else:
  77. # if len(uid) < 20:
  78. # return response.json(444, 'uid')
  79. # ModelService.app_log_log(userID, uid)
  80. now_time = int(time.time())
  81. uid = uid.strip()
  82. data = {
  83. 'uid': uid[0:20],
  84. 'average_delay': average_delay,
  85. 'status': status,
  86. 'filename': filename,
  87. 'add_time': now_time,
  88. 'user_id': userID,
  89. }
  90. AppLogModel.objects.create(**data)
  91. return response.json(0)
  92. def do_query_by_admin(self, userID, request_dict, response):
  93. own_perm = ModelService.check_perm(userID, 30)
  94. if own_perm:
  95. page = request_dict.get('page', None)
  96. line = request_dict.get('line', None)
  97. status = request_dict.get('status', None)
  98. uid = request_dict.get('uid', None)
  99. if page and line:
  100. page = int(page)
  101. line = int(line)
  102. filter_data = {}
  103. if status:
  104. filter_data['status'] = status
  105. if uid:
  106. filter_data['uid'] = uid
  107. al_qs = AppLogModel.objects.filter(**filter_data).order_by('-add_time')
  108. if al_qs.exists():
  109. count = al_qs.count()
  110. start = (page - 1) * line
  111. al_qs = al_qs[start: (start + line)].values('id', 'user__username', 'user_id', 'uid',
  112. 'average_delay', 'status', 'filename', 'add_time')
  113. res = []
  114. auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
  115. bucket = oss2.Bucket(auth, 'oss-cn-hongkong.aliyuncs.com', 'statres')
  116. for al in al_qs:
  117. filename = al['filename']
  118. obj = 'app_log/' + al['user_id'] + '/' + filename
  119. url = bucket.sign_url('GET', obj, 3600)
  120. al['url'] = url
  121. del al['filename']
  122. res.append(al)
  123. return response.json(0, {'datas': res, 'count': count})
  124. else:
  125. return response.json(0, {'datas': [], 'count': 0})
  126. else:
  127. return response.json(444, 'page, line')
  128. else:
  129. return response.json(404)
  130. def do_delete_by_admin(self, userID, request_dict, response):
  131. own_perm = ModelService.check_perm(userID, 10)
  132. if own_perm:
  133. id = request_dict.get('id', None)
  134. if id:
  135. try:
  136. AppLogModel.objects.filter(id=id).delete()
  137. except Exception as e:
  138. print(repr(e))
  139. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  140. else:
  141. return response.json(0)
  142. else:
  143. return response.json(444)
  144. else:
  145. return response.json(404)