Django 미들웨어 의 5 가지 사용자 정의 방법 을 자세히 설명 합 니 다.

14027 단어 Django중간 부품
Django 미들웨어
http 에서 보기 함수 에 도착 하기 전에 보기 함수 return 을 요청 한 후 django 는 자신의 규칙 에 따라 적당 한 시기 에 미들웨어 에 해당 하 는 방법 을 실행 합 니 다.
중간 부품 의 실행 절차
1.모든 request 방법 을 실행 하고 보기 함수 에 도착 합 니 다.
2.중간 부품 을 수행 하 는 다른 방법
3.모든 response 방법 을 통 해 클 라 이언 트 에 게 돌아 갑 니 다.
메모:이 중 1 개의 미들웨어 에서 request 방법 에서 값 을 return 하면 현재 미들웨어 의 response 방법 을 실행 하여 사용자 에 게 돌아 가서 오 류 를 보고 합 니 다.다음 미들웨어 는 더 이상 실행 되 지 않 습 니 다.

사용자 정의 미들웨어
1.프로젝트 아래 에 아무 거나 py 파일 만 들 기

from django.utils.deprecation import MiddlewareMixin
class Middle1(MiddlewareMixin):
 def process_request(self,request):
  print("  ")
 def process_response(self, request,response):
  print('  ')
2.setings 파일 에 이 py 파일 을 등록 합 니 다.
django 프로젝트 의 settings 모듈 에 MIDDLEWARE 가 있 습 니 다.CLASSES 변 수 는 모든 요소 가 중간 부품 입 니 다.

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',
 'M1.Middle1',
]
실행 결과

왜 잘못 보 고 했 습 니까?
사용자 정의 미들웨어 response 방법 이 return 이 없 기 때문에 다음 미들웨어 에 맡 겨 http 요청 이 중단 되 었 습 니 다!!
사용자 정의 미들웨어 request 방법 에 주의 하 십시오.return 값 미들웨어 가 더 이상 실행 되 지 않 기 때문에 http 요청 은 보기 전에 실 행 됩 니 다!

from django.utils.deprecation import MiddlewareMixin
class Middle1(MiddlewareMixin):
 def process_request(self,request):
  print("  ") #  return Django         
 def process_response(self, request,response):
  print('  ')
  return response #                      

