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.mode
是test
或dev
,则它将设置debug=True
, - 它将每个应用程序的
get_middlewares()
的结果添加到middlewares
kwarg中, - 它将它的
project.startup()
回调添加到on_startup
kwarg中,默认情况下将执行每个应用程序的startup()
方法 - 它将每个应用程序的
get_mount()
方法返回的Mount对象添加到routes
kwarg中
项目详情
starlette-apps-0.1.6.tar.gz的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | d64a5dc7fcd398e96d6fc6542f3510df5fba2960bd8a2e46aa14567d1f92baf3 |
|
MD5 | 081a26595a24b43d2e43c9cb38565560 |
|
BLAKE2b-256 | db9801e22414db409a584ce1c1ffc98980fb297739fb138dde23118f6682b52b |