瓶用依赖注射。
Bottle-Inject的Python项目详细描述
瓶依赖性注射
bottle框架已经在某些方面进行了依赖注入:路由的url参数作为关键字参数注入到处理程序函数中。其他一些插件(实际上,大多数插件)也这样做:它们注入数据库连接、身份验证上下文、会话对象等等。这个插件使这个概念对您可用,而无需为您要注入的每个依赖项编写一个新插件。如果你允许的话,它还可以改变你使用瓶子的方式,并以一种功能性的方式编写应用程序。如果做得好,依赖注入可以降低复杂性,并大大提高应用程序的可测试性和可读性。但是让我们从一个简单的例子开始:
app = Bottle() injector = app.install(bottle.ext.inject.Plugin()) @injector.provider('db') def get_db_handle(): return my_database_connection.cursor() @app.route('/random_quote') def random_quote(db): row = db.execute('SELECT quote FROM quotes ORDER BY RANDOM() LIMIT 1').fetchone() return row['quote']
前两行并不新鲜。我们只需创建一个瓶子应用程序并安装这个插件。下一个街区更有趣。与瓶子将处理程序函数绑定到url路径的方式类似,注入器将提供程序绑定到注入点。在本例中,我们将提供程序"get_db_handle"绑定到名为"db"的注入点。当通过我们的注入器调用一个函数并有一个同名的参数时,它将从我们的提供程序接收一个新的数据库游标。你可以在接下来的几行中看到。因为所有处理程序回调都是由我们的Injector插件管理的,所以您只需要接受一个'db'参数,它就会由插件自动为我们注入。如果定义的路由不接受"db"参数,则不会发生任何事情。从未为该路线创建过数据库光标。
这个小例子很好地展示了依赖注入的好处:
- 可以通过向"random_quote()"函数传递一个伪数据库或测试数据库对象来直接对其进行单元测试。无需为测试而设置整个应用程序。
- 没有使用全局变量或全局状态。此函数可以在不同的上下文中再次使用,无需麻烦。
- 您不必将 get_db_handle 导入定义瓶子应用程序路径的每个模块。
- 您可以更改"get-db-handle"的实现,它会影响应用程序的每个路由。无需搜索/替换代码库。
- 少打字。在重要的地方要懒惰。