[Django 고급] Django의 중간부품 메커니즘과 실행 순서 이해

12650 단어 Django
원문은 Understanding Django Middlewares에서 나온 것으로, 이 글은 전체적으로django에서 중간부품의 정의, 작용, 그리고 어떻게 중간부품인 orangleliu를 직접 쓰는지 소개했다.
주:middleware와 중간부품은 아래 글에서 뜻이 같아서 완전히 번역되지 않았습니다
만약 당신이 Django 공식 문서middleware 부분을 읽었다면.다음은 가능한 한 문서에서 언급한 지식을 상세하게 소개하지만, 그래도 middleware의 기본 개념을 익히기를 바랍니다.
이 글에서 우리는 아래의 내용을 토론할 것이다.
  • middleware
  • 가 무엇입니까?
  • middleware를 언제 사용합니까
  • middleware가 기억해야 할 것을 쓴다
  • 중간부품의 작업 과정과 요점을 이해하기 위해middlewares를 쓴다
  • middleware 소개
    Middlewares는 Django request 또는 response 객체를 수정하는 갈고리입니다.다음은 Django 문서의 설명입니다.
    Middleware is a framework of hooks into Django’s request/response processing. It’s a light, low-level “plugin” system for globally altering Django’s input or output.

    middleware 사용 시기
    뷰에 전송된 HttpRequest 대상과 같은 요청을 수정하고 싶습니다.또는 뷰가 되돌아오는 Http Response 대상을 수정하고 싶으면, 이것들은 모두 중간부품을 통해 실현할 수 있습니다.
    view가 실행되기 전에 동작을 하고 싶을 수도 있습니다. 이 경우는middleware로 실현할 수 있습니다.
    Django는 다음과 같은 기본 middleware를 제공합니다.
    여러분은viewAuthenticationMiddleware에서 자주 사용하실 거예요.Django는 모든view가 실행되기 전에user를 Request의 속성으로 설정하려고 중간부품을 사용합니다.그래서 Django는 Request 대상을 수정할 수 있는 중간부품을 제공했다request.user.
    Django는 다음과 같이 Request 객체를 수정합니다.
    https://github.com/django/django/blob/master/django/contrib/auth/middleware.py#L22

    예를 들어 사용자는 시간대가 다른 사람들이다.모든 페이지에 접근할 때 정확한 시간대를 표시하고, 모든views에서 사용자 자신의timezone 정보를 얻을 수 있도록 하고 싶습니다.이 경우 세션으로 해결할 수 있기 때문에 다음과 같이middleware를 추가할 수 있습니다.
    class TimezoneMiddleware(object):
        def process_request(self, request):
            # Assuming user has a OneToOneField to a model called Profile
            # And Profile stores the timezone of the User.
            request.session['timezone'] = request.user.profile.timezone

    Timezone Middleware는 Request에 의존합니다.user의, request.user는 AuthenticationMiddleware를 통해 설정됩니다.그래서 AuthenticationMiddleware 설정에서 Timezone Middleware는 반드시 Authentication Middleware 다음에 있어야 합니다.
    아래의 예는 중간부품의 순서에 대한 더 많은 체험을 얻을 수 있다.
    middleware를 사용할 때 기억해야 할 것
  • middlewares의 순서가 매우 중요하다
  • middleware 하나는object류
  • 만 계승하면 됩니다
  • middleware는 몇 가지 방법을 실현할 수 있고 모든 방법을 실현할 필요가 없다
  • middleware 하나로processrequest (방법) 하지만 프로세스를 실현할 수 없습니다response(방법) 및 processview 방법.이것들은 모두 매우 흔히 볼 수 있는데, Django는 많은middlewares를 제공하여 할 수 있다.
  • middleware 하나로processresponse 방법, 하지만 프로세스를 실현할 필요가 없음request 메서드
  • Authentication Middleware는 요청에 대한 처리만 실현하고 응답을 처리하지 않습니다.참조 문서
    GZipMiddleware는 응답에 대한 처리만 실현하고 요청과view에 대한 처리는 문서 참조를 실현하지 않습니다
    middlewares 좀 써주세요.
    우선 Django 프로젝트가 있는지 확인하십시오. URL과 view가 필요하고 이view에 들어갈 수 있습니다.다음은 리퀘스트에 대한사용자는 권한이 설정되었는지 확인하고,view에서 Request를 정확하게 출력할 수 있도록 몇 가지 테스트를 합니다.사용자 정보.
    임의의 app에middlewar를 만듭니다.py 파일.
    나는 책이라는 앱이 하나 있기 때문에 파일의 위치는settings.MIDDLEWARE_CLASSES
    class BookMiddleware(object):
        def process_request(self, request):
            print "Middleware executed"

    MIDDLEWARE_CLASSES에 이 미들웨어 추가
    MIDDLEWARE_CLASSES = (
        'books.middleware.BookMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
    )

    임의의 URL에 요청을 보내면 다음 정보는runserver 컨트롤러에 출력됩니다.
    Middleware executed

    수정books/middleware.py
    은 다음과 같다.
    class BookMiddleware(object):
        def process_request(self, request):
            print "Middleware executed"
            print request.user

    URL을 다시 방문하면 오류가 발생합니다.
    'WSGIRequest' object has no attribute 'user'

    리퀘스트 대상이 사용자 속성을 설정하지 않았기 때문입니다.
    이제 미들웨어의 순서를 바꿔 BookMiddleware.process_requestBookMiddleware 뒤에 놓겠습니다.
    MIDDLEWARE_CLASSES = (
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'books.middleware.BookMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
    )

    URL에 접근하면runserver 컨트롤러에서 다음과 같이 출력합니다
    Middleware executed
    <username>

    이것은middlewares가 Request를 처리하는 순서와settings를 설명합니다.MIDDLEWARE_CLASSES에 나열된 순서는 동일합니다.
    너는 한층 더 증명할 수 있다,middleware.py 다른 middleware 추가
    class AnotherMiddleware(object):
        def process_request(self, request):
            print "Another middleware executed"

    그것도 추가AuthenticationMiddleware
    MIDDLEWARE_CLASSES = (
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'books.middleware.BookMiddleware',
        'books.middleware.AnotherMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
    )

    현재 출력은 다음과 같습니다.
    Middleware executed
    <username>
    Another middleware executed

    프로세스에서Request 메서드에서 Http Response를 반환하여 Book Middleware를 다음과 같이 변경합니다.
    class BookMiddleware(object):
        def process_request(self, request):
            print "Middleware executed"
            print request.user
            return HttpResponse("some response")

    다음 URL을 시도하면 다음과 같은 출력이 발생합니다.
    Middleware executed
    <username>

    너는 다음 두 가지 일에 주의할 것이다.
  • 어떤 URL을 방문하든지 상관없이view 처리 방법은 실행되지 않습니다. "some response"같은 응답만 있습니다.
  • AnotherMiddleware.process_request가 실행되지 않음
  • 그래서 만약에 Middleware의 프로세스가...Request 방법에서 Http Response 대상을 되돌려줍니다. 그 다음 중간부분은 생략되고,view의 처리 방법도 생략됩니다.그래서 실제 프로젝트에서 이렇게 하는 경우는 드물다. (단, 대리하는 경우도 있다)
    주석 MIDDLEWARE_CLASSES 을 달아야 두 개의 middleware가 정상적으로 요청을 처리할 수 있습니다.
    process 사용response
    이 두 개의middleware에 프로세스 추가response 방법
    class AnotherMiddleware(object):
        def process_request(self, request):
            print "Another middleware executed"
    
        def process_response(self, request, response):
            print "AnotherMiddleware process_response executed"
            return response
    
    class BookMiddleware(object):
        def process_request(self, request):
            print "Middleware executed"
            print request.user
            return HttpResponse("some response")
            #self._start = time.time()
    
        def process_response(self, request, response):
            print "BookMiddleware process_response executed"
            return response

    몇몇 URL에 방문하여 다음과 같은 출력을 얻다
    Middleware executed
    <username>
    Another middleware executed
    AnotherMiddleware process_response executed
    BookMiddleware process_response executed
    "return HttpResponse("some response")"AnotherMiddleware.process_response() 이전에 집행하고 BookMiddleware.process_response()AnotherMiddleware.process_request() 이후에 집행한다.그래서BookMiddleware.process_request() 실행 순서와processRequest는 정반대입니다.process_response() 실행 순서는 마지막 중간부품에서 밑에서 두 번째, 그리고 첫 번째 중간부품까지입니다.
    process_view
    Django는 위쪽에서 아래쪽으로 중간부품process_response()을 순서대로 실행하는 방법입니다.유사 processrequest () 방법이 실행되는 순서입니다.
    따라서 Http Response 대상process_view()이 Http Response 대상으로 되돌아오면 그 뒤process_view()는 생략되고 실행되지 않습니다.

    좋은 웹페이지 즐겨찾기