middleware.py 3.3 KB

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