Django之中间件
一.CBV加装饰器
第一种 @method_decorator(装饰器) 加在get上第二种 @method_decorator(login_auth,name='get') 加在类上第三种 @method_decorator(login_auth) 加在dispatch上 3.7版本要return super().dispatch
from django.utils.decorators import method_decorator@method_decorator(login_auth,name='get') #第二种 name参数必须指定 class MyHome(View):@method_decorator(login_auth) #第三种 get和post都会被装饰def dispatch(self,request,*args,**kwargs):super().dispatch(request,*args,**kwargs)@method_decorator(login_auth) #第一种def get(self,request):return HttpResponse('get')def post(self,request):return HttpResponse('post')
二.中间件:
1. 首先,什么是中间件?
django请求生命周期完整版,中间件类似于django的门卫,数据在进入和离开时都需要经过中间件
2. 中间件能干嘛?
控制用户访问频率,全局登陆校验,用户访问白名单,黑名单等
3. Django默认有七个中间件,但是django暴露给用户可以自定义中间件并且里面可以写五种方法
中间件可以定义五个方法,分别是:(主要的是process_request和process_response) 有response需要加上return process_request(self,request) process_view(self, request, view_func, view_args, view_kwargs) process_template_response(self,request,response) process_exception(self, request, exception) process_response(self, request, response)
首先查看settings.py中的七个中间件,然后仿照继承中间件的一个类,从而自定义两个中间件,新创建一个文件夹和文件:
from django.utils.deprecation import MiddlewareMixinclass MyMiddleWare(MiddlewareMixin):def process_request(self,request):print('我是第一个自定义的中间件中process_request方法')def process_response(self,request,response):print('我是第一个自定义的中间件中process_response方法')return response class MyMiddleWare1(MiddlewareMixin):def process_request(self,request):print('我是第二个自定义的中间件中process_request方法')def process_response(self,request,response):print('我是第二个自定义的中间件中process_response方法')return response
然后把路径添加在中间件目录的后面:
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','mymiddleware.middleware.MyMiddleWare','mymiddleware.middleware.MyMiddleWare1' ]
视图函数:
def index(request):print('我是视图函数')return HttpResponse('我是视图函数')
执行顺序:
我是第一个自定义的中间件中process_request方法 我是第二个自定义的中间件中process_request方法 我是视图函数 我是第二个自定义的中间件中process_response方法 我是第一个自定义的中间件中process_response方法
如果process_request返回值是None,程序会继续执行,如果是一个HttpResponse对象(三剑客),程序会在同级掉头,
不会走下一个中间件,更不会走视图函数:
class MyMiddleWare(MiddlewareMixin):def process_request(self,request):print('我是第一个自定义的中间件中process_request方法')return HttpResponse('我是第一个中间件里面返回的对象')
# return render(request, 'index.html') 同理
执行到这个中间件就回头了:
我是第一个自定义的中间件中process_request方法 我是第一个自定义的中间件中process_response方法
process_view方法:路由匹配成功执行视图函数之前会走这个方法
def process_view(self, request, view_func, view_args, view_kwargs):print('我是第一个自定义的中间件中process_view方法')print(view_func.__name__)
执行顺序:
我是第一个自定义的中间件中process_request方法 我是第二个自定义的中间件中process_request方法 我是第一个自定义的中间件中process_view方法 index 我是第二个自定义的中间件中process_view方法 index 我是视图函数 我是第二个自定义的中间件中process_response方法 我是第一个自定义的中间件中process_response方法
process_exception方法:异常捕获,顺序从下往上
def process_exception(self, request, exception):print("我是第一个自定义的中间件中process_exception方法",exception)
process_template_response方法:顺序也是从下往上
def process_template_response(self, request, response): print('我是第一个自定义的中间件中process_template_response方法') return response
看效果要用这个视图函数:
def index(request):print("app01 中的 index视图")def render():print("in index/render")return HttpResponse("O98K")rep = HttpResponse("OK")rep.render = renderreturn rep
流程图:
如果MIDDLEWARE中注册了6个中间件,执行过程中,第3个中间件返回了一个HttpResponse对象,那么第4,5,6中间件的process_request和process_response方法都不执行,顺序执行3,2,1中间件的process_response方法。
假如中间件3 的process_view方法返回了HttpResponse对象,则4,5,6的process_view以及视图函数都不执行,直接从最后一个中间件,也就是中间件6的process_response方法开始倒序执行。
process_template_response和process_exception两个方法的触发是有条件的,执行顺序也是倒序。总结所有的执行流程如下:
中间件版登陆验证:
urls.pyfrom app02 import views as v2 urlpatterns = [url(r'^admin/', admin.site.urls),url(r'^login/',v2.login),url(r'^home/',v2.home),url(r'^index/',v2.index) ] ---------------------------------------------------------------------------- views.pyfrom django.shortcuts import render,redirect,HttpResponse from app02 import models # Create your views here. def login(request):error_msg=''if request.method=='POST':username=request.POST.get('username')password=request.POST.get('password')user_obj=models.User.objects.filter(username=username,password=password)if user_obj:#设置sessionrequest.session['login']='ok'#获取用户想直接访问的URLurl=request.GET.get('next')#如果有,就跳转到客户初始想访问的URLif not url:#没有则默认跳转到home页面url='/home/'return redirect(url)else:error_msg='username or password error!'return render(request,'login.html',{'error_msg':error_msg})def home(request):return HttpResponse('<h1>这是home页面 只有登录了才能看到</h1>')def index(request):return HttpResponse('<h1>这是index页面 也只有登录了才能看到<h1>') ---------------------------------------------------------------------------- login.html<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>登陆页面</title><meta name="viewport" content="width=device-width, initial-scale=1"> </head> <body> <form action="" method="post">{% csrf_token %}<label for="">username:<input type="text" name="username"></label><label for="">password:<input type="password" name="password"></label><input type="submit" value="submit"> </form> <h1 style="color: red">{{ error_msg }}</h1></body> </html>---------------------------------------------------------------------------- middlewares.pyfrom django.utils.deprecation import MiddlewareMixin from django.shortcuts import redirectclass Check_Login(MiddlewareMixin):def process_request(self,request):next_url=request.path_infoif not next_url.startswith('/login/'):is_login=request.session.get('login','')if not is_login:return redirect('/login/?next={}'.format(next_url))---------------------------------------------------------------------------- 在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.my_middleware.Check_Login',]
Django请求流程图:
转载于:https://www.cnblogs.com/sima-3/p/11060025.html
Django之中间件相关推荐
- 浅谈Django的中间件与Python的装饰器
浅谈Django的中间件 与Python的装饰器 一.原理 1.装饰器是Python的一种语法应用,利用闭包的原理去更改一个函数的功能,即让一个函数执行之前先到另外一个函数中执行其他需求语句,在执行该 ...
- Django的中间件
Django的中间件 目录 中间件介绍 什么是中间件? 自定义中间件 自定义一个中间件示例 process_request process_response process_view process_ ...
- Django 组件- 中间件
11.1 中间件 一.中间件的概念 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨 ...
- Django之中间件,csrf跨站伪造请求,auth认证模块
Django请求生命周期 django的中间件 django的中间件相当于保安,请求的时候要经过django的中间件才能连接django的后端 能用来干什么:能够做网站的全局身份认证,访问频率,权限认 ...
- 07 Django组件-中间件
中间件 方式一:函数式:中间件[middleware],也叫钩子方法[钩子函数],hook Django中的中间件是一个轻量级.底层的插件系统,可以介入Django的请求和响应处理过程,修改Djang ...
- 13 Django之中间件
一.什么是中间件 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨慎实用,用不好会影 ...
- python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页)...
python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页) 一.ajax登录示例 新建项目login_ajax 修改urls.py,增加路径 fro ...
- django框架--中间件系统
目录 零.参考 一.中间件的基本理解 二.中间件的系统定位 三.中间件的配置 四.中间件的执行流程 五.中间件与装饰器之间的思考 六.中间件的应用场景 七.内置中间件 八.总结 零.参考 https: ...
- Django之中间件-CSRF
CSRF a.CSRF原理 post提交时需要提交csrf_token ,缺少则不通过 在form表单中加入: {% csrf_token %} b.无CSRF时存在隐患 防护其他人通过别的链接pos ...
最新文章
- 如何在SharePoint2010中添加Deep Zoom Image
- 让陌生人迅速相爱的36个问题
- arkit技术介绍_面向移动AR的触觉技术:如何以“触摸”感增强ARKit应用
- linux内核源码目录分析
- Macos 12 打不开微信解决方案
- 设计类时需要注意的6个地方
- vb 饼状图显示百分比_Matplotlib-饼图
- php td背景颜色改变,JavaScript实现点击单元格改变背景色的方法
- modbus功能码04实例_MODBUS功能码简介
- 安全管理:为软件供应链部署零信任方法
- linux命令之grep(详解)
- Windows xp Ms08067漏洞复现
- 中南财经政法大学2014-2015学年学生奖励汇总表
- c语言long和short,long和short是什么意思?
- tersorrt安装_pytorch/mxnet模型tensorrt部署
- NC高级UI工厂笔记
- bzoj4372. 烁烁的游戏【动态点分治】
- 根据日期计算属于第几周(周日是一周的第一天)
- 人工神经网络研究的目的,人工神经网络训练过程
- JavaScript 堆内存溢出
热门文章
- matlab去除周期噪声,matlab在空域与频域中去除周期噪声、椒盐噪声的简单应用
- python是什么语言、即变量不需要显示声明数据类型-python变量声明及简单数据类型...
- python入门编程软件免费-Python编程干货免费领取!!!
- 在python中、下列代码的输出是什么-python面试题
- python处理3000个excel-Python处理Excel数据的坑,一文让你不用重复犯错
- python怎么用excel-用Python控制Excel实现自动化办公,手把手教你
- python turtle库画图案-Python:turtle库的使用及图形绘制
- 在哪里学python好-自学python好还是去培训机构好?
- python培训班时间 费用-广州python培训班收费标准
- python读取文件-python读取大文件