Django 튜 토리 얼 노트 의 미들웨어 상세 설명

중간 부품 소개
미들웨어 는 말 그대로 request 와 response 처리 사이 에 있 는 처리 과정 으로 상대 적 으로 경량급 이 며 전체적으로 django 의 입 출력 을 바 꿉 니 다.전 체 를 바 꾸 기 때문에 신중 하고 실 용적 이 어야 하 며 잘 사용 하지 못 하면 성능 에 영향 을 줄 수 있다.
모든 미들웨어 는 하나의 기능 을 책임 집 니 다.예 를 들 어 AuthenticationMiddleware 는 sessions 처리 와 관련 이 있 습 니 다.
미들웨어 활성화
settings.py 프로필 에 MIDDLEWARE 를 설정 해 야 합 니 다.CLASSES:

MIDDLEWARE_CLASSES = [
 'django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
물론 중간 부품 을 사용 하지 않 아 도 됩 니 다.이것 은 빈 것 으로 설정 할 수 있 습 니 다.
미들웨어 순서
일반적으로 저 희 는 브 라 우 저 에서 Request 를 요청 합 니 다.응답 을 받 은 내용 은 Http Response 입 니 다.이 요청 이 Django 에 전달 되 는 과정 은 다음 과 같 습 니 다.processrequest 와 process response 의 실행 순 서 는 정반 대 입 니 다.다음 그림 과 같 습 니 다.

즉,모든 요청 은 중간 부품 중의 프로 세 스 를 먼저 통과 하 는 것 이다request 함수,이 함 수 는 None 또는 HttpResponse 대상 을 되 돌려 줍 니 다.전 자 를 되 돌려 주면 다른 미들웨어 를 계속 처리 하고 HttpResponse 를 되 돌려 주면 중 지 를 처리 하고 웹 페이지 로 돌아 갑 니 다.
중간 부품 은 어떤 종류(object 를 계승 할 수 있 음)에서 도 계승 하지 않 습 니 다.다음 중간 부품 의 대략적인 모습:

class CommonMiddleware(object):
 def process_request(self, request):
 return None

 def process_response(self, request, response):
 return response
필요 한 훅 몇 개:
  • process_request()
  • process_exception() (only if the view raised an exception)
  • process_template_response()
  • process_response()
  • 자주 사용 하 는 미들웨어 구성 요소:
    1. Sessions
    2. Authentication
    3. CSRF Protection
    4. GZipping Content
    예 를 들 어,예 를 들 어 우 리 는 데이터 통 계 를 해 야 한다.
    
    class BlockedIpMiddleware(object):
     def process_request(self, request):
       ...    access 
       access = access+1
       ...   ,        
    이 코드 의 기능 은 간단 한 접근 에 한 번 더 추가 하 는 것 입 니 다.이 미들웨어 의 Python 경 로 를 settings.py 에 기록 하 는 것 입 니 다.
    
    MIDDLEWARE_CLASSES = (
     'zjj.middleware.BlockedIpMiddleware',
     ...      
    )
    Django 는 MIDDLEWARECLASSES 에서 위 에서 아래로 미들웨어 의 process 를 하나씩 수행 합 니 다.request 함수,그 중 processresponse 함 수 는 맨 앞의 마지막 실행 입 니 다.
    둘째,예 를 들 어 우리 가 사이트 에서 서버 에 올 려 본 격 적 으로 실 행 된 후에 DEBUG 는 False 로 바 뀌 었 습 니 다.그러면 더욱 안전 합 니 다.그러나 가끔 오류 가 발생 하면 오류 상세 페이지 를 표시 하지 못 하고 이 두 가지 일 을 잘 처리 할 방법 이 있 습 니까?
    일반 방문 자 들 이 본 것 은 우호 적 인 오류 신고 정보 이다.
    관리자 가 본 것 은 버그 를 복구 하기 위해 오류 상세 한 상황 입 니 다.
    물론 있 습 니 다.중간 부품 을 이용 하면 할 수 있 습 니 다!코드 는 다음 과 같 습 니 다:
    
    import sys
    from django.views.debug import technical_500_response
    from django.conf import settings
    
    class UserBasedExceptionMiddleware(object):
     def process_exception(self, request, exception):
      if request.user.is_superuser or request.META.get('REMOTE_ADDR') in settings.INTERNAL_IPS:
       return technical_500_response(request, *sys.exc_info())
    이 중간 부품 을 위 와 같이 settings.py 에 추가 하 는 MIDDLEWARECLASSES 에서 마지막 에 놓 으 면 다른 미들웨어 의 process 를 볼 수 있 습 니 다.request 의 오류.
    방문 자가 관리자 일 때 이 사이트 에 존재 하지 않 는 페이지 를 방문 하 는 등 오류 에 대한 자세 한 정 보 를 제공 합 니 다.
    보통 사람들 이 보 는 것 은 보통 404(스스로 눌 러 보 세 요)인 데 우 리 는 볼 수 있 습 니 다.
    3.핸드폰 을 간단하게 식별 하 는 미들웨어 를 공유 하고 더 자세 한 것 은 이것 을 참고 할 수 있 습 니 다:django-mobi
    
    MOBILE_USERAGENTS = ("2.0 MMP","240x320","400X240","AvantGo","BlackBerry",
     "Blazer","Cellphone","Danger","DoCoMo","Elaine/3.0","EudoraWeb",
     "Googlebot-Mobile","hiptop","IEMobile","KYOCERA/WX310K","LG/U990",
     "MIDP-2.","MMEF20","MOT-V","NetFront","Newt","Nintendo Wii","Nitro",
     "Nokia","Opera Mini","Palm","PlayStation Portable","portalmmm","Proxinet",
     "ProxiNet","SHARP-TQ-GX10","SHG-i900","Small","SonyEricsson","Symbian OS",
     "SymbianOS","TS21i-10","UP.Browser","UP.Link","webOS","Windows CE",
     "WinWAP","YahooSeeker/M1A1-R2D2","iPhone","iPod","Android",
     "BlackBerry9530","LG-TU915 Obigo","LGE VX","webOS","Nokia5800")
    
    class MobileTemplate(object):
     """
     If a mobile user agent is detected, inspect the default args for the view 
     func, and if a template name is found assume it is the template arg and 
     attempt to load a mobile template based on the original template name.
     """
    
     def process_view(self, request, view_func, view_args, view_kwargs):
      if any(ua for ua in MOBILE_USERAGENTS if ua in 
       request.META["HTTP_USER_AGENT"]):
       template = view_kwargs.get("template")
       if template is None:
        for default in view_func.func_defaults:
         if str(default).endswith(".html"):
          template = default
       if template is not None:
        template = template.rsplit(".html", 1)[0] + ".mobile.html"
        try:
         get_template(template)
        except TemplateDoesNotExist:
         pass
        else:
         view_kwargs["template"] = template
         return view_func(request, *view_args, **view_kwargs)
      return None
    현지 화 된 미들웨어 의 예 를 다시 들 어 보 자.
    
    class LocaleMiddleware(object):
    
     def process_request(self, request):
    
      if 'locale' in request.cookies:
       request.locale = request.cookies.locale
      else:
       request.locale = None
    
     def process_response(self, request, response):
    
      if getattr(request, 'locale', False):
       response.cookies['locale'] = request.locale
    cookies 의 locale 을 request 의 locale 에 설정 하여 나중에 사용 하 는 것 입 니 다.
    이 부분 은 django 공식 문서 와 인터넷 상의 튜 토리 얼 을 참고 하 였 으 며,여기 서도 선배 들 의 공유 에 감 사 드 립 니 다.
    총결산
    이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

    좋은 웹페이지 즐겨찾기