AppLogController.py 6.3 KB

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