MiscellService.py 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. import datetime
  2. import threading
  3. import time
  4. import requests
  5. import simplejson as json
  6. from django.utils.timezone import utc
  7. from Object.TokenObject import TokenObject
  8. from Object.mongodb import mongodb
  9. from Service.CommonService import CommonService
  10. from Service.ModelService import ModelService
  11. from Service.TemplateService import TemplateService
  12. from Object.RedisObject import RedisObject
  13. # 杂项类,共用行不高,但有些地方需求
  14. class MiscellService():
  15. # 获取访问用户名称
  16. @staticmethod
  17. def get_access_name(request_dict):
  18. userName = request_dict.get('userName', None)
  19. if userName:
  20. return userName
  21. email = request_dict.get('email', None)
  22. if email:
  23. return email
  24. phone = request_dict.get('phone', None)
  25. if phone:
  26. return phone
  27. token = request_dict.get('token', None)
  28. user = ''
  29. if token is not None:
  30. tko = TokenObject(token)
  31. if tko.code == 0:
  32. user = tko.user
  33. # user = ModelService.get_user_name(tko.userID)
  34. return user
  35. @staticmethod
  36. def add_access_log(request, status_code):
  37. # 增加多进程 异步
  38. asy = threading.Thread(target=addLog, args=(request, status_code))
  39. asy.start()
  40. @staticmethod
  41. def access_log(request, response, type):
  42. if request.method == 'GET':
  43. request_dict = request.GET
  44. if request.method == 'POST':
  45. # request.encoding = 'utf-8'
  46. request_dict = request.POST
  47. api_list = TemplateService.log_api()
  48. request_path = request.path.strip().strip('/')
  49. if request_path in api_list:
  50. clientIP = CommonService.get_ip_address(request)
  51. now_time = time.time()
  52. password = request_dict.get('userPwd', None)
  53. if password is not None:
  54. request_dict = dict(request_dict)
  55. request_dict.pop('userPwd')
  56. content = json.dumps(request_dict)
  57. area = CommonService.getAddr(ip=clientIP)
  58. if type == 1:
  59. status_code = 200
  60. else:
  61. status_code = response.status_code
  62. add_data = {
  63. 'user': MiscellService.get_access_name(request=request),
  64. 'ip': clientIP,
  65. 'status': status_code,
  66. 'path': request_path,
  67. 'method': request.method,
  68. 'time': int(now_time),
  69. 'area': area,
  70. 'content': content,
  71. 'et': datetime.datetime.utcnow()
  72. }
  73. mdb = mongodb()
  74. col = "log_access"
  75. mdb.insert_one(col=col, data=add_data)
  76. # 获取所有设备ip地址的指向的国家
  77. @staticmethod
  78. def getArea(ip):
  79. data = {'ip': ip}
  80. country = ''
  81. URL = 'http://ip.taobao.com/service/getIpInfo.php'
  82. try:
  83. r = requests.get(URL, params=data, timeout=3)
  84. except requests.RequestException as e:
  85. print(e)
  86. else:
  87. json_data = r.json()
  88. if json_data['code'] == 0:
  89. if json_data['data']['country'] != 'XX':
  90. country = json_data['data']['country']
  91. return country
  92. # 下载接口添加访问日志
  93. @staticmethod
  94. def add_ota_download_log(request):
  95. clientIP = CommonService.get_ip_address(request)
  96. request_path = request.path.strip().strip('/')
  97. now_time = datetime.datetime.utcnow().replace(tzinfo=utc).astimezone(utc)
  98. add_data = {
  99. 'user': 'None',
  100. 'ip': clientIP,
  101. 'status': 200,
  102. 'url': request.META['SERVER_PROTOCOL'] + '-' + request.method + '-' + request.path,
  103. 'operation': request_path,
  104. 'time': now_time,
  105. 'content': ''
  106. }
  107. ModelService.addAccessLog(data=add_data)
  108. @staticmethod
  109. def batch_add_access_log(request, status_code):
  110. request.encoding = 'utf-8'
  111. if request.method == 'GET':
  112. request_dict = request.GET
  113. if request.method == 'POST':
  114. request_dict = request.POST
  115. api_list = TemplateService.log_api()
  116. request_path = request.path.strip().strip('/')
  117. if request_path in api_list:
  118. user = MiscellService.get_access_name(request_dict)
  119. clientIP = CommonService.get_ip_address(request)
  120. now_time = datetime.datetime.utcnow().replace(tzinfo=utc).astimezone(utc)
  121. password = request_dict.get('userPwd', None)
  122. if password is not None:
  123. request_dict = dict(request_dict)
  124. request_dict.pop('userPwd')
  125. content = json.dumps(request_dict)
  126. add_data = {
  127. 'user': user,
  128. 'ip': clientIP,
  129. 'status': status_code,
  130. 'url': request.META['SERVER_PROTOCOL'] + '-' + request.method + '-' + request.path,
  131. 'operation': request_path,
  132. 'time': str(now_time),
  133. 'content': content
  134. }
  135. redisObj = RedisObject()
  136. loggerData = json.dumps(add_data)
  137. print(loggerData)
  138. redisObj.rpush(name='logger', val=loggerData)
  139. # 判断redis列表长度
  140. if redisObj.llen(name='logger') > 100:
  141. data_list = redisObj.lrange('logger', 0, -1)
  142. redisObj.del_data(key='logger')
  143. ModelService.add_batch_log(data_list)
  144. else:
  145. pass
  146. # add batch
  147. def addLog(request, status_code):
  148. try:
  149. request.encoding = 'utf-8'
  150. if request.method == 'GET':
  151. request_dict = request.GET
  152. if request.method == 'POST':
  153. request_dict = request.POST
  154. api_list = TemplateService.log_api()
  155. request_path = request.path.strip().strip('/')
  156. if request_path in api_list:
  157. user = MiscellService.get_access_name(request_dict=request_dict)
  158. clientIP = CommonService.get_ip_address(request)
  159. now_time = datetime.datetime.utcnow().replace(tzinfo=utc).astimezone(utc)
  160. password = request_dict.get('userPwd', None)
  161. if password is not None:
  162. request_dict = dict(request_dict)
  163. request_dict.pop('userPwd')
  164. content = json.dumps(request_dict)
  165. add_data = {
  166. 'user': user,
  167. 'ip': clientIP,
  168. 'status': status_code,
  169. 'url': request.META['SERVER_PROTOCOL'] + '-' + request.method + '-' + request.path,
  170. 'operation': request_path,
  171. 'time': now_time,
  172. 'content': content
  173. }
  174. ModelService.addAccessLog(data=add_data)
  175. except Exception as e:
  176. pass