中间件

未匹配的标注

中间件

中间件是 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 中间件列表内容。

中间件参数

你可以将参数从你的路由传递到中间件,以防中间件根据你的路由采取不同的行为。

你可以在路由中间件名称旁边使用 : 符号执行此操作,然后将这些参数传递给 beforeafter 中间件方法。

例如,我们可能正在创建一个用于请求限制的中间件,并且在我们的路由中我们有这样的东西:

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]
  }

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://learnku.com/docs/masonite/4.0/fe...

译文地址:https://learnku.com/docs/masonite/4.0/fe...

上一篇 下一篇
贡献者:2
讨论数量: 0
发起讨论 查看所有版本


暂无话题~