用于Armstrong全系统的通用后端系统
项目描述
用于Armstrong全系统的通用后端系统
使用方法
在运行时动态加载Python模块,并直接使用它,就像您直接编写了该模块一样。这提供了灵活性。这是多态性的体现。
为什么?在Armstrong内部,我们通过后端执行许多操作。如果您想以不同的方式执行这些操作,请创建一个具有相同接口的类,并提供您的类作为后端。Armstrong将以您想要的方式执行其魔法。在许多情况下,Armstrong随附了对多个常见场景的支持(作为后端实现),您可以选择适合您需求的一个。
遵循Django范式,在settings.py
中创建一个key = value
,其中value是一个字符串或字符串列表,代表完整的点分Python导入路径。该模块将在运行时导入,并像直接实例化一样使用。例如:
# hello/world.py class Hello(object): def hi(self): print("Hello world!") # hello/armstrong.py class Hello(object): def hi(self): print("Hello Armstrong!") # settings.py <-- armstrong.utils.backends uses Django settings by default HELLO_CLASS = "hello.armstrong.Hello" # somewhere_else.py or in a console >>> from armstrong.utils.backends import GenericBackend >>> hello = GenericBackend("HELLO_CLASS").get_backend() >>> hello.hi() Hello Armstrong!
可以提供一个默认值,过程类似于Python标准字典的dict.get()
,如果键在设置中不存在,将提供回退值。(这是Armstrong指定默认值的方式,如果对默认行为满意,则不需要更改settings.py
。)
>>> backend = GenericBackend("MISSING_KEY", defaults="hello.world.Hello") >>> hello = backend.get_backend() >>> hello.hi() Hello world!
调用get_backend()
相当于实例化。因此,当您准备好使用动态加载的类时,请调用get_backend
。传入您通常使用的任何参数。将其视为__init__
。这些是相同的:
GenericBackend("HELLO_CLASS").get_backend(1, two=2) Hello(1, two=2)
如果您想让后端加载器在其他地方查找而不是Django设置,可以使用settings
参数传递不同的设置模块。
多个后端
另一个强大的功能?输入多个可能的后端。Armstrong将按顺序执行您想要执行的操作,直到遇到第一个能够处理它的后端。如果后端的方法引发了BackendDidNotHandle
异常,Armstrong将尝试下一个后端。以下是一个伪代码示例:
default_backends = ["myapp.backends.TwitterBackend", "myapp.backends.FacebookBackend"] backend = GenericBackend("SOCIAL_NETWORKS", defaults=default_backends) # myapp.backends.py class TwitterBackend(object): def post(msg): if not self.user.has_account: raise BackendDidNotHandle("No account for that user") social_network = backend.get_backend(user) social_network.post("Armstrong is pretty sweet you guys")
编写后端
后端是类。GenericBackend
是一种动态加载这些类的方式。除了使用get_backend
来处理后端的创建之外,您可以像直接调用它一样处理它。
如果您正在使用多个后端,后端的所有属性(和方法)都会被代理以处理分发。要使后端放弃并让加载器使用列表中的下一个后端,请让后端方法引发armstrong.utils.backends.BackendDidNotHandle
。
安装和配置
支持Python 2.6和2.7上的Django 1.3、1.4、1.5、1.6、1.7。
pip install armstrong.utils.backends
贡献
开发在GitHub上进行。欢迎参与!
发现了错误?在GitHub Issues上提交。请提供尽可能多的详细信息,并确保列出具体的组件,因为我们使用的是集中式、项目级的问题跟踪器。
进行测试?
pip install tox
并运行tox
有要提交的代码?分叉存储库,将您的更改合并到主题分支,并创建一个pull request。armstrong.dev包提供了测试、覆盖率以及South迁移的工具,以及使用此组件的设置轻松运行完整Django环境。
有问题、需要帮助、讨论?请使用我们的Google Group邮件列表。
项目状态
Armstrong是一个开源新闻平台,任何组织都可以免费使用。它是Texas Tribune和Bay Citizen之间的合作成果,以及John S. and James L. Knight Foundation的资助。Armstrong可以作为完整捆绑包和单独组件提供。