跳转到主要内容

Starlette项目配置的IoC

项目描述

Starlette项目配置的IoC

IoC代表“控制反转”,它提供了一种配置Starlette项目的方式,类似于Django的INSTALLED_APPS,但遵循类似于CakePHP(自2019年以来)和Django-GDAPS的注入模型。

安装

使用pip安装

pip install starlette-apps

目的

目的是将您的starlette ASGI声明脚本中的导入和配置分开

import apps

project = apps.Project(
    TIMEZONE='Europe/Paris',
    APPS=[
        'your_db_config',
        'your_app',
    ],
)

app = project.starlette()

然后,您的应用程序可以注入路由、中间件、启动代码,并在导入时运行设置代码。

最初,我为了自己小小的框架实验而制作了这个东西,在Project类中有很多特定内容。经过一番重构,所有依赖项都可以提取到应用程序中。然后,它变得值得分享。这真的不是很多代码,但我想如果可能的话,我们能够有一个可插拔的Starlette应用程序生态系统。这是一个解决方案。

应用程序

实例化

实例化Project将基本获取APPS中每个模块的.app属性,您可能定义为如下

import apps

app = apps.App(
    name='YourApp',
    middlewares=[
        Middleware(YourMiddleware)
    ],
    routes=[
        Route('/pattern', YourView),
    ],
)

方法和声明式

您还可以声明式地定义您的应用程序,例如,如果您想覆盖某些方法

class YourApp(apps.App):
    middlewares = [Middleware(YourMiddleware)]

    def get_routes(self):
        if self.project.mode == 'production':
            return your_production_routes
        elif self.project.mode in ('test', 'dev'):
            return your_production_routes + your_debug_routes

    def setup(self):
        """
        Do something as soon as your app is imported.
        Useful to setup things such as a database connection.
        """

    def startup(self):
        """
        This will be passed to starlette on_startup.
        Useful to run migrations for example.
        """

请注意,Project不会仅仅构建一个get_routes()结果的列表,而是会调用App.get_mount(),它将返回来自get_routes()Mount结果。

项目和IoC流程

项目模式

project.mode动态属性默认返回production,但如果加载了pytest模块,它将返回test,如果--reload在sys.argv中,它将返回dev。您可以按需覆盖此设置,它可能有助于您的应用程序决定最佳注入配置。

项目实例化

本节描述了Project实例化的流程。

1. 设置project.config

然后,项目将创建一个self.config实例,它是starlette.Config类型,并使用构造函数kwargs中传递的设置,同时读取当前工作目录中的.env文件。

然后,您可以通过类似project.config("TIMEZONE")的方式获取设置。当然,这意味着您需要从模块外部获取项目实例,您可以通过以下方式实现

2. 设置Project.current()

from apps import Project

project = Project.current()

这是因为实例化Project类时,首先要设置一个类属性,即它自己。但这同样适用于子shell,因为它会写入PROJECT环境变量,即如果您实例化了项目,运行一个调用Python的shell命令:Project.current()仍然有效。

3. 应用程序设置

最后,它将逐个导入每个应用程序模块,在执行此操作时,它将

  • 从模块中获取app变量,
  • 如果设置了app.name,则将app.name设置为模块名称,以确保所有应用程序都有一个名称
  • 将应用程序添加到project.apps[app.name]
  • app.module设置为导入该模块的模块,
  • app.project设置为项目实例,
  • 调用app.setup()

因此,如果您的第一个应用程序是your_orm,您可以在your_orm.app.setup()中设置数据库连接,它将对所有后续应用程序可用。

Starlette生成

project.starlette(**kwargs)返回一个Starlette实例,如下所示

  • 如果project.modetestdev,则它将设置debug=True
  • 它将每个应用程序的get_middlewares()的结果添加到middlewares kwarg中,
  • 它将它的project.startup()回调添加到on_startup kwarg中,默认情况下将执行每个应用程序的startup()方法
  • 它将每个应用程序的get_mount()方法返回的Mount对象添加到routes kwarg中

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分发

starlette-apps-0.1.6.tar.gz (4.9 kB 查看散列)

上传时间:

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面