深入探索Django中间件的应用场景

 更新时间:2023年05月04日 10:50:53   作者:互联小助手  
Django中间件是一种可插拔的应用程序组件,可在请求和响应处理过程中修改Django的行为。中间件可用于处理请求、响应、异常等,还可用于实现身份验证、缓存、性能监控等常用功能。通过深入探索中间件的应用场景,可以提高Django应用程序的可扩展性和灵活性

中间件的应用

在之前的文章中,我们已经实现了用户必须登录才能投票的限制。然而,如果我们的应用中有很多功能都需要用户先登录才能执行,例如将前面导出Excel报表和查看统计图表的功能都做了必须登录才能访问的限制,那么我们是不是需要在每个视图函数中添加代码来检查session中是否包含userid的代码呢?答案是否定的,如果这样做了,我们的视图函数中必然会充斥着大量的重复代码。编程大师 Martin Fowler 曾经说过:代码有很多种坏味道,重复是最坏的一种。在 Python 程序中,我们可以通过装饰器来为函数提供额外的能力;在 Django 项目中,我们可以把类似于验证用户是否登录这样的重复性代码放到 中间件 中。

Django中间件概述

中间件是安插在 Web 应用请求和响应过程之间的组件,它在整个 Web 应用中扮演了拦截过滤器的角色,通过中间件可以拦截请求和响应,并对请求和响应进行过滤(简单的说就是执行额外的处理)。通常,一个中间件组件只专注于完成一件特定的事,例如:Django 框架通过 SessionMiddleware 中间件实现了对 session 的支持,又通过 AuthenticationMiddleware 中间件实现了基于 session 的请求认证。通过把多个中间件组合在一起,我们可以完成更为复杂的任务,Django 框架就是这么做的。

在 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',
]

我们稍微为大家解释一下这些中间件的作用:

CommonMiddleware - 基础设置中间件,可以处理以下一些配置参数。

  • DISALLOWED_USER_AGENTS - 不被允许的用户代理(浏览器)
  • APPEND_SLASH - 是否追加/
  • USE_ETAG - 浏览器缓存相关

SecurityMiddleware - 安全相关中间件,可以处理和安全相关的配置项。

  • SECURE_HSTS_SECONDS - 强制使用 HTTPS 的时间
  • SECURE_HSTS_INCLUDE_SUBDOMAINS - HTTPS 是否覆盖子域名
  • SECURE_CONTENT_TYPE_NOSNIFF - 是否允许浏览器推断内容类型
  • SECURE_BROWSER_XSS_FILTER - 是否启用跨站脚本攻击过滤器
  • SECURE_SSL_REDIRECT - 是否重定向到 HTTPS 连接
  • SECURE_REDIRECT_EXEMPT - 免除重定向到 HTTPS

SessionMiddleware - 会话中间件。

CsrfViewMiddleware - 通过生成令牌,防范跨请求份伪的造中间件。

XFrameOptionsMiddleware - 通过设置请求头参数,防范点击劫持攻击的中间件。

在请求的过程中,上面的中间件会按照书写的顺序从上到下执行,然后是 URL 解析,最后请求才会来到视图函数;在响应的过程中,上面的中间件会按照书写的顺序从下到上执行,与请求时中间件执行的顺序正好相反。

自定义中间件

Django 中的中间件有两种实现方式:基于类的实现方式和基于函数的实现方式,后者更接近于装饰器的写法。装饰器实际上是代理模式的应用,将横切关注功能(与正常业务逻辑没有必然联系的功能,例如:身份认证、日志记录、编码转换之类的功能)置于代理中,由代理对象来完成被代理对象的行为并添加额外的功能。中间件对用户请求和响应进行拦截过滤并增加额外的处理,在这一点上它跟装饰器是完全一致的,所以基于函数的写法来实现中间件就跟装饰器的写法几乎一模一样。

下面我们用自定义的中间件来实现用户登录验证的功能。

我们可以自定义中间件来实现对登录状态的检查,如果用户未登录的话,就直接跳转到登录页面。下面是一个简单的中间件,用于检查用户是否登录:

