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文件读写并使用mysql批量插入示例分享(python操作mysql)
Feb 17 Python
详解pyppeteer(python版puppeteer)基本使用
Jun 12 Python
利用python在大量数据文件下删除某一行的例子
Aug 21 Python
详细整理python 字符串(str)与列表(list)以及数组(array)之间的转换方法
Aug 30 Python
python绘制随机网络图形示例
Nov 21 Python
使用Python的datetime库处理时间(RPA流程)
Nov 24 Python
TensorFlow基本的常量、变量和运算操作详解
Feb 03 Python
基于Python的Jenkins的二次开发操作
May 12 Python
Pytho爬虫中Requests设置请求头Headers的方法
Sep 22 Python
10个python爬虫入门基础代码实例 + 1个简单的python爬虫完整实例
Dec 16 Python
python文件目录操作之os模块
May 08 Python
Python中np.random.randint()参数详解及用法实例
Sep 23 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
重料打造自己的“宝马”---第三代
2021/03/02 无线电
php 设计模式之 单例模式
2008/12/19 PHP
使用xampp搭建运行php虚拟主机的详细步骤
2015/10/21 PHP
php  单例模式详细介绍及实现源码
2016/11/05 PHP
JavaScript 面向对象编程(1) 基础
2010/05/18 Javascript
在jquery中处理带有命名空间的XML数据
2011/06/13 Javascript
JS 实现获取打开一个界面中输入的值
2013/03/19 Javascript
js实现正方形颜色从下往上升的效果
2014/08/04 Javascript
window.location 对象所包含的属性
2014/10/10 Javascript
js闭包实现按秒计数
2015/04/23 Javascript
jquery制作图片时钟特效
2020/03/30 Javascript
关于微信上网页图片点击全屏放大效果
2016/12/19 Javascript
Mui使用jquery并且使用点击跳转新窗口的实例
2017/08/19 jQuery
vue+socket.io+express+mongodb 实现简易多房间在线群聊示例
2017/10/21 Javascript
layui点击导航栏刷新tab页的示例代码
2018/08/14 Javascript
详解BootStrap表单验证中重置BootStrap-select验证提示不清除的坑
2019/09/17 Javascript
vue element upload组件 file-list的动态绑定实现
2019/10/11 Javascript
python实现定制交互式命令行的方法
2014/07/03 Python
Python中str is not callable问题详解及解决办法
2017/02/10 Python
python中datetime模块中strftime/strptime函数的使用
2018/07/03 Python
Python 获取div标签中的文字实例
2018/12/20 Python
Pythony运维入门之Socket网络编程详解
2019/04/15 Python
Python下opencv图像阈值处理的使用笔记
2019/08/04 Python
pandas中的ExcelWriter和ExcelFile的实现方法
2020/04/24 Python
Python列表如何更新值
2020/05/27 Python
用python实现前向分词最大匹配算法的示例代码
2020/08/06 Python
Camille Jewelry官网:现代女性时尚首饰
2019/07/07 全球购物
英国健身专家:WIT Fitness
2021/02/09 全球购物
Ajxa常见问题都有哪些
2014/03/26 面试题
汽车技术服务与营销专业推荐信
2013/11/29 职场文书
债务追讨律师函
2015/06/24 职场文书
2019年消防宣传标语集锦
2019/11/21 职场文书
SQL实战演练之网上商城数据库商品类别数据操作
2021/10/24 MySQL
yolov5返回坐标的方法实例
2022/03/17 Python
使用vue判断当前环境是安卓还是IOS
2022/04/12 Vue.js
使用Redis实现分布式锁的方法
2022/06/16 Redis