import datetime import threading import time import requests import simplejson as json from django.utils.timezone import utc from Object.TokenObject import TokenObject from Object.mongodb import mongodb from Service.CommonService import CommonService from Service.ModelService import ModelService from Service.TemplateService import TemplateService from Object.RedisObject import RedisObject from 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: pass def 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)