Django 미들웨어 의 5 가지 사용자 정의 방법 을 자세히 설명 합 니 다.
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 가지 방법 을 정의 할 수 있 습 니 다.각각:
(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 기억 나 세 요?)
클 라 이언 트 요청 이 왔 습 니 다.미들웨어 는 캐 시 에 데이터 가 있 는 지 확인 하고 사용자 에 게 직접 되 돌려 주 며 논리 층 에 가서 보기 함 수 를 실행 하지 않 았 습 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.