import datetime import simplejson as json from django.utils.decorators import method_decorator from django.views.decorators.csrf import csrf_exempt from django.views.generic.base import View from ratelimit.decorators import ratelimit from Model.models import Access_Log from Object.ResponseObject import ResponseObject from Object.TokenObject import TokenObject from Service.CommonService import CommonService from Service.ModelService import ModelService from Service.TemplateService import TemplateService ''' http://192.168.136.40:8077/accesslog?operation=queryByAdmin&token=test&page=1&line=5&order=-id http://192.168.136.40:8077/accesslog?operation=truncateByAdmin&token=test http://192.168.136.40:8077/accesslog?operation=searchByAdmin&token=test&page=1&line=10&content={"status":20}&order=-id http://192.168.136.40:8077/accesslog/staticPath/?token=stest ''' class AccessLog(View): @method_decorator(csrf_exempt) def dispatch(self, *args, **kwargs): return super(AccessLog, self).dispatch(*args, **kwargs) def get(self, request): response = ResponseObject() request.encoding = 'utf-8' return self.validation(request.GET, response) def post(self, request): response = ResponseObject() request.encoding = 'utf-8' return self.validation(request.POST, response) def validation(self, request_dict, response): token = request_dict.get('token', None) if token is not None: tko = TokenObject(token) tko.valid() response.lang = tko.lang if tko.code == 0: userID = tko.userID() operation = request_dict.get('operation', None) if userID is not None and operation is not None: if operation == 'queryByAdmin': return self.query_by_admin(request_dict, userID, response) elif operation == 'searchByAdmin': return self.search_by_admin(request_dict, userID, response) elif operation == 'truncateByAdmin': return self.truncate_by_admin(userID, response) return response.json(444, 'token,operation') else: return response.json(tko.code) else: return response.json(311) def query_by_admin(self, request_dict, userID, response): page = int(request_dict.get('page', None)) line = int(request_dict.get('line', None)) order = request_dict.get('order', '-id') if order == '': order = '-id' param_flag = CommonService.get_param_flag(data=[page, line]) if param_flag is True: check_perm = ModelService.check_permission(userID=userID, permID=30) if check_perm is True: access_log_queryset = Access_Log.objects.all().order_by(order) if access_log_queryset.exists(): count = access_log_queryset.count() res = access_log_queryset[(page - 1) * line:page * line] send_json = CommonService.qs_to_dict(res) send_json['count'] = count return response.json(0, send_json) return response.json(0, {'datas': [], 'count': 0}) else: return response.json(404) else: return response.json(444) # 清空日志表 def truncate_by_admin(self, userID, response, ): check_perm = ModelService.check_permission(userID=userID, permID=10) if check_perm is True: from django.db import connection cursor = connection.cursor() cursor.execute("TRUNCATE TABLE `access_log`") return response.json(0) # 搜索日志(多条件) def search_by_admin(self, request_dict, userID, response): page = int(request_dict.get('page', None)) line = int(request_dict.get('line', None)) order = request_dict.get('order', '-id') content = request_dict.get('content', None) starttime = request_dict.get('starttime', None) endtime = request_dict.get('endtime', None) if page is not None and line is not None: check_perm = ModelService.check_permission(userID=userID, permID=20) if check_perm is True: try: content = json.loads(content) search_kwargs = CommonService.get_kwargs(data=content) queryset = Access_Log.objects.filter(**search_kwargs).order_by(order) except Exception as e: return response.json(444) if starttime is not None and starttime != '' and endtime is not None and endtime != '': startt = datetime.datetime.fromtimestamp(int(starttime)) starttime = startt.strftime("%Y-%m-%d %H:%M:%S.%f") endt = datetime.datetime.fromtimestamp(int(endtime)) endtime = endt.strftime("%Y-%m-%d %H:%M:%S.%f") queryset = queryset.filter(time__range=(starttime, endtime)) elif starttime is not None and starttime != '': startt = datetime.datetime.fromtimestamp(int(starttime)) starttime = startt.strftime("%Y-%m-%d %H:%M:%S.%f") queryset = queryset.filter(time__gte=starttime) elif endtime is not None and endtime != '': endt = datetime.datetime.fromtimestamp(int(endtime)) endtime = endt.strftime("%Y-%m-%d %H:%M:%S.%f") queryset = queryset.filter(time__lte=endtime) if queryset.exists(): count = queryset.count() res = queryset[(page - 1) * line:page * line] send_json = CommonService.qs_to_dict(res) send_json['count'] = count return response.json(0, send_json) return response.json(0, {'datas': [], 'count': 0}) else: return response.json(404) else: return response.json(444, 'page,line') @ratelimit(key='ip', rate='3/m') def statisticsPath(request): request.encoding = 'utf-8' if request.method == 'GET': request_dict = request.GET if request.method == 'POST': request_dict = request.POST token = request_dict.get('token', None) response = ResponseObject() was_limited = getattr(request, 'limited', False) # 限制同一个ip该接口一分钟不能访问超过两次 if was_limited is True: return response.json(5) if token is not None: tko = TokenObject(token) tko.valid() response.lang = tko.lang if tko.code == 0: userID = tko.userID() own_perm = ModelService.check_permission(userID, 10) if own_perm is True: paths = TemplateService.log_api() datas = {} for path in paths: count = Access_Log.objects.filter(operation=path).count() datas[path] = count return response.json(0, {'datas': datas}) else: return response.json(404) else: return response.json(tko.code) else: return response.json(444, 'token')