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爬虫之抓取糗事百科代码分享
Nov 06 Python
用Python写冒泡排序代码
Apr 12 Python
mac下给python3安装requests库和scrapy库的实例
Jun 13 Python
利用python打开摄像头及颜色检测方法
Aug 03 Python
解决PyCharm的Python.exe已经停止工作的问题
Nov 29 Python
Python判断对象是否为文件对象(file object)的三种方法示例
Apr 26 Python
django框架使用orm实现批量更新数据的方法
Jun 21 Python
python Opencv计算图像相似度过程解析
Dec 03 Python
Python基本类型的连接组合和互相转换方式(13种)
Dec 16 Python
python GUI库图形界面开发之PyQt5结合Qt Designer创建信号与槽的详细方法与实例
Mar 08 Python
在keras 中获取张量 tensor 的维度大小实例
Jun 10 Python
Python中字符串对象语法分享
Feb 24 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的朋友 经常问的一些问题。不断更新
2011/08/11 PHP
PHP使Laravel为JSON REST API返回自定义错误的问题
2018/10/16 PHP
高性能WEB开发 flush让页面分块,逐步呈现 flush让页面分块,逐步呈现
2010/06/19 Javascript
jquery实现的一个导航滚动效果具体代码
2013/05/27 Javascript
jquery实现简单易懂的图片展示小例子
2013/11/21 Javascript
JavaScript声明变量时为什么要加var关键字
2014/09/29 Javascript
JavaScript中setUTCMilliseconds()方法的使用详解
2015/06/12 Javascript
使用jQuery.form.js/springmvc框架实现文件上传功能
2016/05/12 Javascript
浅谈js中字符和数组一些基本算法题
2016/08/15 Javascript
bootstrap模态框远程示例代码分享
2017/05/22 Javascript
详解如何使用 vue-cli 开发多页应用
2017/12/16 Javascript
使用vue官方提供的模板vue-cli搭建一个helloWorld案例分析
2018/01/16 Javascript
vue组件中的样式属性scoped实例详解
2018/10/30 Javascript
webpack4 从零学习常用配置(小结)
2019/05/28 Javascript
vue实现用户长时间不操作自动退出登录功能的实现代码
2020/07/23 Javascript
python之文件读取一行一行的方法
2018/07/12 Python
Python类的继承、多态及获取对象信息操作详解
2019/02/28 Python
python3中关于excel追加写入格式被覆盖问题(实例代码)
2020/01/10 Python
wxPython修改文本框颜色过程解析
2020/02/14 Python
Python‘==‘ 及 ‘is‘相关原理解析
2020/09/05 Python
python实现简单的井字棋游戏(gui界面)
2021/01/22 Python
HTML5 History API 实现无刷新跳转
2016/01/11 HTML / CSS
俄罗斯有趣和原创礼物网上商店:MagicMag
2019/08/01 全球购物
英国老牌潮鞋店:Offspring
2019/08/19 全球购物
日本最大的购物网站乐天市场国际版:Rakuten Global Market(支持中文)
2020/02/03 全球购物
致200米运动员广播稿
2014/02/06 职场文书
国培远程培训感言
2014/03/08 职场文书
小学生感恩演讲稿
2014/04/25 职场文书
2014年党课学习心得体会
2014/07/08 职场文书
群众路线教育实践活动心得体会(四风)
2014/11/03 职场文书
计算机实训报告总结
2014/11/05 职场文书
小学教师工作总结2015
2015/04/07 职场文书
学校通报表扬范文
2015/05/04 职场文书
《作风建设永远在路上》心得体会
2016/01/21 职场文书
为了顺利买到演唱会的票用Python制作了自动抢票的脚本
2021/10/16 Python
CSS 一行代码实现头像与国旗的融合
2021/10/24 HTML / CSS