django-中间件
2018-01-29 20:13
225 查看
创建中间件
执行流程
补充
process_request,process_respons
process_view
process_view参数callback
process_exception
在项目的根目录下创建如下文件夹,py文件
auth.py
views视图函数如下:
浏览器输出如下:
浏览器输入 http://127.0.0.1:8000/index/
浏览器输出如下:
在登陆login页面http://127.0.0.1:8000/login/
点击提交看执行流行如下:
登陆后输入url http://127.0.0.1:8000/index/
执行流程如下:
结果如下:
当最后一个中间的process_request到达路由关系映射之后,返回到中间件1的process_view,然后依次往下,到达views函数,最后通过process_response依次返回到达用户。
注意:process_view如果有返回值,会越过其他的process_view以及视图函数,但是所有的process_response都还会执行
输出如下:
输出如下:
将md2的process_exception修改如下
输出如下:
执行流程
补充
process_request,process_respons
process_view
process_view参数callback
process_exception
创建中间件
在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', 'middleware.auth.AuthMiddleware', 'middleware.auth.AuthMiddleware1', ]
在项目的根目录下创建如下文件夹,py文件
auth.py
from django.utils.deprecation import MiddlewareMixin from django.shortcuts import HttpResponse, redirect class AuthMiddleware(MiddlewareMixin): def process_request(self, request): # 如果么有返回值;返回None,表示可以继续往下执行 # 如果有返回值,执行自己的response以及以上的response。 print("AuthMiddleware request") if request.path_info == '/login/': print("登陆页面") return None print("非登陆页面") user_info = request.session.get('user_info') if not user_info: print("未登陆~~") return redirect('/login/') print("已登陆~~") def process_response(self, request, response): print("AuthMiddleware response") return response class AuthMiddleware1(MiddlewareMixin): def process_request(self, request): print("AuthMiddleware1 request") def process_response(self, request, response): print("AuthMiddleware1 response") return response
views视图函数如下:
from django.shortcuts import render, redirect, HttpResponse def login(request): if request.method == "GET": print("login get 函数") return render(request, "login.html") else: print("login post 函数") request.session["user"] = {"id": 1, "name": "safly"} return redirect("/index") def index(request): print("index函数") return HttpResponse("首页~~")
执行流程
浏览器输入 http://127.0.0.1:8000/login/浏览器输出如下:
AuthMiddleware request 登陆页面 AuthMiddleware1 request login get 函数 AuthMiddleware1 response AuthMiddleware response
浏览器输入 http://127.0.0.1:8000/index/
浏览器输出如下:
AuthMiddleware request 未登陆~~ AuthMiddleware response AuthMiddleware request 登陆页面 AuthMiddleware1 request login get 函数 AuthMiddleware1 response AuthMiddleware response
在登陆login页面http://127.0.0.1:8000/login/
点击提交看执行流行如下:
AuthMiddleware request 登陆页面 AuthMiddleware1 request login post 函数 AuthMiddleware1 response AuthMiddleware response AuthMiddleware request 已登陆~~ AuthMiddleware1 request index函数 AuthMiddleware1 response AuthMiddleware response
登陆后输入url http://127.0.0.1:8000/index/
执行流程如下:
AuthMiddleware request 已登陆~~ AuthMiddleware1 request index函数 AuthMiddleware1 response AuthMiddleware response
补充
process_request,process_respons
def index(request): print("view函数...") return HttpResponse("OK")
from django.utils.deprecation import MiddlewareMixin from django.shortcuts import HttpResponse class Md1(MiddlewareMixin): def process_request(self,request): print("Md1请求") def process_response(self,request,response): print("Md1返回") return response class Md2(MiddlewareMixin): def process_request(self,request): print("Md2请求") #return HttpResponse("Md2中断") def process_response(self,request,response): print("Md2返回") return response
结果: Md1请求 Md2请求 view函数... Md2返回 Md1返回 注意:如果当请求到达请求2的时候直接不符合条件返回,即return HttpResponse("Md2中断"),程序将把请求直接发给中间件2返回,然后依次返回到请求者,结果如下: 返回Md2中断的页面,后台打印如下: Md1请求 Md2请求 Md2返回 Md1返回
process_view
继续看示例from django.utils.deprecation import MiddlewareMixin from django.shortcuts import HttpResponse class Md1(MiddlewareMixin): def process_request(self,request): print("Md1请求") #return HttpResponse("Md1中断") def process_response(self,request,response): print("Md1返回") return response def process_view(self, request, callback, callback_args, callback_kwargs): print("Md1view") class Md2(MiddlewareMixin): def process_request(self,request): print("Md2请求") return HttpResponse("Md2中断") def process_response(self,request,response): print("Md2返回") return response def process_view(self, request, callback, callback_args, callback_kwargs): print("Md2view")
结果如下:
Md1请求 Md2请求 Md2返回 Md1返回
当最后一个中间的process_request到达路由关系映射之后,返回到中间件1的process_view,然后依次往下,到达views函数,最后通过process_response依次返回到达用户。
注意:process_view如果有返回值,会越过其他的process_view以及视图函数,但是所有的process_response都还会执行
class Md1(MiddlewareMixin): def process_request(self,request): print("Md1请求") #return HttpResponse("Md1中断") def process_response(self,request,response): print("Md1返回") return response def process_view(self, request, callback, callback_args, callback_kwargs): print("Md1view") class Md2(MiddlewareMixin): def process_request(self,request): print("Md2请求") # return HttpResponse("Md2中断") def process_response(self,request,response): print("Md2返回") return response def process_view(self, request, callback, callback_args, callback_kwargs): print("Md2view")
Md1请求 Md2请求 Md1view Md2view ~~~views~~~ Md2返回 Md1返回
process_view参数callback
class Md1(MiddlewareMixin): def process_request(self,request): print("Md1请求") #return HttpResponse("Md1中断") def process_response(self,request,response): print("Md1返回") return response def process_view(self, request, callback, callback_args, callback_kwargs): print("Md1view") response = callback(request, *callback_args, **callback_kwargs) return response class Md2(MiddlewareMixin): def process_request(self,request): print("Md2请求") def process_response(self,request,response): print("Md2返回") return response def process_view(self, request, callback, callback_args, callback_kwargs): print("Md2view")
输出如下:
Md1请求 Md2请求 Md1view view函数... Md2返回 Md1返回
process_exception
class Md1(MiddlewareMixin): def process_request(self,request): print("Md1请求") #return HttpResponse("Md1中断") def process_response(self,request,response): print("Md1返回") return response def process_view(self, request, callback, callback_args, callback_kwargs): print("md1 process_view...") def process_exception(self,request,exception): print("md1 process_exception...") class Md2(MiddlewareMixin): def process_request(self,request): print("Md2请求") def process_response(self,request,response): print("Md2返回") return response def process_view(self, request, callback, callback_args, callback_kwargs): print("md2 process_view...") def process_exception(self,request,exception): print("md2 process_exception...")
输出如下:
Md1请求 Md2请求 md1 process_view... md2 process_view... view函数... Md2返回 Md1返回
将md2的process_exception修改如下
def process_exception(self,request,exception): print("md2 process_exception...") return HttpResponse("error")
输出如下:
[02/Mar/2018 21:33:50] "GET /middle/ HTTP/1.1" 200 5 Md1请求 Md2请求 md1 process_view... md2 process_view... ~~~views~~~ md2 process_exception... Md2返回 Md1返回
相关文章推荐
- Django 中间件
- Django(5) session登录注销、csrf及中间件自定义、django Form表单验证(非常好用)
- Django教程笔记之中间件middleware详解
- Django 限制用户访问频率的中间件的实现
- Django——中间件
- 深入学习Django源码基础13 - Django中的中间件(middleware)
- Django——中间件
- Django中间件处理流程学习笔记
- Django进阶之中间件
- Django 内建 中间件组件
- Django中间件工作流程及写法实例代码
- Django--中间件
- Django中间件学习笔记
- Python开发【Django】:中间件、CSRF
- django 自定义auth的中间件的验证
- Django 源码小剖: 初探中间件(middleware)
- django 如何编写控制登录和访问权限控制的中间件
- Django系列--尝试写个midlleware(中间件)
- Django----中间件详解
- django中间件