>

Django 문서에서 영감을 얻은 다음 클래스가 있다고 가정하십시오.


class SimpleMiddleware(object):
    def __ init__(self, get_response):
        self.get_response = get_response
    def __call__(self, request):

        response = self.get_response(request)

        return response
    def process_view(self, request, view_func, view_args, view_kwargs):
        return None

Daniel Rubio의 책 'Beginning Django'를 읽을 때 그는 실행 순서가 다음과 같다고 설명합니다 :

<올>
  • __ init __  메소드가 트리거 됨 (서버 시작시)
  • __ call __  요청이있을 때마다 메소드가 트리거 됨
  • 만약 process_view()  메소드가 트리거 됨
  • 보기 메소드는 self.get_response(request) 로 시작합니다.   __ call __ 의 진술
  • " __ call __ 의 정확한 기능  메소드가 트리거 될 때마다 (모든 요청에서) " __ call __ 를"트리거링 "하지 않습니까?  메소드는 실제로 ' self.get_respone(request) 를 트리거합니다. '자동으로 다른 미들웨어 또는 클래스를 호출합니까?

    Django 문서에는 다음과 같이 명시되어 있습니다 :

    process_view()  Django가 뷰를 호출하기 직전에 호출됩니다 .`

    나에게 이것은 장고가 'SimpleMiddleware' 의 인스턴스를 확인한다는 것을 의미해야한다.  클래스는 'process_view()' 메소드를 포함합니다  그런 다음 __ call __() 를 호출하기 전에 트리거합니다.  '보기를 호출하는'방법? 그렇지 않으면, __ call __  메소드가 즉시 트리거되며 ' process_view() ' __ call __ 이후 놓쳐  메소드가 뷰 (또는 다음 미들웨어)를 호출합니까?

    누군가 실행 프로세스를 이해하도록 도와 줄 수 있습니까? Django는이 문제를 어떻게 해결합니까?

    감사합니다


    • 답변 # 1

      이전 스타일 (pre django 1.10)과 새로운 스타일 미들웨어를 혼합하고 있습니다. 새로운 스타일은 다음과 같습니다.

      class SimpleMiddleware:
          def __init__(self, get_response):
              self.get_response = get_response
              # One-time configuration and initialization.
          def __call__(self, request):
              # do stuff with request
              response = self.get_response(request)
              # do stuff with request and/or response
              return response
      
      

      이에 해당하는 이전 스타일은 다음과 같습니다.

      class SimpleMiddleware:
          def process_request(self, request):
              # do stuff with request
          def process_response(self, request, response):
              # do stuff with request and/or response
      
      

      이전 코드를 새로운 방식으로 쉽게 포팅하기 위해 django는 MiddlewareMixin (소스)을 추가했습니다 :

      class MiddlewareMixin:
          def __init__(self, get_response=None):
              self.get_response = get_response
              super().__init__()
          def __call__(self, request):
              response = None
              if hasattr(self, 'process_request'):
                  response = self.process_request(request)
              response = response or self.get_response(request)
              if hasattr(self, 'process_response'):
                  response = self.process_response(request, response)
              return response
      
      

      이전 스타일 미들웨어로 지금해야 할 일은이 믹스 인을 서브 클래스로 만드는 것입니다. 그러나 일반적으로 새로운 스타일의 미들웨어는 그 자체로 process_... 가 필요하지 않습니다.  행동 양식. 하지만 예를 들면 :

      from django.utils.deprecation import MiddlewareMixin
      class SimpleMiddleware(MiddlewareMixin):
          def process_request(self, request):
              # do stuff with request
          def process_request(self, request, response):
              # do stuff with request and/or response
      
      

      두 세계에서 작동합니다.

  • 이전 swift - 왜 2D UIImage 배열을 가질 수 없습니까?
  • 다음 java - 유효성 검사 Spring3 + 최대 절전 모드