중간 부품(클래스)중 5 가지 방법
미들웨어 에서 5 가지 방법 을 정의 할 수 있 습 니 다.각각:
  • process_request(self,request)
  • process_view(self, request, callback, callback_args, callback_kwargs)
  • process_template_response(self,request,response)
  • process_exception(self, request, exception)
  • process_response(self, request, response
  • 1、 process_view(self, request, callback, callback_args, callback_kwargs)방법 소개
    (1)모든 미들웨어 의 request 방법 을 수행 합 니 다.'
    (2)url 일치 성공
    (3)보기 함수 의 이름,파 라 메 터 를 가 져 와 프로 세 스 를 실행 합 니 다view()방법
    (4)마지막 으로 보기 함수 실행
    게임 방법 1(일반)
    
    from django.utils.deprecation import MiddlewareMixin
    
    
    class M1(MiddlewareMixin):
     def process_request(self, request):
      print('M1.request') 
    
     def process_view(self, request,callback,callback_args,callback_kwargs ):
      print("M1.process_view")
      
     def process_response(self, request, response):
      print('M1.response')
      return response 
    
    
    
    class M2(MiddlewareMixin):
     def process_request(self, request):
      print('M2.request') 
    
     def process_view(self, request,callback,callback_args,callback_kwargs ):
      print("M2.process_view")
     
     def process_response(self, request, response):
      print('M2.response')
      return response
    실행 결과

    게임 방법
    이왕 프로 세 스view 보기 함수 의 이름,인 자 를 가 져 와 프로 세 스 를 실행 하지 않 습 니 다view()방법,마지막 에 보기 함 수 를 실행 합 니 다!
    그럼 프로 세 스 를 수행 할 수 있 습 니 다view 코너 에서 함 수 를 직접 실행 하여 되 돌려 줍 니까?
    
    from django.utils.deprecation import MiddlewareMixin
    class M1(MiddlewareMixin):
     def process_request(self, request):
      print('M1.request')
         # callback       callback_args,callback_kwargs            
     def process_view(self, request,callback,callback_args,callback_kwargs ):
      print("M1.process_view")
      response=callback(request,*callback_args,**callback_kwargs)
      return response
     def process_response(self, request, response):
      print('M1.response')
      return response
    
    class M2(MiddlewareMixin):
     def process_request(self, request):
      print('M2.request') 
    
     def process_view(self, request,callback,callback_args,callback_kwargs ):
      print("M2.process_view")
     def process_response(self, request, response):
      print('M2.response')
      return response
    실행 결과

    결론:
    하면,만약,만약...view 함 수 는 반환 값 이 있 습 니 다.마지막 미들웨어 로 넘 어가 마지막 미들웨어 의 response 방법 을 실행 하고 점차적으로 되 돌아 갑 니 다.
    와 process요청 방법 이 달라 요!request 방법 은 현재 미들웨어 의 response 방법 으로 되 돌아 갑 니 다.
    2、process_exception(self,request,exception)방법
    
    from django.utils.deprecation import MiddlewareMixin
    
    
    class M1(MiddlewareMixin):
     def process_request(self, request):
      print('M1.request')
      
     def process_view(self, request,callback,callback_args,callback_kwargs ):
      print("M1.process_view")
    
     def process_response(self, request, response):
      print('M1.response')
      return response
    
     def process_exception(self, request,exception):
      print('M1 process_exception')
    
    
    class M2(MiddlewareMixin):
     def process_request(self, request):
      print('M2.request') 
    
     def process_view(self, request,callback,callback_args,callback_kwargs ):
      print("M2.process_view")
    
     def process_response(self, request, response):
      print('M2.response')
      return response
    
     def process_exception(self, request, exception):
      print('M2 process_exception')
    프로 세 스 를 넣 고 왔 습 니 다exception 방법 은 왜 아무것도 실행 하지 않 았 습 니까?!!프로 세 스 였 구나exception 은 기본적으로 실행 하지 않 습 니 다!!!

    할아버지 의 원래 processexception 방법 은 보기 함수 가 잘못 되 었 을 때 만 실 행 됩 니 다.
    
    M1.request
    M2.request
    M1.process_view
    M2.process_view
      index
    M2 process_exception
    M1 process_exception
    Internal Server Error: /index/
    Traceback (most recent call last):
     File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\site-packages\django\core\handlers\exception.py", line 41, in inner
     response = get_response(request)
     File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\site-packages\django\core\handlers\base.py", line 187, in _get_response
     response = self.process_exception_by_middleware(e, request)
     File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\site-packages\django\core\handlers\base.py", line 185, in _get_response
     response = wrapped_callback(request, *callback_args, **callback_kwargs)
     File "F:\untitled1\app01\views.py", line 7, in index
     int("ok")
    ValueError: invalid literal for int() with base 10: 'ok'
    M2.response
    M1.response
    [03/Jul/2017 16:43:59] "GET /index/ HTTP/1.1" 500 62663
    1.모든 request 방법 수행
    2,모든 프로 세 스 수행view 방법
    3.보기 함수 가 잘못 되면 process 를 실행 합 니 다.exception(최종 응답,processexception 의 return 값)
    하면,만약,만약...exception 방법 은 반환 값 이 있 으 면 다른 미들웨어 의 process 를 실행 하지 않 습 니 다.exception,response 방법 응답 직접 실행
    4.모든 response 방법 실행
    5.마지막 으로 processexception 의 반환 값
    
    M1.request
    M2.request
    M1.process_view
    M2.process_view
      index
    M2 process_exception (  return ,    response)
    M2.response
    M1.response
    process_exception 의 응용
    보기 함수 가 실 행 될 때 오류 정 보 를 되 돌려 줍 니 다.이렇게 하면 페이지 가 틀 리 지 않 을 것 이다!
    
    class M1(MiddlewareMixin):
     def process_request(self, request):
      print('M1.request')
    
     def process_view(self, request,callback,callback_args,callback_kwargs ):
      print("M1.process_view")
    
     def process_response(self, request, response):
      print('M1.response')
      return response
    
     def process_exception(self, request,exception):
      print('M1 process_exception')
    
    
    class M2(MiddlewareMixin):
     def process_request(self, request):
      print('M2.request')
    
     def process_view(self, request,callback,callback_args,callback_kwargs ):
      print("M2.process_view")
    
     def process_response(self, request, response):
      print('M2.response')
      return response
    
     def process_exception(self, request, exception):
      print('M2 process_exception')
      return HttpResponse('     !!!')
    3、process_template_response()
    
    from django.utils.deprecation import MiddlewareMixin
    from django.shortcuts import HttpResponse
    
    class M1(MiddlewareMixin):
     def process_request(self, request):
      print('M1.request')
    
     def process_view(self, request,callback,callback_args,callback_kwargs ):
      print("M1.process_view")
    
     def process_response(self, request, response):
      print('M1.response')
      return response
    
    
     def process_exception(self, request,exception):
      print('M1 process_exception')
    
    
    class M2(MiddlewareMixin):
     def process_request(self, request):
      print('M2.request')
    
     def process_view(self, request,callback,callback_args,callback_kwargs ):
      print("M2.process_view")
    
     def process_response(self, request, response):
      print('M2.response')
      return response
    
     def process_exception(self, request, exception):
      print('M2 process_exception')
    
     def process_template_response(self,request,response):
      print('M2process_template_response')
      return response
    process_template_response()기본 실행 안 함

    rocess_template_response()특성
    보기 함수 의 반환 대상 에서 만 render 방법 이 실 행 됩 니 다!
    대상 의 render 방법의 반환 값 을 사용자 에 게 되 돌려 줍 니 다.(보기 함수 의 return 결 과 를 되 돌려 주지 않 고 보기 함수 return 값(대상)의 render 방법 을 되 돌려 줍 니 다)
    
    from django.utils.deprecation import MiddlewareMixin
    from django.shortcuts import HttpResponse
    
    
    class M1(MiddlewareMixin):
     def process_request(self, request):
      print('M1.request')
    
     def process_view(self, request,callback,callback_args,callback_kwargs ):
      print("M1.process_view")
    
     def process_response(self, request, response):
      print('M1.response')
      return response
    
    
     def process_exception(self, request,exception):
      print('M1 process_exception')
    
    
    class M2(MiddlewareMixin):
     def process_request(self, request):
      print('M2.request')
    
     def process_view(self, request,callback,callback_args,callback_kwargs ):
      print("M2.process_view")
    
     def process_response(self, request, response):
      print('M2.response')
      return response
    
     def process_exception(self, request, exception):
      print('M2 process_exception')
    
     def process_template_response(self,request,response): #              render  ,     process_template_response
      print('M2process_template_response')
      return response
    보기 함수
    
    from django.shortcuts import render,HttpResponse
    
    # Create your views here.
    class Foo():
     def __init__(self,requ):
      self.req=requ
     def render(self):
      return HttpResponse('OKKKK')
    
    def index(request):
     print("  index")
     obj=Foo(request)
     return obj
    실행 결과

    적용:
    이왕 프로 세 스template_respnse,보기 함수 의 return 결 과 를 되 돌려 주지 않 고 보기 함수 return 값(대상)의 render 방법 을 되 돌려 줍 니 다.(코 너 를 하나 더 넣 었 다)
    이 보기 함수 가 대상 을 되 돌려 주 는 render 방법 에서 값 을 되 돌려 주 는 2 차 가공 을 할 수 있 습 니 다!몇 개 더 가공 하면 보기 함 수 를 마음대로 사용 할 수 있 습 니 다!
    (분무기 에 여러 개의 노즐 이 있 는 것 처럼 서로 다른 노즐 을 바 꾸 어 서로 다른 물 을 뿜 으 면 되 돌아 오 는 값 도 구성 화 될 수 있다)
    
    from django.shortcuts import render,HttpResponse
    
    # Create your views here.
    class Dict(): #              !!
     def __init__(self,requ,msg):
      self.req=requ 
      self.msg=msg
     def render(self):
      a=self.msg # render                      、   。。。 
         #                 ,return     !                         
      return HttpResponse(a) #
    
    def index(request):
     print("  index")
     obj=Dict(request,"vv")
     return obj
    미들웨어 응용 장면
    미들웨어 작업 은 보기 함수 가 실행 되 기 전,실행 후(모든 보기 함수 와 같 지 않 은 장식 기!)모든 요청/일부 요청 에 맞 게 일괄 처리
    1.IP 제한
    중간 부품 류 의 목록 에 넣 어서 일부 IP 접근 을 막 았 습 니 다.
    2.URL 접근 필터
    사용자 가 login 보기에 접근 했다 면(놓 치기)
    다른 보기 에 접근 하려 면(session 이 이미 실행 되 었 는 지,login 으로 돌아 가지 않 았 는 지 확인 해 야 합 니 다)여러 보기 함수 에 장식 기 를 쓰 지 않도록 해 야 합 니 다!
    3.캐 시(CDN 기억 나 세 요?)
    클 라 이언 트 요청 이 왔 습 니 다.미들웨어 는 캐 시 에 데이터 가 있 는 지 확인 하고 사용자 에 게 직접 되 돌려 주 며 논리 층 에 가서 보기 함 수 를 실행 하지 않 았 습 니 다.
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기