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

Django中间件(含Django运行周期流程图)的更多相关文章

  1. Django 2.0 学习(20):Django 中间件详解

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

  2. Django 中间件简介

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

  3. django中间件和auth模块

    Django中间件 由django的生命周期图我们可以看出,django的中间件就类似于django的保安,请求一个相应时要先通过中间件才能到达django后端(url.views.template. ...

  4. django——中间件

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

  5. 11.Django|中间件

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

  6. Django组件(三) Django之中间件

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

  7. Django中间件解析

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

  8. Web框架之Django_09 重要组件(Django中间件、csrf跨站请求伪造)

    摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于 ...

  9. Web框架之Django重要组件(Django中间件、csrf跨站请求伪造)

    Web框架之Django_09 重要组件(Django中间件.csrf跨站请求伪造)   摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是 ...

随机推荐

  1. gm: error while loading shared libraries: libpng15.so.15: cannot open shared object file: No such file or directory

    安装gm库产生问题 解决方案: # cat /etc/ld.so.confinclude ld.so.conf.d/*.conf# echo "/usr/local/lib" &g ...

  2. php-fpm nginx 使用 curl 请求 https 出现 502 错误

    用php curl请求https的url出现502错误,请求帮忙解决. PHP版本:5.6.7Nginx版本:1.8.0 代码如下: $ch = curl_init(); curl_setopt($c ...

  3. Oracle的REGEXP_INSTR函数简单使用方法

    REGEXP_INSTR函数让你搜索一个正則表達式模式字符串. 函数使用输入字符集定义的字符进行字符串的计算. 它返回一个整数,指示開始或结束匹配的子位置.这取决于return_option參数的值. ...

  4. button按钮可点和不可点:

    button按钮可点和不可点: document.getElementById("check").disabled=true; document.getElementById(&q ...

  5. sql把varchar转化为int型

    select Max(convert(int,id))from member_Info;

  6. 技巧JS

    1.     document.referrer可以获得上一页的地址,使用document.anchors获得页面上面所有的链接元素,而不必使用document.getElementsByTagNam ...

  7. ACM 博弈(难)题练习 (第二弹)

    第一弹: Moscow Pre-Finals Workshop 2016 - Kent Nikaido Contest 1 Problem K. Pyramid Game http://opentra ...

  8. datagrid带查询带分页

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat=&qu ...

  9. Unity3D入门其实很简单

    在上次发布拙作后,有不少童鞋询问本人如何学习Unity3D.本人自知作为一名刚入门的菜鸟,实在没有资格谈论这么高大上的话题,生怕误导了各位.不过思来想去,决定还是写一些自己的经验,如果能给想要入门U3 ...

  10. CSS:层叠样式表的冲突处理

    前言 重叠样式表的冲突是通过重叠过程排序,最终确定文档的显示方式的,也就是是说通过重叠排序来处理冲突问题.这过程起决定性作用的是选择器及其相关申明的特殊性,以及继承机制. 基本流程 1.找出所有相关规 ...