Flask信号:为何在信号中修改数据不合适?

8 投票
1 回答
1291 浏览
提问于 2025-04-18 18:21

Flask的文档中提到:

请记住,信号的目的是通知订阅者,而不是鼓励订阅者去修改数据。

我在想,为什么会这样呢?

我正在使用Flask-User库,想在用户注册时设置一些默认字段(比如把显示名称设置为用户名),然后更新数据库。Flask-User在用户注册时会发送user_registered信号。为什么在这个信号中订阅并更新数据库不是个好主意呢?

1 个回答

3

这是一个关于过度使用钩子的解决方案。我觉得我是一名强大的Drupal/PHP开发者。在第七个版本之前,所有的东西都是通过钩子来构建的——就像Flask中的信号一样。当所有东西都依赖于钩子时,项目就会变得一团糟。虽然这个过程很快,但也很危险。信号的设计是为了作为观察者模式使用,类似于事件。这是主要的想法。但是当我们能够更新上下文和主题时,就像责任链模式一样。主要的问题在于这条链。如果链中的一个环节出错,其他环节就会收到错误的状态。这是主要的问题。有时候很难找到出错的原因,因为我们有来自不同主题的不同信号,这些信号会修改共同的范围。

你几乎可以在任何地方扩展,但不应该改变数据。要正确扩展,你应该使用干净的面向对象编程(OOP)解决方案。

有时候我们需要改变一些逻辑。因此,我们需要定义一个需要改变的范围。在Drupal 8中,我们使用依赖注入容器——服务。服务在单独的文件中描述。因此,我们可以改变关系和注入。

这里有一个有趣的库——https://pypi.python.org/pypi/Flask-Injector

撰写回答