一文学会Django中间件

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
性能测试 PTS,5000VUM额度
云原生网关 MSE Higress,422元/月
简介: 例如:可以使用中间件对请求做出拦截,限制用户(可以从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
要想过此路,留下买路钱!
目录
相关文章
|
1月前
|
中间件 Python
理解Django中间件及其应用实例
理解Django中间件及其应用实例
30 0
|
3月前
|
监控 安全 中间件
Python Django 后端架构开发: 中间件架构设计
Python Django 后端架构开发: 中间件架构设计
39 1
|
3月前
|
安全 中间件 项目管理
Django 后端架构开发:分页器到中间件开发
Django 后端架构开发:分页器到中间件开发
41 1
|
3月前
|
安全 中间件 开发者
Django中间件
【8月更文挑战第21天】
23 5
|
3月前
|
中间件 数据库连接 UED
Django中间件秘籍:如何用几行代码让你的应用变得超级强大?
【8月更文挑战第31天】中间件是Django框架的核心特性,位于视图与HTTP服务器之间,允许全局处理请求和响应,增强Web应用功能。通过实现`MiddlewareMixin`类的方法,如`process_request`和`process_response`,可以轻松实现请求预处理或响应后处理。中间件应用场景广泛,包括用户认证、CSRF防护和数据库连接管理等。创建并配置中间件需将其加入`settings.py`的`MIDDLEWARE`列表,顺序决定执行优先级。合理利用中间件能提高代码重用性和应用性能,带来更好的用户体验。
52 0
|
3月前
|
前端开发 中间件 索引
Django入门到放弃之中间件
Django入门到放弃之中间件
|
5月前
|
中间件 开发者 C++
Django中间件探索:揭秘中间件在Web应用中的守护角色与实战应用
Django中间件探索:揭秘中间件在Web应用中的守护角色与实战应用
|
6月前
|
中间件 Python
中间件应用Django Middleware(Python)
【5月更文挑战第3天】中间件应用Django Middleware(Python)
72 6
中间件应用Django Middleware(Python)
|
5月前
|
缓存 监控 中间件
探究Django中间件的神奇:功能、应用场景和核心方法
在Django中,中间件是一个强大的概念,它们提供了一种灵活的方式来处理请求和响应。本文将探讨Django中间件的基本概念、常见应用场景以及中间件类中的父类和核心方法。
|
5月前
|
中间件 开发者 Python
Django——中间件
Django——中间件