一文学会Django中间件

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 例如:可以使用中间件对请求做出拦截,限制用户(可以从HttpRequest中拿到客户端的IP地址)的访问频率,例如1分钟内不允许访问10次。很显然,这需要在访问视图函数之前对用户做校验,因此可以利用process_request函数完成


1.中间件的应用场景


例如:可以使用中间件对请求做出拦截,限制用户(可以从HttpRequest中拿到客户端的IP地址)的访问频率,例如1分钟内不允许访问10次。很显然,这需要在访问视图函数之前对用户做校验,因此可以利用process_request函数完成。


考虑这样一种场景:视图返回JSON数据(对于Web开发,这很常见),但是由于需求的不同,因此数据结构很难统一。此时,可以利用中间件对响应对象再做一层包装,统一数据结构,可以利用process_response函数完成。


2.中间件的钩子函数


process_request🧨


在处理视图函数之前(准确地说,是在完成通过URL找到视图函数之前),Django会调用这个钩子函数。之后,根据函数返回值的不同会有不同的效果


process_view🍟


图预处理函数。首先,来看该函数的定义:


def process_view(self, request, view_func, view_args, view_kwargs):


这个钩子函数同样会在视图函数之前执行,但是与process_request不同的是,它会在确定了当前请求对应的视图函数之后被调用:


request:HttpRequest对象实例。

view_func:解析当前请求得到的视图函数,它是一个实际的函数对象。

view_args:传递给视图函数的位置参数,它是一个元组对象。

view_kwargs:传递给视图函数的关键字参数,它是一个字典对象。


process_exception🛺


def process_exception(self, request, exception):


当视图函数抛出了未捕获的异常时,这个钩子函数会被调用。它接受两个参数,含义分别如下:


request:HttpRequest对象实例。

exception:视图函数抛出的异常对象。

该函数主要用来对异常信息做一些记录和对异常的修复,如视图函数抛出异常之后,给用户展示友好的错误提示信息


process_template_response🎶

即TemplateResponse或响应实例有render方法的后处理函数,定义如下:


def process_template_response(self, request, response):


它会在视图函数执行之后被调用,且需要保证返回的响应对象包含可调用的render方

法。接受两个参数,含义如下:


request:HttpRequest对象实例。

response:TemplateResponse或存在render方法的对象,可以是视图函数或中间件返回的。

process_response🙌

即响应后处理函数,它的定义如下:


def process_response(self, request, response):


这个函数的调用时机是Django执行了视图函数并生成响应之后。它接受两个参数,含义如下:


request:HttpRequest对象实例。

response:视图或中间件返回的响应对象。


3.自定义中间件


定义中间件最直接的方法是继承自django.utils.deprecation.MiddlewareMixin,并选择实现适合的钩子函数


通常会将中间件定义在middleware.py文件中



from django.utils.deprecation import MiddlewareMixin
class FirstMiddleware(MiddlewareMixin):
    def process_request(self, request):
        print("要想过此路,留下买路钱!")


settings.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',
    # 加入此行,post是应用名
    'post.middleware.FirstMiddleware',
]


此时访问任意路径,会先进行中间件逻辑的管控:


[13/Oct/2022 21:24:15] "GET /post/watch/ HTTP/1.1" 200 153
要想过此路,留下买路钱!
目录
相关文章
|
5月前
|
中间件 程序员 开发工具
Django实践-08中间件的应用
Django实践-08中间件的应用
Django实践-08中间件的应用
|
5天前
|
中间件 Python
中间件应用Django Middleware(Python)
中间件应用Django Middleware(Python)
31 6
|
18天前
|
存储 监控 中间件
使用Django的中间件可以解决哪些问题
【4月更文挑战第25天】Django中间件用于处理用户认证、CSRF防御、点击劫持防护、请求响应修改、自定义需求、全局处理、异常处理、数据压缩、Session管理、URL重写、限流和CORS支持。它们按顺序执行,提供安全性、灵活性及定制功能,优化Web开发体验。
12 0
|
27天前
|
中间件 API 文件存储
Django的扩展包与中间件:增强应用功能的利器
【4月更文挑战第15天】本文介绍了Django的扩展包和中间件,两者用于增强Django应用功能。扩展包是可重用的应用,提供额外功能,如用户认证和API开发。选择合适的扩展包,通过安装、配置,可轻松集成到项目中。中间件则在请求和响应之间执行操作,如身份验证和权限控制。创建中间件类并添加到settings.py中,实现特定功能。扩展包和中间件常结合使用,以实现更复杂的应用需求,提高开发效率和应用性能。
|
9月前
|
前端开发 中间件 数据安全/隐私保护
【Django】创建用户,中间件,表单组件
【Django】创建用户,中间件,表单组件
48 0
|
9月前
|
XML 中间件 数据格式
Django 高级指南:深入理解和使用类视图和中间件
Django 是一款强大的 Python Web 框架,它提供了一套完整的解决方案,让我们能够用 Python 语言快速开发和部署复杂的 Web 应用。在本文中,我们将会深入研究 Django 中的两个高级特性:类视图(Class-Based Views)和中间件(Middleware)。
|
5月前
|
缓存 中间件 Python
Python Web 开发: 解释 Django 中的中间件是什么,以及如何使用?
Python Web 开发: 解释 Django 中的中间件是什么,以及如何使用?
|
6月前
|
中间件 Python
25 Django高级- 中间件
25 Django高级- 中间件
27 0
|
9月前
|
中间件 Python
|
9月前
|
中间件 Python