"""
middlewares.py
"""
from django.http import JsonResponse
from django.shortcuts import redirect
# 需要登录才能访问的资源路径
LOGIN_REQUIRED_URLS = {'/praise/', '/criticize/', '/excel/', '/teachers_data/'}
def check_login_middleware(get_resp):
    def wrapper(request, *args, **kwargs):
        # 请求的资源路径在上面的集合中
        if request.path in LOGIN_REQUIRED_URLS:
            # 会话中包含 userid 则视为已经登录
            if 'userid' in request.session:
                return get_resp(request, *args, **kwargs)
            # 跳转到登录页面
            else:
                return redirect('/login/')
        return get_resp(request, *args, **kwargs)
    return wrapper

然后,在项目的配置文件中,将中间件添加到 MIDDLEWARE 列表中即可:

MIDDLEWARE = [
    # ...
    'path.to.check_login_middleware',
    # ...
]

这样,我们就可以在需要登录才能访问的视图函数中添加一个装饰器,例如:

@check_login_middleware
def praise(request):
    pass

这样就完成了对登录状态的检查。

总结

通过本文的介绍,我们了解了中间件的应用和自定义中间件的实现方式。在 Django 项目中,中间件的应用可以避免大量的重复代码,让我们的代码更加简洁,也更容易维护。在实际项目中,我们可以根据需求自定义不同的中间件,实现不同的功能。同时,需要注意的是,中间件的执行顺序也很重要,需要根据实际情况来确定。希望本文对大家有所帮助,谢谢阅读!

到此这篇关于深入探索Django中间件的应用场景的文章就介绍到这了,更多相关Django中间件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python SQLAlchemy简介及基本用法

    Python SQLAlchemy简介及基本用法

    SQLAlchemy是一个基于Python实现的ORM对象关系映射框架,该框架建立在DB API之上,使用关系对象映射进行数据库操作,这篇文章主要介绍了SQLAlchemy简介以及基本使用,需要的朋友可以参考下
    2023-08-08
  • python中使用pymssql库操作MSSQL数据库

    python中使用pymssql库操作MSSQL数据库

    这篇文章主要给大家介绍了关于python中使用pymssql库操作MSSQL数据库的相关资料,最近在学习python,发现好像没有对pymssql的详细说明,于是乎把官方文档学习一遍,重要部分做个归档,方便以后查阅,需要的朋友可以参考下
    2023-08-08
  • Python的pytest测试框架使用详解

    Python的pytest测试框架使用详解

    这篇文章主要介绍了Python的pytest测试框架使用详解,说到 pytest,大家总不免要拿来和 unittest 来比一下,但是 unittest 毕竟是标准库,兼容性方面肯定没得说,但要论简洁和方便的话,pytest 也是不落下风的,需要的朋友可以参考下
    2023-07-07
  • Django记录操作日志与LogEntry的使用详解

    Django记录操作日志与LogEntry的使用详解

    我们既知道如何记录变更日志,也知道如何获取变更日志,那么如何才能够在admin后台方便地查看操作日志呢?这篇文章主要给大家介绍了关于Django记录操作日志与LogEntry使用的相关资料,需要的朋友可以参考下
    2022-01-01
  • 详解Python如何使用Self类型实现返回类的实例对象

    详解Python如何使用Self类型实现返回类的实例对象

    在 Python 中,类方法通常会返回类的实例对象,本文将详细介绍如何在 Python 中使用 Self 类型来返回类的实例对象,并提供丰富的示例代码帮助更好地理解,快跟随小编一起学习起来吧
    2024-02-02
  • 删除DataFrame中值全为NaN或者包含有NaN的列或行方法

    删除DataFrame中值全为NaN或者包含有NaN的列或行方法

    今天小编就为大家分享一篇删除DataFrame中值全为NaN或者包含有NaN的列或行方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-11-11
  • Python使用Matlab命令过程解析

    Python使用Matlab命令过程解析

    这篇文章主要介绍了Python使用Matlab命令过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • Pytorch中index_select() 函数的实现理解

    Pytorch中index_select() 函数的实现理解

    这篇文章主要介绍了Pytorch中index_select() 函数的实现理解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • python使用mysql的两种使用方式

    python使用mysql的两种使用方式

    pymsql是Python中操作MySQL的模块。这篇文章主要介绍了python使用mysql的两种使用方式,需要的朋友可以参考下
    2018-03-03
  • Python使用tkinter实现小时钟效果

    Python使用tkinter实现小时钟效果

    这篇文章主要为大家详细介绍了Python使用tkinter实现小时钟效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-02-02

最新评论