| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202 | import datetimeimport threadingimport timeimport requestsimport simplejson as jsonfrom django.utils.timezone import utcfrom Object.TokenObject import TokenObjectfrom Object.mongodb import mongodbfrom Service.CommonService import CommonServicefrom Service.ModelService import ModelServicefrom Service.TemplateService import TemplateServicefrom Object.RedisObject import RedisObjectfrom Ansjer.config import SERVER_TYPE# 杂项类,共用行不高,但有些地方需求class MiscellService():    # 获取访问用户名称    @staticmethod    def get_access_name(request_dict):        userName = request_dict.get('userName', None)        if userName:            return userName        email = request_dict.get('email', None)        if email:            return email        phone = request_dict.get('phone', None)        if phone:            return phone        token = request_dict.get('token', None)        user = ''        if token is not None:            tko = TokenObject(token)            if tko.code == 0:                user = tko.user                # user = ModelService.get_user_name(tko.userID)        return user    @staticmethod    def add_access_log(request, status_code):        # 增加多进程 异步        asy = threading.Thread(target=addLog, args=(request, status_code))        asy.start()    @staticmethod    def access_log(request, response, type):        if request.method == 'GET':            request_dict = request.GET        elif request.method == 'POST':            # request.encoding = 'utf-8'            request_dict = request.POST        else:            return        api_list = TemplateService.log_api()        request_path = request.path.strip().strip('/')        if request_path in api_list:            clientIP = CommonService.get_ip_address(request)            now_time = time.time()            password = request_dict.get('userPwd', None)            if password is not None:                request_dict = dict(request_dict)                request_dict.pop('userPwd')            content = json.dumps(request_dict)            area = CommonService.getAddr(ip=clientIP)            if type == 1:                status_code = 200            else:                status_code = response.status_code            add_data = {                'user': MiscellService.get_access_name(request=request),                'ip': clientIP,                'status': status_code,                'path': request_path,                'method': request.method,                'time': int(now_time),                'area': area,                'content': content,                'et': datetime.datetime.utcnow()            }            mdb = mongodb()            col = "log_access"            mdb.insert_one(col=col, data=add_data)    # 获取所有设备ip地址的指向的国家    @staticmethod    def getArea(ip):        data = {'ip': ip}        country = ''        URL = 'http://ip.taobao.com/service/getIpInfo.php'        try:            r = requests.get(URL, params=data, timeout=3)        except requests.RequestException as e:            print(e)        else:            json_data = r.json()            if json_data['code'] == 0:                if json_data['data']['country'] != 'XX':                    country = json_data['data']['country']        return country    # 下载接口添加访问日志    @staticmethod    def add_ota_download_log(request):        clientIP = CommonService.get_ip_address(request)        request_path = request.path.strip().strip('/')        now_time = datetime.datetime.utcnow().replace(tzinfo=utc).astimezone(utc)        add_data = {            'user': 'None',            'ip': clientIP,            'status': 200,            'url': request.META['SERVER_PROTOCOL'] + '-' + request.method + '-' + request.path,            'operation': request_path,            'time': now_time,            'content': ''        }        ModelService.addAccessLog(data=add_data)    @staticmethod    def batch_add_access_log(request, status_code):        asy = threading.Thread(target=batch_add_log_ctr, args=(request, status_code))        asy.start()def addLog(request, status_code):    try:        request.encoding = 'utf-8'        if request.method == 'GET':            request_dict = request.GET        elif request.method == 'POST':            request_dict = request.POST        else:            return        api_list = TemplateService.log_api()        request_path = request.path.strip().strip('/')        if request_path in api_list:            user = MiscellService.get_access_name(request_dict=request_dict)            clientIP = CommonService.get_ip_address(request)            now_time = datetime.datetime.utcnow().replace(tzinfo=utc).astimezone(utc)            password = request_dict.get('userPwd', None)            if password is not None:                request_dict = dict(request_dict)                request_dict.pop('userPwd')            content = json.dumps(request_dict)            add_data = {                'user': user,                'ip': clientIP,                'status': status_code,                'url': request.META['SERVER_PROTOCOL'] + '-' + request.method + '-' + request.path,                'operation': request_path,                'time': now_time,                'content': content            }            ModelService.addAccessLog(data=add_data)    except Exception as e:        passdef batch_add_log_ctr(request, status_code):    request.encoding = 'utf-8'    if request.method == 'GET':        request_dict = request.GET    elif request.method == 'POST':        request_dict = request.POST    else:        return    api_list = TemplateService.log_api()    request_path = request.path.strip().strip('/')    if request_path in api_list:        user = MiscellService.get_access_name(request_dict)        clientIP = CommonService.get_ip_address(request)        now_time = datetime.datetime.utcnow().replace(tzinfo=utc).astimezone(utc)        password = request_dict.get('userPwd', None)        if password is not None:            request_dict = dict(request_dict)            request_dict.pop('userPwd')        content = json.dumps(request_dict)        add_data = {            'user': user,            'ip': clientIP,            'status': status_code,            'url': request.META['SERVER_PROTOCOL'] + '-' + request.method + '-' + request.path,            'operation': request_path,            'time': str(now_time),            'content': content        }        redisObj = RedisObject()        loggerData = json.dumps(add_data)        print(loggerData)        if SERVER_TYPE == 'Ansjer.formal_settings':            logKey = 'logger'        else:            logKey = 'test_logger'        redisObj.rpush(name=logKey, val=loggerData)        # 判断redis列表长度        if redisObj.llen(name=logKey) > 100 or SERVER_TYPE == 'Ansjer.test_settings':            data_list = redisObj.lrange(logKey, 0, -1)            redisObj.del_data(key=logKey)            ModelService.add_batch_log(data_list)
 |