| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217 | import datetimeimport simplejson as jsonfrom django.utils.decorators import method_decoratorfrom django.views.decorators.csrf import csrf_exemptfrom django.views.generic.base import Viewfrom ratelimit.decorators import ratelimitfrom Model.models import Access_Logfrom Object.ResponseObject import ResponseObjectfrom Object.TokenObject import TokenObjectfrom Service.CommonService import CommonServicefrom Service.ModelService import ModelServicefrom Service.TemplateService import TemplateServicefrom Ansjer.config import SERVER_TYPEfrom Object.RedisObject import RedisObject'''http://192.168.136.40:8077/accesslog?operation=queryByAdmin&token=test&page=1&line=5&order=-idhttp://192.168.136.40:8077/accesslog?operation=truncateByAdmin&token=testhttp://192.168.136.40:8077/accesslog?operation=searchByAdmin&token=test&page=1&line=10&content={"status":20}&order=-idhttp://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)        tko = TokenObject(token)        response.lang = tko.lang        if tko.code != 0:            return response.json(tko.code)        userID = tko.userID        operation = request_dict.get('operation', None)        if not userID:            return response.json(104)        if not operation:            return response.json(444, 'operation')        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)    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'        if not page or not line:            return response.json(444, 'page,line')        own_perm = ModelService.check_perm(userID=userID, permID=30)        if own_perm is not True:            return response.json(404)        if SERVER_TYPE == 'Ansjer.formal_settings':            logKey = 'logger'        else:            logKey = 'test_logger'        # 判断redis列表长度        redisObj = RedisObject()        data_list = redisObj.lrange(logKey, 0, -1)        redisObj.del_data(key=logKey)        ModelService.add_batch_log(data_list)        qs = Access_Log.objects.all().order_by(order)        if qs.exists():            count = qs.count()            res = qs[(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})    # 清空日志表    def truncate_by_admin(self, userID, response, ):        check_perm = ModelService.check_perm(userID=userID, permID=10)        if check_perm is True:            from django.db import connection            cursor = connection.cursor()            sql = "TRUNCATE TABLE `access_log`"            cursor.execute(sql)            return response.json(0)        else:            return response.json(404)    # 搜索日志(多条件)    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 SERVER_TYPE == 'Ansjer.formal_settings':            logKey = 'logger'        else:            logKey = 'test_logger'            # 判断redis列表长度        redisObj = RedisObject()        data_list = redisObj.lrange(logKey, 0, -1)        redisObj.del_data(key=logKey)        ModelService.add_batch_log(data_list)        # qs = Access_Log.objects.all().order_by(order)        if not page or not line:            return response.json(444, 'page,line')        check_perm = ModelService.check_perm(userID=userID, permID=20)        if check_perm is not True:            return response.json(404)        try:            content = json.loads(content)            kwargs = {}            for (k, v) in content.items():                if v is not None and v != '':                    if k == 'content':                        kwargs[k + '__icontains'] = v                    else:                        kwargs[k] = v            queryset = Access_Log.objects.filter(**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})@ratelimit(key='ip', rate='3/m')def statisticsPath(request):    request.encoding = 'utf-8'    if request.method == 'GET':        token = request.GET.get('token', None)    if request.method == 'POST':        token = request.POST.get('token', None)    response = ResponseObject()    was_limited = getattr(request, 'limited', False)    # 限制同一个ip该接口一分钟不能访问超过两次    if was_limited is True:        return response.json(5)    tko = TokenObject(token)    response.lang = tko.lang    if tko.code != 0:        return response.json(tko.code)    userID = tko.userID    own_perm = ModelService.check_perm(userID, 30)    if own_perm is not True:        return response.json(404)    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})# 按季度删除访问日志def deleteSn(request):    response = ResponseObject()    request.encoding = 'utf-8'    if request.method == 'GET':        request_dict = request.GET    elif request.method == 'POST':        request_dict = request.POST    else:        return response.json(104)    token = request_dict.get('token', None)    days = request_dict.get('days', None)    if not days:        return response.json(444, 'days')    tko = TokenObject(token)    response.lang = tko.lang    if tko.code != 0:        return response.json(tko.code)    userID = tko.userID    own_perm = ModelService.check_perm(userID, 10)    if own_perm is not True:        return response.json(404)    for i in range(5):        dltime = datetime.datetime.now() - datetime.timedelta(days=int(days))        al_qs = Access_Log.objects.filter(time__gte=dltime)[0:10000]        id_list = al_qs.values_list("id", flat=True)        Access_Log.objects.filter(id__in=list(id_list)).delete()    return response.json(0)
 |