• Django中间件(含Django运行周期流程图)


    Django中的中间件(含Django完整生命周期图)

    Django中间件简介

    django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法

    在django项目的settings模块中,有一个 MIDDLEWARE_CLASSES 变量,其中每一个元素就是一个中间件

    复制代码
    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',
    ]
    复制代码

    Django请求的一个生命周期图1

    Django请求的一个生命周期图2

    可以看出当一个请求来时,会依次执行每一个中间件中的process_request函数,再通过路由找到对应的视图函数执行,求情完成后,会再一次经过每一个中间件的process_response函数,再返回给浏览器

    因此我们如果有一些操作是需要在执行每个views视图函数之前就要执行的可以添加中间件进行执行(如登录验证)

    中间件与装饰器的选择

    以后想要对所有的请求做统一操作时,用中间件

    只是对少量的视图函数做操作时,用装饰器

    中间件的写法

    首先在项目内任意创建一个目录,在目录下创建一个py文件,名字随意

    在该py文件中写中间件的类,这个类需要继承MiddlewareMixin(在1.7或1.8等老版本django中只需要继承object类即可)

    复制代码
    from django.utils.deprecation import MiddlewareMixin
    from django.shortcuts import HttpResponse,redirect
    
    class AuthMiddleware(MiddlewareMixin):
        def process_request(self,request):
            # 如果么有返回值;返回None,表示可以继续往下执行
            # 如果有返回值,执行自己的response以及以上的response。
    
            if request.path_info == '/login/':
                return None
    
            user_info = request.session.get('user_info')
            if not user_info:
                # return HttpResponse('请登录')
                return redirect('/login/')
    
    
        def process_response(self,request,response):
            return response
    复制代码

    在settings中配置

    复制代码
    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',
        'app01.middleware.auth.AuthMiddleware',  # 中间件的路径
    ]
    复制代码

    process_request和process_response的参数

    process_request参数

    self,request

    复制代码
        def process_request(self,request):
            # 如果么有返回值;返回None,表示可以继续往下执行
            # 如果有返回值,执行自己的response以及以上的response。
    
            if request.path_info == '/login/':
                return None
    
            user_info = request.session.get('user_info')
            if not user_info:
                # return HttpResponse('请登录')
                return redirect('/login/')
    复制代码

    process_response参数

    self,request,response

    def process_response(self,request,response):
            return response

    process_request和process_response的返回值

    process_request返回值

    当process_request函数没有返回值(默认为None)或者返回None时,请求会接着往后走,执行后面的中间件直到视图函数

    当process_request函数有返回值时,请求将不会再往后走,而是直接执行该中间件的process_response函数,并接着执行前面中间的process_response函数,直至返回给浏览器

     

    process_response返回值

    必须有返回值,否则会报错,返回response

  • 相关阅读:
    刷题19. Remove Nth Node From End of List
    刷题17. Letter Combinations of a Phone Number
    mysql图形化工具基本操作
    报错:ER_NO_DEFAULT_FOR_FIELD: Field 'status' doesn't have a default value
    express综合用法
    npm自定义上传
    node_第三方包下载文件package.jon详解
    正则表达式修改文字元素对齐方式
    初始化文章分类的方法 下拉的layui框
    标准git请求
  • 原文地址:https://www.cnblogs.com/QQ279366/p/8378203.html
Copyright © 2020-2023  润新知