框架钩子

未匹配的标注

Framework Hooks

简介

Framework Hooks 本质上是您能够「挂钩」到的发出的事件。如果您想添加对 Sentry,)的支持,这是一种异常和错误跟踪解决方案,那么您需要绑定到 Exception Hook。当遇到异常时,它将在容器中查找您的类并执行它。

目前只有可以绑定的 Exception Hook,但 Masonent 的后续版本中将有其他 Hook,如 View Hooks 和 Mail Hooks。

入门

为了了解 Framework Hooks,我们将逐步介绍如何将 Sentry 实现到 Masonite 应用程序中,方法是将其添加到 Exception Hook 中。

Exception Hooks

当应用程序中抛出异常时,将触发 Exception Hook。您在开发过程中通常会看到调试视图的任何时候都是此钩子将被触发的时间。如果服务器因异常而无法启动,则可能不会触发此 Hook,具体取决于异常抛入容器的距离,但遇到的任何正常应用程序异常都将触发此 Hook。

要绑定的异常钩子是 ExceptionHook。这意味着容器中的键应该以 ExceptionHook 结尾,当抛出异常Hook 时,Masonite 将调用它。我们可以将内容装入容器,例如:

app.bind('SentryExceptionHook', YourObject())

请注意,我们的键以 ExceptionHook 结尾,并且我们实例化了对象。让我们从头开始探索如何创建它。

创建钩子

让我们探讨如何简单地将 Sentry 添加到我们的应用程序中。这大约需要 5 分钟。

让我们创建一个名为 SentryHook 的类,并将其放入 app/hooks/signry.py

app/hooks/sentry.py

class SentryHook:
    def __init__(self):
        pass

    def load(self, app):
        self._app = app

这应该是 hook 的基本结构。所有 hook 都需要加载方法。此加载方法将始终传递给应用程序容器,因此它始终需要该参数。在这里,我们可以通过从容器中制造对象来做我们需要做的任何事情。

但是对于这个例子,我们实际上不需要容器,因此我们可以忽略它。

添加 Sentry (哨兵)

好的,现在让我们将 Sentry 添加到我们的应用程序中。您可以使用 Sentry.io 进行注册,这将向您显示将 Sentry 添加到任何 Python 项目中的基本 3 行。

这应该是完成的 hook:

from raven import Client
client = Client( 'https://874..:j8d@sentry.io/1234567')

class SentryHook:
    def __init__(self):
        pass

    def load(self, app):
        client.captureException()

就是这样。客户端中的 key 可以通过 Sentry.io 仪表板使用。

绑定到 Exception Hook

现在,让我们逐步了解如何将其简单地绑定到容器中,以便在我们的项目中抛出异常时调用它。
Now let's walk through how we can simply tie this into the container so it will be called when an exception is thrown in our project.

记住,我们需要做的就是调用,是将其添加到容器中,然后将正确的字符串附加到键上。

我们可以创建一个新的服务提供者来存储我们的 hooks,让我们创建一个。

$ craft provider SentryServiceProvider

这将在 app/providers/SentryServiceProvider.py 中创建一个新的服务提供者,如下所示:

from masonite.provider import ServiceProvider

class SentryServiceProvider(ServiceProvider):
    def register(self): 
        pass

    def boot(self): 
        pass

现在,让我们添加它的 hook:

from masonite.provider import ServiceProvider
from ..hooks.sentry import SentryHook

class SentryServiceProvider(ServiceProvider):
    def register(self): 
        self.app.bind('SentryExceptionHook', SentryHook())

    def boot(self): 
        pass

注意,我们绑定对象的键以「ExceptionHook」结尾。我们在字符串的此部分之前放置的是您要放置的任何内容。另请注意,我们还实例化了 SentryHook(),并且没有放置 SentryHook

最后,将服务提供者添加到 config/providers.py 文件中的 PROVIDERS 常量中:

from app.providers.SentryServiceProvider import SentryServiceProvider
...
PROVIDERS = [
    # Framework Providers
    AppProvider,
...
    ViewProvider,

    # Optional Framework Providers
    SassProvider,
    MailProvider,
...
    # Application Providers
    SentryServiceProvider
...
]
...

就是这样!现在,每次抛出异常时,它将运行我们绑定到容器中的 SentryHook 类,并且该异常应在Sentry.io仪表板中弹出。

异常处理程序

您可以构建处理程序来处理应用程序引发的特定异常。例如,如果抛出 TemplateNotFound 异常,那么您可以构建一个特殊的异常处理程序来捕获该异常,并返回一个特殊的视图或特殊的调试屏幕。

构建异常处理程序

异常处理程序是简单的类,它具有可以接受抛出的异常的 handle 方法:

from masonite.request import Request

class TemplateNotFoundHandler:

    def __init__(self, request: Request):
        self.request = request

    def handle(self, exception):
        pass

容器解析所有异常处理程序的构造函数,因此您可以提示所需的任何依赖关系。构造函数解析后,将调用 handle 方法。

调用 handle 方法后,Masonite 将继续其余的 WSGI 逻辑,即设置状态代码,标头并返回响应。

注册异常处理程序

现在我们有了异常处理程序,我们将需要使用特殊的命名约定将其注册到容器中。命名约定为:ExceptionNameOfErrorHandler。我们要捕获的异常的名称称为 TemplateNotFound,因此我们需要将其绑定到容器中,如下所示:

from masonite.provider import ServiceProvider
from somewhere import TemplateNotFoundHandler

class UserModelProvider(ServiceProvider):

    def register(self): 
        self.app.bind('ExceptionTemplateNotFoundHandler', TemplateNotFoundHandler)

    ...

异常侦听器

虽然异常处理程序实际上将处理传入的异常,但异常侦听器有所不同。

Masonite 可以在框架中注册多个侦听器,这些侦听器将侦听特定的 (或所有的) 异常,如果引发了异常,则将该异常传递给框架。然后它将执行所需的任何逻辑,直到异常处理程序最终处理该异常为止。

创建一个侦听器

侦听器是一个简单的类,需要侦听一系列异常。这是一个异常侦听器的简单样板:

from masonite.request import Request
from masonite.listeners import BaseExceptionListener

class ExceptionListener(BaseExceptionListener):

    listens = [
        ZeroDivisionError
    ]

    def __init__(self, request: Request):
        self.request = request

    def handle(self, exception, file, line):
        # Perform an action

请注意,侦听器的 __init__ 方法由容器解析,因此可以在其中随意键入您需要的任何提示。

最后,它需要一个接受 3 个参数的 handle 方法。抛出的 exception、抛入异常的 file 和抛出异常的 line

您可以监听任意数量的异常,也可以通过向 listens 属性传入 * 监听所有异常:

class ExceptionListener(BaseExceptionListener):

    listens = ['*']

    # ...

一个很好的用例是 Masonite Logging 软件包,可以使用它来记录任何异常。

注册异常侦听器

您可以通过任何服务提供者将异常侦听器直接注册到容器。为了易于使用,您可以对容器使用 simple 绑定,该绑定将使用类名作为键将类绑定到容器:

from some.place import LoggerExceptionListener

class YourProvider:

    wsgi = False

    def register(self):
        self.app.simple(LoggerExceptionListener)

现在,只要发生侦听器正在侦听的异常,您的侦听器就会运行。

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

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
上一篇 下一篇
Summer
贡献者:1
讨论数量: 0
发起讨论 只看当前版本


暂无话题~