中间件
中间件
中间件是 Web 应用程序的一个极其重要的方面,因为它允许您在每个请求之前或之后,甚至在某些路由之前或之后运行重要的代码。在本文档中,我们将讨论中间件的工作原理、如何使用中间件以及如何创建自己的中间件。
入门
中间件类放置在 Kernel
类中。所有中间件都只是包含 before
方法和 after
方法的类。
Masonite 一共有四种中间件:
- 在每个请求之前运行的中间件
- 在每个请求之后运行的中间件
- 在某些路由之前运行的中间件
- 在某些路由之后运行的中间件
配置
我们有两个需要使用的配置属性之一。这些属性都驻留在我们的 Kernel
文件中,并且是 http_middleware
(HTTP 中间件) 和 route_middleware
(路由中间件)。
http_middleware
(HTTP 中间件)是一个简单的列表,应该包含你的中间件类。这个属性是一个列表,因为所有的中间件都会一个接一个地依次运行,类似于 Django 中间件。
HTTP 中间件存在我们的 Kernel
文件中,这种类型的中间件可能类似于:
from masonite.middleware import EncryptCookies
class Kernel:
http_middleware = [
EncryptCookies
]
无论是否找到路由,中间件都会在应用程序的每个入站请求上运行。
路由中间件
路由中间件也很简单,但它不是一个列表,而是一个以自定义名称为键的字典和一个中间件列表。这样我们就可以根据路由文件中的键指定中间件。
路由中间件存在于在我们的 Kernel.py
文件中,这可能看起来像:
from app.middleware.TestMiddleware import TestMiddleware
class Kernel:
#..
route_middleware = {
"web": [
SessionMiddleware,
HashIDMiddleware,
VerifyCsrfToken,
],
# test 是 TestMiddleware 的别名;web.py 里调用 .middleware('test')
"test": [TestMiddleware]
}
默认情况下,
web.py
文件中的所有路由都将运行web
中间件列表内容。
中间件参数
你可以将参数从你的路由传递到中间件,以防中间件根据你的路由采取不同的行为。
你可以在路由中间件名称旁边使用 :
符号执行此操作,然后将这些参数传递给 before
和 after
中间件方法。
例如,我们可能正在创建一个用于请求限制的中间件,并且在我们的路由中我们有这样的东西:
Get('/feeds', 'FeedController').middleware('throttle:2,100')
注意 throttle:2,100 这样的语法。然后将 2 和 100 传递到中间件的 before 和 after 方法中:
class ThrottleMiddleware:
def before(self, request, response, minutes, requests):
# throttle requests
def after(self, request, response,
minutes, requests):
# throttle requests
请求参数
类似于我们可以使用 :
拼接将值传递给中间件的方式,我们也可以在值中使用 @
来传递参数的值。
例如,我们可以像这样创建一个路由和一个中间件
Get('/dashboard/@user_id/settings', 'FeedController').middleware('permission:@user_id')
如果我们请求了像 /dashboard/152/settings
这样的路由,那么 152 的值将被传递给中间件的 before 和 after 方法。
创建中间件
中间件具有以下特点:
- 可以存在于你项目中的任何位置,
- 从 Masonite 的基础中间件类继承
- 包含一个接受请求和响应参数的 before 和 after 方法
from masonite.middleware import Middleware
class AuthenticationMiddleware(Middleware):
"""Middleware class
"""
def before(self, request, response):
#..
return request
def after(self, request, response):
#..
return request
请务必注意,为了使请求生命周期继续,你必须返回请求类。如果不返回请求类,则不会在该中间件之后运行其他中间件。
就这样!现在我们只需要确保我们的路由能被正确请求。如果我们希望它在请求之后执行,我们可以在 after
方法中使用完全相同的逻辑。
使用中间件
如果我们使用路由中间件,我们需要指定哪个路由应该执行中间件。要指定哪个路由,我们只需将 .middleware()
方法附加到我们的路由上。这看起来像:
Route.get('/dashboard', 'DashboardController@show').name('dashboard').middleware('test')
Route.get('/login', 'LoginController@show').name('login')
.middleware('test')
中的 test 是在 Kernel.py
里定义的:
# Kernel.py
route_middleware = {
···
"test": [TestMiddleware]
}
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。