zoukankan      html  css  js  c++  java
  • django-中间件

    django默认有七个中间件,但是django暴露给用户可以自定义中间件并且里面可以写五种方法
     ps:
     
      1.请求来的时候会依次执行每一个中间件里面的process_request方法(如果没有直接通过)
      2.响应走的时候会依次执行每一个中间件里面的process_response方法(如果没有直接通过)
     
     django中间件能够帮我实现 网站全局的身份验证,黑名单,白名单,访问频率限制,反爬相关
      》》》:django用来帮你全局相关的功能校验
     
     自定义中间件
      新建一个任意名字的文件夹,里面新建一个任意名字py文件
      from django.utils.deprecation import MiddlewareMixin
     
     
     
     
     总结:
      需要你掌握的:
      process_request:请求来的时候从上往下依次执行每一个中间件里面的process_request
      process_response :响应走的时候会从下往上依次执行每一个中间件里面的process_response方法
           
      了解:
      process_view:路由匹配成功执行视图之前自动触发(从上往下依次执行)
      process_exception:当视图函数报错了,自动触发(从下往上依次执行)
      process_template_response:视图函数返回的对象有一个render()方法
           (或者表明该对象是一个TemplateResponse对象或等价方法)(从下往上依次执行)
      

    什么是中间件

    中间件是一hooks应用于Django的请求/响应处理框架。 它是一个轻,低级的“插件”系统,用于全局改变Django的输入或输出。

    原理

    官方文档供给出三种实现方法

    • 装饰器方法 基于方法
    • 装饰器方法 基于对象
    • 基于请求/响应中间件模式

    第三种是推荐而且比较常用的方法。我们可以把它想象成一个洋葱,每一层都是一个中间件类,这些中间件包裹着views(视图)。当一个请求(request)进入所有层,将request从第一个层依次传递下一个直到view执行,然后响应(response)通过每一层(注意:以相反的顺序)原路返回。

    • process_request 接收到request开始执行在process_view前
    • process_view 在process_request后执行在views前执行
    • process_response views后执行
    • process_exception views抛出异常
    • process_template_response 需使用render()方法才会执行process_template_response 在process_response前views后执行

    应用场景

    以下是官方的一些中间件,有auth,sesssion以及csrf等,对于我们自定义的中间件来说当然是根据自己项目的需求来做喽,核心在于知道在哪些环节使用那个方法就可以熟练的使用中间件。

    '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.py

    # -*- coding: utf-8 -*-
    
    #方法一:装饰器方法 基于方法
    def test1(get_response):
    
        def middleware(request):
            print ">>>>>>>>1"
            response = get_response(request)
            print ">>>>>>>>3"
            return response
    
        return middleware    
    
    #方法二:装饰器方法 基于对象
    class Test2(object):
        def __init__(self, get_response):
            self.get_response = get_response
    
        def __call__(self, request):
            print ">>>>>>>>>2"
            response = self.get_response(request)
            print ">>>>>>>>>3"
            return response
    
    #方法三 基于请求/响应中间件模式 这种方式需要在 setting中的MIDDLEWARE_CLASSES增加Test3 相当于激活中间件 常用模式上面两种很少用
    class Test3(object):
        
        def process_view(self, request, view_func, view_args, view_kwargs):
            print ">>>>>>>>in process_view"
    
        def process_request(self, request):
            print ">>>>>>>>in process_requset"
            return None
    
        def process_response(self, request, response):
            print ">>>>>>>>in process_response"
            return response
    
        def process_exception(self, request, exception):
            print ">>>>>>>>in process_exception"
    
        def process_template_response(self, request, response):
            print ">>>>>>>>in process_template_response"
            return response
            
    views/py
    @test1
    def hello1(request):
        print ">>>>>>>view"
        c = RequestContext(request, { })
        return render_to_response('hello/hello.html', c)
    
    @Test2
    def hello2(request):
        print ">>>>>>>view"
        c = RequestContext(request, { })
        return render_to_response('hello/hello.html', c)
    
    def hello3(request):
        print ">>>>>>>view"
        c = RequestContext(request, { })
        return render_to_response('hello/hello.html', c)
  • 相关阅读:
    struts_login实例
    myEclipse 7.0快捷键
    Visual C# 2008+SQL Server 2005 数据库与网络开发 8.1 数据绑定
    Visual C# 2008+SQL Server 2005 数据库与网络开发 7.2 ADO .NET与各种数据库的连接
    Visual C# 2008+SQL Server 2005 数据库与网络开发8.1.2 创建DataSet
    Visual C# 2008+SQL Server 2005 数据库与网络开发8.2.1 使用连接字符串
    Visual C# 2008+SQL Server 2005 数据库与网络开发第8章 使用数据绑定和DataSet
    Visual C# 2008+SQL Server 2005 数据库与网络开发 7.4 小结
    Visual C# 2008+SQL Server 2005 数据库与网络开发8.2.2 用户数据操作的并发
    Visual C# 2008+SQL Server 2005 数据库与网络开发 7.3 使用ADO .NET处理数据
  • 原文地址:https://www.cnblogs.com/fan-1994716/p/11875966.html
Copyright © 2011-2022 走看看