Django中间件基础用法详解


Posted in Python onJuly 18, 2019

前言

django的中间件可以在视图函数执行前执行,比如登陆验证、日志记录等,下面简单说明一下中间件的基础用法,主要为笔者学习时的笔记

1. 在django项目文件夹下创建一个用于存放中间件函数的文件夹

文件夹的名字可自定义,本文使用utils作为文件夹名

2. 在utils文件夹中创建中间件py文件

如用于登陆验证的中间件loginCheck.py

from django.http import HttpResponseRedirect
from django.utils.deprecation import MiddlewareMixin

class UserLoginCheck(MiddlewareMixin):
  '''
  登录验证中间件
  '''
  def process_request(self, request):
    # 用户request请求前
    path = ['/login/', '/logout/'] # 不需要进行登录检测的url
    if request.path in path:
      return

    userinfoSession = request.session.get('userinfo')
    if not userinfoSession:
      return HttpResponseRedirect('/login/')
    return

3. 配置使用中间件

在setting.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',
  'utils.loginCheck.UserLoginCheck', # 此处为自定义的中间件
]

扩展

中间件可定义的五种方法

Request预处理函数: process_request(self, request)

  • 这个方法的调用时机在Django接收到request之后,但仍未解析URL以确定应当运行的视图函数。Django向它传入相应的Request对象,以便在方法中修改。
  • 如果返回None,Django将继续处理这个request,执行后续的中间件, 然后调用相应的 view。
  • 如果返回HttpResponse对象,Django将不再执行任何除了process_response以外其它的中间件以及相应的view,Django将立即返回该HttpResponse。

View预处理函数: process_view(self, request, callback, callback_args,callback_kwargs)

  • 这个方法的调用时机在 Django 执行完 request 预处理函数并确定待执行的 view (即callback参数)之后,但在 view 函数实际执行之前。
  • request:HttpRequest 对象。
  • callback:Django将调用的处理request的python函数. 这是实际的函数对象本身, 而不是字符串表述的函数名。
  • args:将传入view的位置参数列表,但不包括request参数(它通常是传入view的第一个参数)。
  • kwargs:将传入view的关键字参数字典。
  • process_view() 应当返回None或 HttpResponse 对象。如果返回 None, Django将继续处理这个request ,执行后续的中间件, 然后调用相应的view。
  • 如果返回 HttpResponse 对象,Django 将不再执行任何其它的中间件(不论种类)以及相应的view,Django将立即返回。

Template模版渲染函数:process_template_response()

默认不执行,只有在视图函数的返回结果对象中有render方法才会执行,并把对象的render方法的返回值返回给用户(注意不返回视图函数的return的结果了,而是返回视图函数 return值(对象)中rende方法的结果)

Exception后处理函数:process_exception(self, request, exception)

  • 这个方法只有在 request 处理过程中出了问题并且view 函数抛出了一个未捕获的异常时才会被调用。这个钩子可以用来发送错误通知,将现场相关信息输出到日志文件,或者甚至尝试从错误中自动恢复。
  • 这个函数的参数除了一贯的request对象之外,还包括view函数抛出的实际的异常对象exception 。
  • process_exception() 应当返回None或HttpResponse对象。
  • 如果返回None,Django将用框架内置的异常处理机制继续处理相应request。
  • 如果返回HttpResponse对象,Django将使用该response对象,而短路框架内置的异常处理机制。

Response后处理函数:process_response(self, request, response)

  • 这个方法的调用时机在 Django 执行 view 函数并生成 response 之后。
  • 该处理器能修改response 的内容;一个常见的用途是内容压缩,如gzip所请求的HTML页面。
  • 这个方法的参数相当直观:request是request对象,而response则是从view中返回的response对象。
  • process_response() 必须返回 HttpResponse 对象. 这个 response 对象可以是传入函数的那一个原始对象(通常已被修改),也可以是全新生成的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python 解析XML python模块xml.dom解析xml实例代码
