AccessLog.py 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. import datetime
  2. import simplejson as json
  3. from django.utils.decorators import method_decorator
  4. from django.views.decorators.csrf import csrf_exempt
  5. from django.views.generic.base import View
  6. from ratelimit.decorators import ratelimit
  7. from Model.models import Access_Log
  8. from Object.ResponseObject import ResponseObject
  9. from Object.TokenObject import TokenObject
  10. from Service.CommonService import CommonService
  11. from Service.ModelService import ModelService
  12. from Service.TemplateService import TemplateService
  13. from Ansjer.config import SERVER_TYPE
  14. from Object.RedisObject import RedisObject
  15. '''
  16. http://192.168.136.40:8077/accesslog?operation=queryByAdmin&token=test&page=1&line=5&order=-id
  17. http://192.168.136.40:8077/accesslog?operation=truncateByAdmin&token=test
  18. http://192.168.136.40:8077/accesslog?operation=searchByAdmin&token=test&page=1&line=10&content={"status":20}&order=-id
  19. http://192.168.136.40:8077/accesslog/staticPath/?token=stest
  20. '''
  21. class AccessLog(View):
  22. @method_decorator(csrf_exempt)
  23. def dispatch(self, *args, **kwargs):
  24. return super(AccessLog, self).dispatch(*args, **kwargs)
  25. def get(self, request):
  26. response = ResponseObject()
  27. request.encoding = 'utf-8'
  28. return self.validation(request.GET, response)
  29. def post(self, request):
  30. response = ResponseObject()
  31. request.encoding = 'utf-8'
  32. return self.validation(request.POST, response)
  33. def validation(self, request_dict, response):
  34. token = request_dict.get('token', None)
  35. tko = TokenObject(token)
  36. response.lang = tko.lang
  37. if tko.code != 0:
  38. return response.json(tko.code)
  39. userID = tko.userID
  40. operation = request_dict.get('operation', None)
  41. if not userID:
  42. return response.json(104)
  43. if not operation:
  44. return response.json(444, 'operation')
  45. if operation == 'queryByAdmin':
  46. return self.query_by_admin(request_dict, userID, response)
  47. elif operation == 'searchByAdmin':
  48. return self.search_by_admin(request_dict, userID, response)
  49. elif operation == 'truncateByAdmin':
  50. return self.truncate_by_admin(userID, response)
  51. def query_by_admin(self, request_dict, userID, response):
  52. page = int(request_dict.get('page', None))
  53. line = int(request_dict.get('line', None))
  54. order = request_dict.get('order', '-id')
  55. if order == '':
  56. order = '-id'
  57. if not page or not line:
  58. return response.json(444, 'page,line')
  59. own_perm = ModelService.check_perm(userID=userID, permID=30)
  60. if own_perm is not True:
  61. return response.json(404)
  62. if SERVER_TYPE == 'Ansjer.formal_settings':
  63. logKey = 'logger'
  64. else:
  65. logKey = 'test_logger'
  66. # 判断redis列表长度
  67. redisObj = RedisObject()
  68. data_list = redisObj.lrange(logKey, 0, -1)
  69. redisObj.del_data(key=logKey)
  70. ModelService.add_batch_log(data_list)
  71. qs = Access_Log.objects.all().order_by(order)
  72. if qs.exists():
  73. count = qs.count()
  74. res = qs[(page - 1) * line:page * line]
  75. send_json = CommonService.qs_to_dict(res)
  76. send_json['count'] = count
  77. return response.json(0, send_json)
  78. return response.json(0, {'datas': [], 'count': 0})
  79. # 清空日志表
  80. def truncate_by_admin(self, userID, response, ):
  81. check_perm = ModelService.check_perm(userID=userID, permID=10)
  82. if check_perm is True:
  83. from django.db import connection
  84. cursor = connection.cursor()
  85. sql = "TRUNCATE TABLE `access_log`"
  86. cursor.execute(sql)
  87. return response.json(0)
  88. else:
  89. return response.json(404)
  90. # 搜索日志(多条件)
  91. def search_by_admin(self, request_dict, userID, response):
  92. page = int(request_dict.get('page', None))
  93. line = int(request_dict.get('line', None))
  94. order = request_dict.get('order', '-id')
  95. content = request_dict.get('content', None)
  96. starttime = request_dict.get('starttime', None)
  97. endtime = request_dict.get('endtime', None)
  98. if SERVER_TYPE == 'Ansjer.formal_settings':
  99. logKey = 'logger'
  100. else:
  101. logKey = 'test_logger'
  102. # 判断redis列表长度
  103. redisObj = RedisObject()
  104. data_list = redisObj.lrange(logKey, 0, -1)
  105. redisObj.del_data(key=logKey)
  106. ModelService.add_batch_log(data_list)
  107. qs = Access_Log.objects.all().order_by(order)
  108. if not page or not line:
  109. return response.json(444, 'page,line')
  110. check_perm = ModelService.check_perm(userID=userID, permID=20)
  111. if check_perm is not True:
  112. return response.json(404)
  113. try:
  114. content = json.loads(content)
  115. kwargs = {}
  116. for (k, v) in content.items():
  117. if v is not None and v != '':
  118. if k == 'content':
  119. kwargs[k + '__icontains'] = v
  120. else:
  121. kwargs[k] = v
  122. queryset = Access_Log.objects.filter(**kwargs).order_by(order)
  123. except Exception as e:
  124. return response.json(444)
  125. if starttime is not None and starttime != '' and endtime is not None and endtime != '':
  126. startt = datetime.datetime.fromtimestamp(int(starttime))
  127. starttime = startt.strftime("%Y-%m-%d %H:%M:%S.%f")
  128. endt = datetime.datetime.fromtimestamp(int(endtime))
  129. endtime = endt.strftime("%Y-%m-%d %H:%M:%S.%f")
  130. queryset = queryset.filter(time__range=(starttime, endtime))
  131. elif starttime is not None and starttime != '':
  132. startt = datetime.datetime.fromtimestamp(int(starttime))
  133. starttime = startt.strftime("%Y-%m-%d %H:%M:%S.%f")
  134. queryset = queryset.filter(time__gte=starttime)
  135. elif endtime is not None and endtime != '':
  136. endt = datetime.datetime.fromtimestamp(int(endtime))
  137. endtime = endt.strftime("%Y-%m-%d %H:%M:%S.%f")
  138. queryset = queryset.filter(time__lte=endtime)
  139. if queryset.exists():
  140. count = queryset.count()
  141. res = queryset[(page - 1) * line:page * line]
  142. send_json = CommonService.qs_to_dict(res)
  143. send_json['count'] = count
  144. return response.json(0, send_json)
  145. return response.json(0, {'datas': [], 'count': 0})
  146. @ratelimit(key='ip', rate='3/m')
  147. def statisticsPath(request):
  148. request.encoding = 'utf-8'
  149. if request.method == 'GET':
  150. token = request.GET.get('token', None)
  151. if request.method == 'POST':
  152. token = request.POST.get('token', None)
  153. response = ResponseObject()
  154. was_limited = getattr(request, 'limited', False)
  155. # 限制同一个ip该接口一分钟不能访问超过两次
  156. if was_limited is True:
  157. return response.json(5)
  158. tko = TokenObject(token)
  159. response.lang = tko.lang
  160. if tko.code != 0:
  161. return response.json(tko.code)
  162. userID = tko.userID
  163. own_perm = ModelService.check_perm(userID, 10)
  164. if own_perm is not True:
  165. return response.json(404)
  166. paths = TemplateService.log_api()
  167. datas = {}
  168. for path in paths:
  169. count = Access_Log.objects.filter(operation=path).count()
  170. datas[path] = count
  171. return response.json(0, {'datas': datas})
  172. # 按季度删除访问日志
  173. def deleteSn(request):
  174. response = ResponseObject()
  175. request.encoding = 'utf-8'
  176. if request.method == 'GET':
  177. request_dict = request.GET
  178. elif request.method == 'POST':
  179. request_dict = request.POST
  180. else:
  181. return response.json(104)
  182. token = request_dict.get('token', None)
  183. days = request_dict.get('days', None)
  184. if not days:
  185. return response.json(444, 'days')
  186. tko = TokenObject(token)
  187. response.lang = tko.lang
  188. if tko.code != 0:
  189. return response.json(tko.code)
  190. userID = tko.userID
  191. own_perm = ModelService.check_perm(userID, 10)
  192. if own_perm is not True:
  193. return response.json(404)
  194. dltime = datetime.datetime.now() - datetime.timedelta(days=int(days))
  195. count = Access_Log.objects.filter(time__gte=dltime).delete()
  196. return response.json(0, count)