>  기사  >  백엔드 개발  >  Django 미들웨어에 대한 자세한 소개

Django 미들웨어에 대한 자세한 소개

零下一度
零下一度원래의
2017-07-18 10:49:551940검색

몇 주 동안 스크립트를 작성하다가 오늘 드디어 웹 프레임워크를 접하게 되었습니다. Python의 웹 프레임워크를 배우려면 Django가 거의 필수 과정입니다. 이번에는 먼저 시작하겠습니다. 작업은 설정에 버전을 추가하는 것입니다. 정적 CSS 및 js의 경로를 렌더링할 때 "example.v1124.css"와 같은 버전 번호를 첨부한 다음 요청 요청에서 버전 번호를 제거합니다. 왜 이런 일을 하는가? 이렇게 하면 프런트 엔드의 정적 파일 출력 경로에 버전 번호가 추가됩니다. 이런 방식으로 새 정적 파일이 개발되면 클라이언트는 로컬 캐시를 강제로 새로 고치게 됩니다. 이를 위해서는 먼저 설정 파일에서 구성해야 하며, 수정될 때마다 설정에서 버전 번호를 직접 읽을 수 있도록 해야 합니다. 1. Django 미들웨어의 요청 주기

요청을 보냅니다. HttpResponse의 내용, 이 요청을 Django에 전달하는 과정은 다음과 같습니다.

즉, 각 요청은 먼저 미들웨어의 process_request 함수를 통과합니다. 이 함수는 None 또는 an을 반환합니다. HttpResponse 객체가 반환되면 처리는 계속됩니다. 다른 미들웨어가 HttpResponse를 반환하면 프로세스가 중단되고 웹 페이지로 반환됩니다.

2. 미들웨어 사용자 정의 및 등록

1. 미들웨어 생성

프로젝트 루트 디렉터리에 미들웨어 py 파일 생성:

 1 class RequestExeute(object): 2     def process_request(self, request): 3         print('process_request') 4  5     def process_view(self, request, callback, callback_args, callback_kwargs): 6         print('process_view') 7  8     def process_exception(self, request, exception): 9         """10         当views函数出错时执行11         :param request: 
12         :param exception: 
13         :return: 
14         """15         print('process_exception')16         17     def process_response(self, request, response):18         """19         必须return HttpResponse20         :param request: 
21         :param response: 
22         :return: 
23         """24         print('process_response')25         return response26 27     def process_template_response(self, request, response):28         """29         视图函数的返回值中,如果有render方法,才被调用30         :param request:31         :param response:32         :return:33         """34         print('process_template_response')35         return response
md.py
2. 설정에서. py 파일을 실행하려는 순서대로 등록하세요:

ps. 버전 1.9 이하에서는 미들웨어의 키워드가 다음과 같습니다: MIDDLEWARE_CLASSES

MIDDLEWARE_CLASSES = ('zqxt.middleware.BlockedIpMiddleware',
    ...其它的中间件
)
3. 미들웨어의 메소드 실행 순서

1.

 1 from django.shortcuts import HttpResponse 2 from django.utils.deprecation import MiddlewareMixin 3 class M1(MiddlewareMixin): 4     def process_request(self, request): 5         print('m1.request') 6         # return HttpResponse('request_m1') 7  8     def process_view(self, request, callback, callback_args, callback_kwargs): 9         print('m1.view')10         # response = callback(request, *callback_args, **callback_kwargs)11         # return response12 13     def process_response(self, request, response):14         print('m1.response')15         return response16 17     def process_exception(self, request, exception):18         print('m1.process_exception')19         return HttpResponse('m1.process_exception')20 21     def process_template_response(self, request, response):22         """23         视图函数的返回值中,如果有render方法,才被调用24         :param request:25         :param response:26         :return:27         """28         print('m1.process_template_response')29         return response30 31 32 class M2(MiddlewareMixin):33     def process_request(self, request):34         print('m2.request')35 36     def process_view(self, request, callback, callback_args, callback_kwargs):37         print('m2.view')38         # response = callback(request, *callback_args, **callback_kwargs)39         # return response40 41     def process_response(self, request, response):42         print('m2.response')43         return response44 45     def process_exception(self, request, exception):46         print('m2.process_exception')47         return HttpResponse('m2.process_exception')48 49     def process_template_response(self, request, response):50         """51         视图函数的返回值中,如果有render方法,才被调用52         :param request:53         :param response:54         :return:55         """56         print('m2.process_template_response')57         return response

