一.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之中间件相关推荐

  1. 浅谈Django的中间件与Python的装饰器

    浅谈Django的中间件 与Python的装饰器 一.原理 1.装饰器是Python的一种语法应用,利用闭包的原理去更改一个函数的功能,即让一个函数执行之前先到另外一个函数中执行其他需求语句,在执行该 ...

  2. Django的中间件

    Django的中间件 目录 中间件介绍 什么是中间件? 自定义中间件 自定义一个中间件示例 process_request process_response process_view process_ ...

  3. Django 组件- 中间件

    11.1 中间件 一.中间件的概念 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨 ...

  4. Django之中间件,csrf跨站伪造请求,auth认证模块

    Django请求生命周期 django的中间件 django的中间件相当于保安,请求的时候要经过django的中间件才能连接django的后端 能用来干什么:能够做网站的全局身份认证,访问频率,权限认 ...

  5. 07 Django组件-中间件

    中间件 方式一:函数式:中间件[middleware],也叫钩子方法[钩子函数],hook Django中的中间件是一个轻量级.底层的插件系统,可以介入Django的请求和响应处理过程,修改Djang ...

  6. 13 Django之中间件

    一.什么是中间件 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨慎实用,用不好会影 ...

  7. python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页)...

    python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页) 一.ajax登录示例 新建项目login_ajax 修改urls.py,增加路径 fro ...

  8. django框架--中间件系统

    目录 零.参考 一.中间件的基本理解 二.中间件的系统定位 三.中间件的配置 四.中间件的执行流程 五.中间件与装饰器之间的思考 六.中间件的应用场景 七.内置中间件 八.总结 零.参考 https: ...

  9. Django之中间件-CSRF

    CSRF a.CSRF原理 post提交时需要提交csrf_token ,缺少则不通过 在form表单中加入: {% csrf_token %} b.无CSRF时存在隐患 防护其他人通过别的链接pos ...

最新文章

  1. 如何在SharePoint2010中添加Deep Zoom Image
  2. 让陌生人迅速相爱的36个问题
  3. arkit技术介绍_面向移动AR的触觉技术:如何以“触摸”感增强ARKit应用
  4. linux内核源码目录分析
  5. Macos 12 打不开微信解决方案
  6. 设计类时需要注意的6个地方
  7. vb 饼状图显示百分比_Matplotlib-饼图
  8. php td背景颜色改变,JavaScript实现点击单元格改变背景色的方法
  9. modbus功能码04实例_MODBUS功能码简介
  10. 安全管理:为软件供应链部署零信任方法
  11. linux命令之grep(详解)
  12. Windows xp Ms08067漏洞复现
  13. 中南财经政法大学2014-2015学年学生奖励汇总表
  14. c语言long和short,long和short是什么意思?
  15. tersorrt安装_pytorch/mxnet模型tensorrt部署
  16. NC高级UI工厂笔记
  17. bzoj4372. 烁烁的游戏【动态点分治】
  18. 根据日期计算属于第几周(周日是一周的第一天)
  19. 人工神经网络研究的目的,人工神经网络训练过程
  20. JavaScript 堆内存溢出

热门文章

  1. matlab去除周期噪声,matlab在空域与频域中去除周期噪声、椒盐噪声的简单应用
  2. python是什么语言、即变量不需要显示声明数据类型-python变量声明及简单数据类型...
  3. python入门编程软件免费-Python编程干货免费领取!!!
  4. 在python中、下列代码的输出是什么-python面试题
  5. python处理3000个excel-Python处理Excel数据的坑,一文让你不用重复犯错
  6. python怎么用excel-用Python控制Excel实现自动化办公,手把手教你
  7. python turtle库画图案-Python:turtle库的使用及图形绘制
  8. 在哪里学python好-自学python好还是去培训机构好?
  9. python培训班时间 费用-广州python培训班收费标准
  10. python读取文件-python读取大文件