Django 미들웨어 실행 순서 자세히 알 아 보기

5190 단어 Django중간 부품
중간 부품
Django 의 중간 부품 은 경량급,하부 플러그 인 시스템 으로 Django 의 요청 과 응답 처리 과정 에 개입 하여 Django 의 입력 이나 출력 을 수정 할 수 있 습 니 다.미들웨어 의 디자인 은 개발 자 에 게 무 침입 식 개발 방식 을 제공 하여 Django 프레임 워 크 의 건장 성 을 강화 했다.
우 리 는 중간 부품 을 사용 하여 Django 처리 보기 의 서로 다른 단계 에서 입력 이나 출력 에 관여 할 수 있 습 니 다.
1 중간 부품 의 정의 방법
중간 부품 공장 함 수 를 정의 하고 다른 호출 이 가능 한 중간 부품 을 되 돌려 줍 니 다.
미들웨어 공장 함 수 는 호출 가능 한 get 을 받 아야 합 니 다.response 대상.
되 돌아 오 는 미들웨어 도 호출 될 수 있 는 대상 이 며,보기 처럼 request 대상 인 자 를 받 아 response 대상 을 되 돌려 야 합 니 다.

def simple_middleware(get_response):
 #          Django                。

 def middleware(request):
  #                      。

  response = get_response(request)

  #                       。

  return response

 return middleware
예 를 들 어 users 응용 프로그램 에 middleware.py 파일 을 새로 만 듭 니 다.

def my_middleware(get_response):
 print('init    ')
 def middleware(request):
  print('before request    ')
  response = get_response(request)
  print('after response    ')
  return response
 return middleware
미들웨어 를 정의 한 후 settings.py 파일 에 미들웨어 를 추가 해 야 합 니 다.

MIDDLEWARE = [
 'django.middleware.security.SecurityMiddleware',
 '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',
 'users.middleware.my_middleware', #      
]
보 기 를 정의 하여 테스트 합 니 다.

def demo_view(request):
 print('view      ')
 return HttpResponse('OK')
실행 결과

메모:Django 는 디 버 깅 모드 에서 실 행 됩 니 다.미들웨어 init 부분 은 두 번 호출 될 수 있 습 니 다.
2 실행 절차

3.여러 미들웨어 의 실행 순서
4.567917.요청 보기 가 처리 되 기 전에 중간 부품 은 위 에서 아래로 순서대로 실 행 됩 니 다4.567917.요청 보기 가 처 리 된 후 미들웨어 는 아래 에서 위로 순서대로 실 행 됩 니 다
예시:
두 개의 미들웨어 정의

def my_middleware(get_response):
 print('init    ')
 def middleware(request):
  print('before request    ')
  response = get_response(request)
  print('after response    ')
  return response
 return middleware

def my_middleware2(get_response):
 print('init2    ')
 def middleware(request):
  print('before request 2    ')
  response = get_response(request)
  print('after response 2    ')
  return response
 return middleware
중간 부품 두 개 추가

MIDDLEWARE = [
 'django.middleware.security.SecurityMiddleware',
 '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',
 'users.middleware.my_middleware', #   
 'users.middleware.my_middleware2', #   
]
실행 결과
init 2 호출 됨
init 호출 됨
before request 호출 됨
before request 2 호출 됨
view 보기 호출 됨
after response 2 호출 됨
after response 호출 됨
결론:미들웨어 의 본질 은 바로 장식 기 이다.장식 기 에 대해 제 가 예전 에 수필 에서 도 상세 하 게 말 했 듯 이 장식 기의 본질 은 바로 폐쇄 적 인 것 입 니 다.

장식 기 에 있어 서 이 프로그램 은 위 에서 아래로 실 행 됩 니 다.장식 기 1-3 을 기록 한 다음 에 함 수 를 읽 었 을 때 장식 기 는 장식 을 시작 합 니 다.함수 의 인용 을 장식 기 에 전달 하고 장식 기 3 부터 위로 장식 하기 시 작 했 습 니 다.그래서 이때 장식 기 3 의 초기 화 를 실행 하고 장식 한 함 수 를 새로운 함수 로 생각 합 니 다.다시 새로운 인용 을 장식 기 2 에 전달 한 다음 에 장식 기 2 를 초기 화하 고 새로운 함수 의 인용 을 장식 기 1 에 전달 하여 장식 합 니 다.이때 장식 기 1 의 초기 화 를 시작 하고 실행 을 시작 합 니 다.그 다음 에 실행 순 서 는 1-3 장식 을 수행 하 는 내 용 입 니 다.마지막 으로 원래 의 함 수 를 실행 합 니 다.기 존 함수 의 기능 과 특성 에 대한 요구 에 도달 하 다.
장식 기:프로그램 시작 순서,위 에서 아래로 읽 기-아래 에서 위로 장식-위 에서 아래로 실행
미들웨어 에서 실행 순 서 는 같 습 니 다.미들웨어 장식 은 보기 함수 나 시도 클래스 일 뿐 입 니 다.init()가 초기 화 됩 니 다.제 가 장식 기 순 서 를 설명 할 때 초기 화 는 현재 init()입 니 다.즉,중간 부품 은 실행 에 있어 서도 가장 가 까 운 함수 나 클래스 의 미들웨어 부터 초기 화 됩 니 다.미들웨어 등록 시...여러 개의 미들웨어 가 있 으 면 프로그램 은 위 에서 아래로 미들웨어 를 확인 하고 이 어 보기 함 수 를 실행 할 때 부터 아래 에서 위로 init()를 진행 합 니 다.여기 서 init()를 초기 화 하 는 것 은 Flask 프레임 워 크 의 네 가지 요청 체크 에서 요청 을 시작 하기 전에 한 번 실행 하 는 것 과 유사 합 니 다.아래 에서 위로 init 를 실행 한 다음 위 에서 아래로 요청 을 수행 하기 전에 실행 할 코드 를 초기 화 합 니 다.요청 이 끝 난 후 아래 에서 위로 요청 한 코드 를 실행 합 니 다.
미들웨어:프로그램 시작 순서,위 에서 아래로 읽 기-아래 에서 위로 init()-위 에서 아래로 요청 을 실행 하기 전-보기 의 요청-아래 에서 위로 요청 을 실행 한 후
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기