process_request 및 process_view 반환 없음
실행 순서:
m1.request

  1. m2.request

  2. m1. view

  3. m2.view

  4. m2.response

  5. m1.response

  6. 2. 버전 1.10 이상

  7. process_request가 HttpResponse 개체를 반환하면 현재 미들웨어의 process_response가 앞으로 반환됩니다.

 1 from django.shortcuts import HttpResponse 2 from django.utils.deprecation import MiddlewareMixin 3 class M1(MiddlewareMixin): 4     def process_request(self, request): 5         print('m1.request') 6         return HttpResponse('request_m1') 7  8     def process_view(self, request, callback, callback_args, callback_kwargs): 9         print('m1.view')10         # response = callback(request, *callback_args, **callback_kwargs)11         # return response12 13     def process_response(self, request, response):14         print('m1.response')15         return response16 17     def process_exception(self, request, exception):18         print('m1.process_exception')19         return HttpResponse('m1.process_exception')20 21     def process_template_response(self, request, response):22         """23         视图函数的返回值中,如果有render方法,才被调用24         :param request:25         :param response:26         :return:27         """28         print('m1.process_template_response')29         return response30 31 32 class M2(MiddlewareMixin):33     def process_request(self, request):34         print('m2.request')35 36     def process_view(self, request, callback, callback_args, callback_kwargs):37         print('m2.view')38         # response = callback(request, *callback_args, **callback_kwargs)39         # return response40 41     def process_response(self, request, response):42         print('m2.response')43         return response44 45     def process_exception(self, request, exception):46         print('m2.process_exception')47         return HttpResponse('m2.process_exception')48 49     def process_template_response(self, request, response):50         """51         视图函数的返回值中,如果有render方法,才被调用52         :param request:53         :param response:54         :return:55         """56         print('m2.process_template_response')57         return response58 59 60 # class RequestExeute(object):61 #     def process_request(self, request):62 #         print('process_request')63 #64 #     def process_view(self, request, callback, callback_args, callback_kwargs):65 #         print('process_view')66 #67 #     def process_exception(self, request, exception):68 #         """69 #         当views函数出错时执行70 #         :param request:71 #         :param exception:72 #         :return:73 #         """74 #         print('process_exception')75 #76 #     def process_response(self, request, response):77 #         """78 #         必须return HttpResponse79 #         :param request:80 #         :param response:81 #         :return:82 #         """83 #         print('process_response')84 #         return response85 #86 #     def process_template_response(self, request, response):87 #         """88 #         视图函数的返回值中,如果有render方法,才被调用89 #         :param request:90 #         :param response:91 #         :return:92 #         """93 #         print('process_template_response')94 #         return response
M1의 process_request는 HttpResponse
실행 순서:
m1.request

  1. m1.response

  2. process_view는 process_request와 유사합니다.

  3.  1 from django.shortcuts import HttpResponse 2 
     from django.utils.deprecation import MiddlewareMixin 3 class M1(MiddlewareMixin): 4     
     def process_request(self, request): 5         
     print('m1.request') 6         
     # return HttpResponse('request_m1') 7  8     
     def process_view(self, request, callback, callback_args, callback_kwargs): 9         
     print('m1.view')10         response = callback(request, *callback_args, **callback_kwargs)11         
     return response12 13     def process_response(self, request, response):14         print('m1.response')15         
     return response16 17     def process_exception(self, request, exception):18         
     print('m1.process_exception')19         
     return HttpResponse('m1.process_exception')20 21     def process_template_response(self, request, response):22         """23         视图函数的返回值中,如果有render方法,才被调用24         :param request:25         :param response:26         :return:27         """28         print('m1.process_template_response')29         return response30 31 32 class M2(MiddlewareMixin):33     def process_request(self, request):34         print('m2.request')35 36     def process_view(self, request, callback, callback_args, callback_kwargs):37         print('m2.view')38         # response = callback(request, *callback_args, **callback_kwargs)39         # return response40 41     def process_response(self, request, response):42         print('m2.response')43         return response44 45     def process_exception(self, request, exception):46         print('m2.process_exception')47         return HttpResponse('m2.process_exception')48 49     def process_template_response(self, request, response):50         """51         视图函数的返回值中,如果有render方法,才被调用52         :param request:53         :param response:54         :return:55         """56         print('m2.process_template_response')57         return response

m1 process_view가 HttpResponse

를 반환합니다. 실행 순서:
m1.request
m2.request
m1.view
m2.response
m1.respons

3. 1.10 버전 이전
  1. process_request가 HttpResponse 객체를 반환하는 경우 현재 미들웨어 이후의 process_request는 실행되지 않으며, 마지막 미들웨어의 process_request도 실행되지 않습니다. 앞으로

위 내용은 Django 미들웨어에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.