Flask信号:为何在信号中修改数据不合适?
Flask的文档中提到:
请记住,信号的目的是通知订阅者,而不是鼓励订阅者去修改数据。
我在想,为什么会这样呢?
我正在使用Flask-User库,想在用户注册时设置一些默认字段(比如把显示名称设置为用户名),然后更新数据库。Flask-User在用户注册时会发送user_registered
信号。为什么在这个信号中订阅并更新数据库不是个好主意呢?
1 个回答
3
这是一个关于过度使用钩子的解决方案。我觉得我是一名强大的Drupal/PHP开发者。在第七个版本之前,所有的东西都是通过钩子来构建的——就像Flask中的信号一样。当所有东西都依赖于钩子时,项目就会变得一团糟。虽然这个过程很快,但也很危险。信号的设计是为了作为观察者模式使用,类似于事件。这是主要的想法。但是当我们能够更新上下文和主题时,就像责任链模式一样。主要的问题在于这条链。如果链中的一个环节出错,其他环节就会收到错误的状态。这是主要的问题。有时候很难找到出错的原因,因为我们有来自不同主题的不同信号,这些信号会修改共同的范围。
你几乎可以在任何地方扩展,但不应该改变数据。要正确扩展,你应该使用干净的面向对象编程(OOP)解决方案。
有时候我们需要改变一些逻辑。因此,我们需要定义一个需要改变的范围。在Drupal 8中,我们使用依赖注入容器——服务。服务在单独的文件中描述。因此,我们可以改变关系和注入。
这里有一个有趣的库——https://pypi.python.org/pypi/Flask-Injector。