middleware.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. from django.utils.deprecation import MiddlewareMixin
  4. from Ansjer import config as api_settings
  5. from Ansjer.config import SERVER_TYPE
  6. from Object.ResponseObject import ResponseObject
  7. from Service.MiscellService import MiscellService
  8. from Service import OperatingLogs
  9. from Service import CloudLogs
  10. import django.db
  11. # 设置mysql超时
  12. class StatisticsUrlMiddleware(MiddlewareMixin):
  13. def _https_statistics_to_reverse(self, request):
  14. '''
  15. :param request:
  16. :return:
  17. '''
  18. # 限制同时下载量
  19. path = request.path
  20. index = path.find('/OTA/downloads')
  21. if index != -1:
  22. addsCount = len(api_settings.ADDR_URL)
  23. if addsCount > 1000:
  24. return -1
  25. else:
  26. adds = request.META.get('REMOTE_ADDR', None)
  27. api_settings.ADDR_URL.append(adds)
  28. # MiscellService.add_ota_download_log(request=request)
  29. return 0
  30. def _https_statistics_to_close(self, request):
  31. '''
  32. :param request:
  33. :return:
  34. '''
  35. addsCount = len(api_settings.ADDR_URL)
  36. if addsCount > 0:
  37. api_settings.ADDR_URL.pop(0)
  38. def process_request(self, request):
  39. '''
  40. :function description
  41. Request预处理函数: process_request(self, request)
  42. :param request:
  43. :return: 应当返回 None 或 HttpResponse 对象
  44. 如果返回 None ,Django 将继续处理这个 request,执行后续的中间件,
  45. 然后调用相应的 view。
  46. 如果返回 HttpResponse 对象,Django 将不再执行任何其它的中间件
  47. (无视其种类)以及相应的view。 Django将立即返回该 HttpResponse。
  48. '''
  49. if request.path != '/favicon.ico':
  50. print('process_request:', request)
  51. result = self._https_statistics_to_reverse(request)
  52. if result == -1:
  53. response = ResponseObject()
  54. return response.json(910)
  55. return None
  56. def process_view(self, request, callback, callback_args, callback_kwargs):
  57. if request.path != '/favicon.ico':
  58. print('process_view:', request)
  59. return None
  60. def process_response(self, request, response):
  61. '''
  62. :function description
  63. Response后处理函数: process_response(self, request, response)
  64. 这个方法的调用时机在 Django 执行 view 函数并生成 response 之后。
  65. :param request: request 对象
  66. :param response: 从 view 中返回的 response 对象
  67. :return: 必须返回 HttpResponse 对象. 这个 response 对象可以是传入函数的那一个原始对象(通常已被修改),也可以是全新生成的。
  68. 该处理器能修改 response 的内容;一个常见的用途是内容压缩,如 gzip 所请求的 HTML 页面。
  69. '''
  70. self._https_statistics_to_close(request)
  71. ########记录访问日志
  72. # MiscellService.DynamoDB_add_access_log(request=request, status_code=response.status_code)
  73. if request.path !='/favicon.ico':
  74. print('process_response:', request, response)
  75. print('SERVER_TYPE:', SERVER_TYPE)
  76. CloudLogs.batch_add_access_log(request=request, status_code=response.status_code)
  77. try:
  78. pass
  79. # mysql
  80. if SERVER_TYPE!="Ansjer.formal_settings":
  81. # print('添加日志')
  82. # CloudLogs.batch_add_access_log(request=request, status_code=response.status_code)
  83. OperatingLogs.add_access_log(request=request, status_code=response.status_code)
  84. MiscellService.add_access_log(request=request, status_code=response.status_code)
  85. # else:
  86. # print('不添加日志')
  87. # mongodb版
  88. # MiscellService.access_log(request=request, response=response, type=0)
  89. except Exception as e:
  90. print(repr(e))
  91. django.db.close_old_connections()
  92. return response