快速上手Django(五) -Django之中间件MIDDLEWARE(SessionMiddleware)-程序员宅基地

技术标签: python  django  中间件  # 快速上手Django  Python  

快速上手Django(五) -Django之中间件MIDDLEWARE(SessionMiddleware)

一、什么是Django中间件MIDDLEWARE

Django官方文档中对于Middleware的介绍:
中间件(Middleware)是一个镶嵌到django的request/response处理机制中的一个钩子(hooks) 框架。它是一个可以修改django全局输入或输出的一个底层插件系统。

如果你想修改请求,例如被传送到view中的HttpRequest对象。 或者你想修改view返回的HttpResponse对象,这些都可以通过中间件来实现。

中间件(Middleware)在整个Django的request/response处理机制中的角色如下所示:
HttpRequest -> Middleware -> View -> Middleware -> HttpResponse

总结:中间件允许您在一个浏览器的请求在到达Django视图之前处理它,以及在视图返回的响应到达浏览器之前处理这个响应。

二、中间件的应用场景

我们可以编写自己的中间件实现权限校验,限制用户请求、打印日志、改变输出内容等多种应用场景,比如:

  • 禁止特定IP地址的用户或未登录的用户访问我们的View视图函数
    (1)如果用户访问的是login视图(放过)
    (2)如果访问其他视图,需要检测是不是有session认证,已经有了放行,没有返回login,这样就省得在多个视图函数上写装饰器了!
    一个request到达视图函数前,中间件先对request.user是否验证通过进行判断,然后再进行跳转。
  • 在View视图函数执行前记录用户的IP地址
  • 某些IP访问服务器的频率过高,进行拦截,比如限制每分钟不能超过n次。
  • 在View视图函数执行前传递额外的变量或参数
  • 在View视图函数执行前或执行后把特定信息打印到log日志
  • 在View视图函数执行后对reponse数据进行修改后返回给用户
  • Django对POST表单中携带的CSRF token的全局校验也是通过CsrfViewMiddleware这个中间件进行的

三、Django默认的中间件

当你创建一个新django项目时,你会发现settings.py里已经注册了一些Django自带的中间件,每个中间件都负责一个特定的功能。

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',
]
  • SecurityMiddleware:为request/response提供了几种安全改进
  • SessionMiddleware:开启session会话支持,无它无session。要应用session,必须开启session中间层
    默认情况下,session数据是存储到数据库中的。我们如何得知呢?可以从Django的默认配置中查看到,Django的默认配置路径是from django.conf import global_settings,我们可以打开然后查看到默认配置。
  • CommonMiddleware:基于APPEND_SLASH和PREPEND_WWW的设置来重写URL,如果APPEND_SLASH设为True,并且初始URL 没有以斜线结尾以及在URLconf 中没找到对应定义,这时形成一个斜线结尾的新URL;如果PREPEND_WWW设为True,前面缺少 www.的url将会被重定向到相同但是以一个www.开头的url。
  • CsrfViewMiddleware:添加跨站点请求伪造的保护,通过向POST表单添加一个隐藏的表单字段,并检查请求中是否有正确的值,无它无csrf保护
  • AuthenticationMiddleware:在视图函数执行前向每个接收到的user对象添加HttpRequest属性,表示当前登录的用户,无它用不了request.user
  • MessageMiddleware:开启基于Cookie和会话的消息支持,无它无message
  • XFrameOptionsMiddleware:对点击劫持的保护

注意:从Django 1.10起, settings.py里注册中间件使用MIDDLEWARE=,而不是MIDDLEWARE_CLASSES= 。

class MyMiddleware(MiddlewareMixin): 和 class SimpleMiddleware(object): 区别

在 Django 中,这两种中间件类有以下区别:
class MyMiddleware(MiddlewareMixin):

  • 这种中间件类继承自 MiddlewareMixin ,需要实现 process_request , process_response ,process_view , process_exception 四个方法中的一个或多个。
  • MiddlewareMixin 类已经实现了 initcall 方法,所以我们只需要重写需要的方法即可。
  • 这是 Django 推荐的中间件写法。
    例如:
    python
    from django.utils.deprecation import MiddlewareMixin

class MyMiddleware(MiddlewareMixin):
def process_request(self, request):
print(‘Process request’)
class SimpleMiddleware(object):

  • 这种中间件类继承自 object ,需要实现 init , call , process_request , process_response ,process_view , process_exception 这六个方法。
  • 我们需要自己实现 initcall 方法来调用 process_request 等方法。
  • 这种写法较老,Django 现推荐使用 MiddlewareMixin 。

例如:

class SimpleMiddleware(object):
    def 
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/inthat/article/details/126934319

智能推荐

后端服务的雪崩效应及解决思路_接口超时时间过长导致雪崩效应-程序员宅基地

文章浏览阅读204次。1.RPC与本地调用的区别RPC远程调用,一般是跨平台、采用http协议,因为http协议底层使用socket技术,只要你的语言支持socket技术,就可以相互进行通讯。比如:java语言开发的接口,使用http协议,如此以来C#语言可以调用。本地调用:只支持java语言与java语言开发,使用虚拟机和虚拟机之间的通讯,RMI。2.雪崩效应产生的原因默认情况下只有一个线程池维护所有的服务接口,如果大量的请求访问同一个接口,达到tomcat线程池默认极限,可能会导致其他服务无法访问。3.雪_接口超时时间过长导致雪崩效应

