[Django 고급] Django의 중간부품 메커니즘과 실행 순서 이해
12650 단어 Django
주:middleware와 중간부품은 아래 글에서 뜻이 같아서 완전히 번역되지 않았습니다
만약 당신이 Django 공식 문서middleware 부분을 읽었다면.다음은 가능한 한 문서에서 언급한 지식을 상세하게 소개하지만, 그래도
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를 제공합니다.
여러분은view
AuthenticationMiddleware
에서 자주 사용하실 거예요.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를 사용할 때 기억해야 할 것
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_request
BookMiddleware
뒤에 놓겠습니다.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>
너는 다음 두 가지 일에 주의할 것이다.
주석
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()
는 생략되고 실행되지 않습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Django 라우팅 계층 URLconf 작용 및 원리 해석URL 구성(URLconf)은 Django가 지원하는 웹 사이트의 디렉토리와 같습니다.그것의 본질은 URL과 이 URL을 호출할 보기 함수 사이의 맵표입니다. 위의 예제에서는 URL의 값을 캡처하고 위치 매개 변수로...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.