Feb 07 Python
在Python中操作时间之mktime()方法的使用教程
May 22 Python
使用python实现rsa算法代码
Feb 17 Python
python爬虫之urllib库常用方法用法总结大全
Nov 14 Python
Python爬虫实现的根据分类爬取豆瓣电影信息功能示例
Sep 15 Python
pytorch下使用LSTM神经网络写诗实例
Jan 14 Python
Python读取文件内容为字符串的方法(多种方法详解)
Mar 04 Python
tensorflow转换ckpt为savermodel模型的实现
May 25 Python
Python数据可视化常用4大绘图库原理详解
Oct 23 Python
Python接口自动化系列之unittest结合ddt的使用教程详解
Feb 23 Python
python基础之停用词过滤详解
Apr 21 Python
利用python做数据拟合详情
Nov 17 Python
Python编写通讯录通过数据库存储实现模糊查询功能
Jul 18 #Python
Django 实现图片上传和显示过程详解
Jul 18 #Python
Django框架模型简单介绍与使用分析
Jul 18 #Python
python使用pandas处理excel文件转为csv文件的方法示例
Jul 18 #Python
django 2.2和mysql使用的常见问题
Jul 18 #Python
详解Python二维数组与三维数组切片的方法
Jul 18 #Python
Django框架视图介绍与使用详解
Jul 18 #Python
You might like
用PHP编程语言开发动态WAP页面
2006/10/09 PHP
用Apache反向代理设置对外的WWW和文件服务器
2006/10/09 PHP
source.php查看源文件
2006/12/09 PHP
php导入csv文件碰到乱码问题的解决方法
2014/02/10 PHP
PHP生成自定义长度随机字符串的函数分享
2014/05/04 PHP
JQuery 初体验(建议学习jquery)
2009/04/25 Javascript
JQuery获取浏览器窗口内容部分高度的代码
2012/02/24 Javascript
js正文内容高亮效果的实现方法
2013/06/30 Javascript
js阻止冒泡及jquery阻止事件冒泡示例介绍
2013/11/19 Javascript
JQuery结合CSS操作打印样式的方法
2013/12/24 Javascript
浅析jQuery(function(){})与(function(){})(jQuery)之间的区别
2014/01/09 Javascript
JQuery实现展开关闭层的方法
2015/02/17 Javascript
javascript实现十秒钟后注册按钮可点击的方法
2015/05/13 Javascript
JavaScript获取数组最小值和最大值的方法
2015/06/09 Javascript
jQuery实现判断控件是否显示的方法
2017/01/11 Javascript
AngularJS中$injector、$rootScope和$scope的概念和关联关系深入分析
2017/01/19 Javascript
jquery.uploadifive插件怎么解决上传限制图片或文件大小问题
2017/05/08 jQuery
原生JavaScript实现精美的淘宝轮播图效果示例【附demo源码下载】
2017/05/27 Javascript
vue router-link传参以及参数的使用实例
2017/11/10 Javascript
微信小程序列表渲染功能之列表下拉刷新及上拉加载的实现方法分析
2017/11/27 Javascript
vue :src 文件路径错误问题的解决方法
2018/05/15 Javascript
详解如何使用koa实现socket.io官网的例子
2018/11/04 Javascript
VSCode使用之Vue工程配置eslint
2019/04/30 Javascript
浅谈python 里面的单下划线与双下划线的区别
2017/12/01 Python
python学习--使用QQ邮箱发送邮件代码实例
2019/04/16 Python
python实现切割url得到域名、协议、主机名等各个字段的例子
2019/07/25 Python
如何通过python实现全排列
2020/02/11 Python
css3和jquery实现的可折叠导航菜单适合放在手机网页的导航菜单
2014/09/02 HTML / CSS
母亲节演讲稿
2014/05/27 职场文书
员工团队活动方案
2014/08/28 职场文书
2015年物业管理工作总结
2015/04/23 职场文书
2016年学校招生广告语
2016/01/28 职场文书
初二英语教学反思
2016/02/15 职场文书
redis requires ruby version2.2.2的解决方案
2021/07/15 Redis
排查并解决Oracle sysaux表空间异常增长
2022/04/20 Oracle
Python 绘制多因子柱状图
2022/05/11 Python