linux操作redis_linux 连接redis-程序员宅基地

文章浏览阅读2.7w次,点赞4次,收藏35次。redis常用命令_linux 连接redis

小米手环NFC模拟加密门禁卡_小米nfc加密卡模拟不了-程序员宅基地

文章浏览阅读3.9k次。2、打开另一台小米手机的小米运动,或者Zepp life,连接手环,打开手环里面的NFC,选择“非加密卡模拟”。3、然后使用小米手环靠近上述步骤1中的小米手机,模拟小米手机的门禁卡。小米手环NFC模拟加密门禁卡会提示“此卡为加密卡,无法模拟”。注意:步骤1中的手机,必须是小米、红米手机,其它安卓手机不行。1、首先找一台带nfc功能的小米手机,模拟加密门禁卡。此时步骤1的小米手机,相当于是未加密的门禁卡)_小米nfc加密卡模拟不了

Unity优化——LOD技术_lod技术原理-程序员宅基地

文章浏览阅读1.4w次,点赞9次,收藏30次。什么是LODLOD是Level Of Detais 的简称,多细节层次在游戏场景中,根据摄像机与模型的距离,来决定显示哪一个模型,一般距离近的时候显示高精度多细节模型,距离远的时候显示低精度低细节模型游戏中有高模低模的存在。说白的就是离得远看不清,离得近很清楚。根据摄像机与物体距离,unity会自动切换模型。使用LOD先准备几个模型,从高模到低模。没有模型。。。低配版..._lod技术原理

javax.imageio.IIOException: Not a JPEG file: starts with 0x47 0x49-程序员宅基地

文章浏览阅读7.8k次。java处理图片时出现异常javax.imageio.IIOException: Not a JPEG file: starts with 0x47 0x49at com.sun.imageio.plugins.jpeg.JPEGImageReader.readImageHeader(Native Method)at com.sun.imageio.plugins.jpeg.JPEGI_javax.imageio.iioexception: not a jpeg file: starts with 0x52 0x49

代发外链哪家好?-程序员宅基地

文章浏览阅读343次,点赞11次,收藏6次。与其授人以鱼不如授人以渔,在这里说说如何选择好的外链商,可以先找一下你要发的这家外链商的口碑,了解其专业水平,这倒是最基本的了,说到底这些东西说得难听点都是可以伪造的,所以最重要的,是要了解外链的作用。外链可以说是网站外部优化最重要的组成部分,一个网站的外链建设对于网站网站优化是至关重要的,选择到一家好的外链商可以说成功了一半,毕竟不是谁都有外链资源。外链最重要的作用毫无疑问,就是提升网站的关键词排名,不能提升排名的外链可以说没有意义,有人就会说了,但外链的作用不是日积月累的吗?

随便推点

关于 Eclipse 使用 Maven 打包,每次都需要下载 jar 包的问题_maven打包每次都要下载依赖-程序员宅基地

文章浏览阅读6.2k次。在是Eclipse开发的时候,使用Maven打包每次都需要联网下载jar包。第一次需要下载这个可以理解。但是每次都需要下载,就有点问题了...重点是,所用的网络不能访问Maven的私服,所以每次打包都断开网络。这样很麻烦,找资料发现勾选下图中的 Offline(离线) 就可以解决问题了。注意:当你需要下载其他的依赖时,就需要把这个勾去掉,不然连接不上仓库哦。..._maven打包每次都要下载依赖

pg_cancel_backend()和pg_terminate_backend()_pg_cancel_backend pg_ter-程序员宅基地

文章浏览阅读8k次,点赞2次,收藏6次。先看下两个函数的官方解释: pg_cancel_backend() 取消后台操作,回滚未提交事物pg_terminate_backend() 中断session,回滚未提交事物这里和oracle类似kill session的操作是pg_terminate_backend() pg_cancel_backend() 举例:session A:postgres=# create table tb..._pg_cancel_backend pg_ter

rabbitmq集群搭建和总结_selenium rabbitmq-程序员宅基地

文章浏览阅读724次。1_selenium rabbitmq

linux详解5,2024年最新阿里珍藏版Linux运维框架体系架构手写文档-程序员宅基地

文章浏览阅读410次,点赞14次,收藏16次。三、Python定制篇 apt软件管理和远程登录自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。深知大多数Linux运维工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!因此收集整理了一份《2024年Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

BERT系列算法解读:(RoBERTa/ALBERT/DistilBERT/Transformer/Hugging Face/NLP/预训练模型/模型蒸馏)_bert算法-程序员宅基地

文章浏览阅读758次,点赞2次,收藏6次。BERT系列算法解读(RoBERTa/ALBERT/DistilBERT/Transformer/Hugging Face/NLP/预训练模型)_bert算法

超文本标记语言_head表示超文本文件头信息的结束-程序员宅基地

文章浏览阅读6.2k次。超文本标记语言百科名片超文本标记语言,即HTML(Hypertext Markup Language),是用于描述网页文档的一种标记语言。 查看精彩图册目录基本介绍由来定义语言特点编辑发展历史超文本标记语言可扩展超文本标记语言整体结构文件头部内容文件主体内容字符集_head表示超文本文件头信息的结束