AccessLog.py 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  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. qs = Access_Log.objects.all().order_by(order)
  63. if qs.exists():
  64. count = qs.count()
  65. res = qs[(page - 1) * line:page * line]
  66. send_json = CommonService.qs_to_dict(res)
  67. send_json['count'] = count
  68. return response.json(0, send_json)
  69. return response.json(0, {'datas': [], 'count': 0})
  70. # 清空日志表
  71. def truncate_by_admin(self, userID, response, ):
  72. check_perm = ModelService.check_perm(userID=userID, permID=10)
  73. if check_perm is True:
  74. from django.db import connection
  75. cursor = connection.cursor()
  76. sql = "TRUNCATE TABLE `access_log`"
  77. cursor.execute(sql)
  78. return response.json(0)
  79. else:
  80. return response.json(404)
  81. # 搜索日志(多条件)
  82. def search_by_admin(self, request_dict, userID, response):
  83. page = int(request_dict.get('page', None))
  84. line = int(request_dict.get('line', None))
  85. order = request_dict.get('order', '-id')
  86. content = request_dict.get('content', None)
  87. starttime = request_dict.get('starttime', None)
  88. endtime = request_dict.get('endtime', None)
  89. if not page or not line:
  90. return response.json(444, 'page,line')
  91. check_perm = ModelService.check_perm(userID=userID, permID=20)
  92. if check_perm is not True:
  93. return response.json(404)
  94. try:
  95. content = json.loads(content)
  96. kwargs = {}
  97. for (k, v) in content.items():
  98. if v is not None and v != '':
  99. if k == 'content':
  100. kwargs[k + '__icontains'] = v
  101. else:
  102. kwargs[k] = v
  103. queryset = Access_Log.objects.filter(**kwargs).order_by(order)
  104. except Exception as e:
  105. return response.json(444)
  106. if starttime is not None and starttime != '' and endtime is not None and endtime != '':
  107. startt = datetime.datetime.fromtimestamp(int(starttime))
  108. starttime = startt.strftime("%Y-%m-%d %H:%M:%S.%f")
  109. endt = datetime.datetime.fromtimestamp(int(endtime))
  110. endtime = endt.strftime("%Y-%m-%d %H:%M:%S.%f")
  111. queryset = queryset.filter(time__range=(starttime, endtime))
  112. elif starttime is not None and starttime != '':
  113. startt = datetime.datetime.fromtimestamp(int(starttime))
  114. starttime = startt.strftime("%Y-%m-%d %H:%M:%S.%f")
  115. queryset = queryset.filter(time__gte=starttime)
  116. elif endtime is not None and endtime != '':
  117. endt = datetime.datetime.fromtimestamp(int(endtime))
  118. endtime = endt.strftime("%Y-%m-%d %H:%M:%S.%f")
  119. queryset = queryset.filter(time__lte=endtime)
  120. if queryset.exists():
  121. count = queryset.count()
  122. res = queryset[(page - 1) * line:page * line]
  123. send_json = CommonService.qs_to_dict(res)
  124. send_json['count'] = count
  125. return response.json(0, send_json)
  126. return response.json(0, {'datas': [], 'count': 0})
  127. @ratelimit(key='ip', rate='3/m')
  128. def statisticsPath(request):
  129. request.encoding = 'utf-8'
  130. if request.method == 'GET':
  131. token = request.GET.get('token', None)
  132. if request.method == 'POST':
  133. token = request.POST.get('token', None)
  134. response = ResponseObject()
  135. was_limited = getattr(request, 'limited', False)
  136. # 限制同一个ip该接口一分钟不能访问超过两次
  137. if was_limited is True:
  138. return response.json(5)
  139. tko = TokenObject(token)
  140. response.lang = tko.lang
  141. if tko.code != 0:
  142. return response.json(tko.code)
  143. userID = tko.userID
  144. own_perm = ModelService.check_perm(userID, 10)
  145. if own_perm is not True:
  146. return response.json(404)
  147. paths = TemplateService.log_api()
  148. datas = {}
  149. for path in paths:
  150. count = Access_Log.objects.filter(operation=path).count()
  151. datas[path] = count
  152. return response.json(0, {'datas': datas})
  153. # 按季度删除访问日志
  154. def deleteSn(request):
  155. request.encoding = 'utf-8'
  156. if request.method == 'GET':
  157. request_dict = request.GET
  158. if request.method == 'POST':
  159. request_dict = request.POST
  160. token = request_dict.get('token', None)
  161. days = request_dict.get('days', None)
  162. response = ResponseObject()
  163. if not days:
  164. return response.json(444, 'days')
  165. tko = TokenObject(token)
  166. response.lang = tko.lang
  167. if tko.code != 0:
  168. return response.json(tko.code)
  169. userID = tko.userID
  170. own_perm = ModelService.check_perm(userID, 10)
  171. if own_perm is not True:
  172. return response.json(404)
  173. dltime = datetime.datetime.now() - datetime.timedelta(days=int(days))
  174. count = Access_Log.objects.filter(time__gte=dltime).delete()
  175. return response.json(0, count)
  176. # 一键redis日志转移至mysql
  177. def InstantLog(request):
  178. request.encoding = 'utf-8'
  179. response = ResponseObject()
  180. if request.method == 'GET':
  181. token = request.GET.get('token', None)
  182. if request.method == 'POST':
  183. token = request.POST.get('token', None)
  184. else:
  185. return response.json(104)
  186. if SERVER_TYPE == 'Ansjer.formal_settings':
  187. logKey = 'logger'
  188. else:
  189. logKey = 'test_logger'
  190. tko = TokenObject(token)
  191. if tko.code != 0:
  192. return response.json(tko.code)
  193. own_perm = ModelService.check_perm(tko.userID, 30)
  194. if not own_perm:
  195. return response.json(404)
  196. # 判断redis列表长度
  197. redisObj = RedisObject(db=3)
  198. data_list = redisObj.lrange(logKey, 0, -1)
  199. redisObj.del_data(key=logKey)
  200. ModelService.add_batch_log(data_list)
  201. return response.json(0)