Django中间件案例由浅入深+实战
WEB前端开发社区 昨天
一般概念
中间件允许您在一个浏览器的请求在到达Django视图之前处理它,以及在视图返回的响应到达浏览器之前处理这个响应。Django为每个项目保留一个中间件列表。您可以在设置文件settings.py中到它MIDDLEWARE。每个新的Django项目已经在该列表中添加了一堆中间件,在大多数情况下,您不应从该列表中删除任何中间件。但是,您可以添加自己的。
中间件的应用顺序与添加到Django设置列表中的顺序相同。浏览器发送请求时,将按以下方式处理:
∙
Browser -> M_1 -> M_2 -> ... -> M_N -> View
视图接收请求,执行一些操作,然后返回响应。在进入浏览器的过程中,响应必须再次通过每
个中间件,但顺序相反:
∙
Browser <- M_1 <- M_2 <- ... <- M_N <- View
这是一个非常简短的解释。更详细的描述可以在Django文档中到 。
一个简单的例子
我们将从一个简单的中间件例子开始,该中间件就算处理请求所花费的时间。这篇文章中的所有示例都使用Django 3.0.5和Python 3.6.9。
项目设置
首先,使用单个应用程序创建一个Django项目。忽略数据库迁移,因为本文中的示例将不使用数据库。在您的应用程序app目录下创建一个名为middleware.py的文件,这是我们放置大多数代码的地方。
∙
∙
∙
∙
django-admin startproject django_middlewarecd django_middlewarepython manage.py startapp introtouch intro/middleware.py
整个项目的目录结构如下所示:
∙
∙
∙
∙
∙
∙
∙
∙
∙
∙
∙
∙
∙
∙
∙
∙
∙
∙
django_middleware/├── django_middleware│ ├── asgi.py│ ├── __init__.py│ ├── settings.py│ ├── urls.py│ └── wsgi.py├── intro│ ├── admin.py│ ├── apps.py│ ├── __init__.py│ ├── middleware.py│ ├── migrations│ │ └── __init__.py│ ├── models.py│ ├── tests.py│ └── views.py└── manage.py
不要忘记在django_middleware/settings.py中注册您的应用程序(app):
∙
∙
∙
∙
INSTALLED_APPS = [ 'intro', ...]
现在你可以运行你的项目了。
∙
python manage.py runserver
编写Django中间件
根据Django文档,有两种编写中间件的方法:函数和类。我们将使用第一种方法,但最后一个示例还将向您展示如何使用类编写中间件。
Django中间件的一般结构如下所示(示例取自Django文档):
∙
∙
∙
∙
∙
∙
∙
∙
def simple_middleware(get_response): # 一次性设置和初始化 def middleware(request): # 请求在到达视图前执行的代码 response = get_response(request) # 响应在返回给客户端前执行的代码 return response return middleware
当Django初始化中间件并将其添加到项目所有中间件的列表中时,该函数simple_middleware将被调用一次。服务器处理每个请求都会调用middleware该函数。当请求从浏览器发送到服务器时,将调用response = get_response(request)该行之前的所有内容。当响应从服务器返回到浏览器时,将调用django网站response = get_response(request)此行之后的所有内容。
那么这条分界线respone = get_response(request)做什么的?简而言之,它将调用列表中的下一个中间件。如果这是最后一个中间件,则将调用该视图。该视图接收请求,执行一些操作并生成响应。然后将该响应返回到列表中的最后一个中间件,然后向上执行直到不再有中间件时将该响应发送到浏览器。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论