用于构建模块化应用程序的库

applip的Python项目详细描述


pipeline statuscoverage reportPyPI StatusPyPI VersionPyPI PythonPyPI LicensePyPI Format

应用程序

pip install applipy

Applipy让您:

  • 实现自包含或相互依赖的^{}s,您可以 可以通过配置文件告诉applipy为应用程序加载
  • 实现^{}s:实现应用程序的实例 生命周期方法
  • 模块可以注册多个将同时运行的AppHandle
  • 从配置文件加载应用程序
  • 您可以有多个配置文件(即每个环境一个:本地, 开发、生产、准备等)
  • 通过环境变量告诉applipy要加载哪个环境 APPLIPY_ENV
  • applipy将优雅地管理应用程序的生命周期
  • 定义protocol handlers 对于配置值中的给定URI方案。有了这些你就可以实现 secrets 应用程序可以通过配置访问。在

使用

可以使用JSON(或YAML,如果pyyaml是 已安装)。在

^{pr2}$

用上面snipet中的内容保存一个文件dev.yaml,然后运行 以下命令:

$ pip install pyyaml applipy applipy_http applipy_prometheus
$ python -m applipy

上面的配置文件定义了一个名为demo的应用程序,它将安装 applipy web模块和Prometheus模块。在

你可以去http://localhost:8080试试。到 查看您必须至少调用两次的 http://0.0.0.0:8080/metrics终结点。在

Applipy将搜索名为 ${APPLIPY_CONFIG_PATH}/${APPLIPY_ENV}.json(和 ${APPLIPY_CONFIG_PATH}/${APPLIPY_ENV}.yaml,如果pyyaml已安装)。这个 默认值是:APPLIPY_ENV=devAPPLIPY_CONFIG_PATH=.

应用句柄

AppHandle是通过applipy管理 应用程序。AppHandle实现如下所示:

# demo_app.pyfromapplipyimportAppHandleclassMyDemoApp(AppHandle):asyncdefon_init(self):print('initialize resources')asyncdefon_start(self):print('run long lived application here')whileTrue:awaitsleep(3600)asyncdefon_shutdown(self):print('close and release resources')

正如您在上面看到的,AppHandles公开了三种方法 applipy运行你的应用程序。在

Applipy能够同时运行多个并发AppHandles, 利用python中的async。在

简化了很多,applipy会像这样运行AppHandles:

try:awaitall_app_handles.on_init()awaitall_app_handles.on_start()finally:awaitallapp_handles.on_shutdown()

通常,AppHandle实现通过以下方式添加到applipy应用程序 包括它们所属的模块,并在 模块configure()函数。在

模块

在applipy中,模块是应用程序的构建块。他们允许 通过公开 ^{}的 ^{15>处理应用程序的寄存器 register()函数并定义模块间的依赖关系。在

模块实现的示例如下所示:

# mymodule.pyfromapplipyimportConfig,Module,LoggingModulefromloggingimportLoggerfromdemo_appimportMyDemoAppclassMyModule(Module):def__init__(self,config:Config):self._config=configdefconfigure(self,bind,register):bind(str,'ModuleDemo')register(MyDemoApp)@classmethoddefdepends_on(cls):return(LoggingModule,)

向应用程序添加模块的方法是通过配置文件 使用定义模块实现的完全限定名列表 键app.modules

app:modules:-applipy_http.HttpModule-applipy_prometheus.PrometheusModule-mymodule.MyModule

模块只能在其构造函数中接收一个参数,它是 Config实例,如上面的代码所示。如果您的模块不需要 访问配置时,您不能实现__init__或拥有它 没有参数(除了self)。在

启动时,configure()方法由applipy Application运行 它的目的是允许绑定类型和注册应用程序 把手。查看中的扩展Module文档 ^{}。在

最后,depends_on()类方法返回模块类型的元组 模块取决于。在上面的示例中,因为应用程序句柄 由模块注册需要logging.Logger,模块声明一个依赖项 因为我们知道它绑定了logging.Logger类型。在

更多

要深入了解功能和细节,请随时查看 ^{} 子目录和代码本身!在

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
添加文件发送者后,Java聊天socket不显示消息   java显示存储在MySQL中的BLOB图像,无需写入磁盘   连接到SQLite数据库时发生java GAE受限类错误   如何在Java中自动从外部源(如文件)读取对象属性?   java使用google应用程序引擎发送电子邮件   java找不到应用程序。属性文件从War文件的外面   关于GridLayout和paintComponent方法的用户界面Java Swing问题   java6项目中的JavaOneLogin javasaml 2.0   数组Java GUI将文本文件数据导入JTable   游戏引擎从另一个类或文件中设置java数组的元素   构建如何将java类修补/复制到本地WebSphere服务器?   添加拦截器并使用Dagger2注入拦截器后,java翻新服务始终为空   java Guava LoadingCache如何处理备份存储中不存在的密钥   组织。openqa。硒。NoSuchSessionException:会话ID为空。在自动化中获取此错误(使用testng、selenium、java)   java是从4GB文件创建trie(JSON)的最快方法,只需1GB的ram?