MiscellService.py 7.0 KB

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