应用程序配置

大多数人已经将“配置”理解为影响应用程序操作的设置。例如,很容易想到 .ini 在应用程序启动时解析为“配置”的文件。但是,如果你思想相当开放,很容易想到 code 配置也一样。因为和大多数其他Web应用程序平台一样,金字塔是 框架 它调用您编写的代码(而不是 类库 ,这是纯粹为您调用而存在的代码)。插入已写入的应用程序代码的行为 Pyramid 在本文档中也称为“配置”;您正在配置 Pyramid 调用组成应用程序的代码。

参见

有关的信息 .ini 金字塔应用程序的文件请参见 启动 章。

有两种方法可以配置 Pyramid 应用: imperative configurationdeclarative configuration . 这两个都在下面描述。

命令式配置

“命令式配置”只是指由python语句完成的配置,一个接一个。这里有一个最简单的 Pyramid 应用程序,强制配置:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
from wsgiref.simple_server import make_server
from pyramid.config import Configurator
from pyramid.response import Response

def hello_world(request):
    return Response('Hello world!')

if __name__ == '__main__':
    with Configurator() as config:
        config.add_route('hello', '/')
        config.add_view(hello_world)
        app = config.make_wsgi_app()
    server = make_server('0.0.0.0', 6543, app)
    server.serve_forever()

我们还不会谈论这个应用程序的功能。请注意,配置语句发生在 if __name__ == '__main__': 方法调用形式的节 Configurator 对象(例如, config.add_view(...) )这些语句一个接一个地发生,并按顺序执行,因此可以在这种配置模式中使用Python的全部功能,包括条件。

声明性配置

有时用命令式代码完成所有配置会很痛苦,因为通常单个应用程序的代码可能存在于许多文件中。如果配置集中在一个地方,则需要同时打开至少两个文件才能看到“大画面”:表示配置的文件,以及包含由配置引用的实现对象的文件。为了避免这种情况, Pyramid 允许插入 configuration decoration 与声明本身引用的代码非常接近的语句。例如:

1
2
3
4
5
6
from pyramid.response import Response
from pyramid.view import view_config

@view_config(route_name='hello', request_method='GET')
def hello_world(request):
    return Response('Hello World!')

仅存在配置装饰不会导致执行任何配置注册。在它对 Pyramid 应用程序,应用程序代码中的配置修饰必须通过称为 scan .

例如, pyramid.view.view_config 上面代码示例中的decorator向 hello_world 函数,使其可用于 scan 以后再找。

A scan A的 module 或A package 它的装饰子包装发生在 pyramid.config.Configurator.scan() 方法被调用:扫描意味着在包及其子包中搜索配置声明。例如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
from wsgiref.simple_server import make_server
from pyramid.config import Configurator
from pyramid.response import Response
from pyramid.view import view_config


@view_config(route_name='hello', request_method='GET')
def hello_world(request):
    return Response('Hello World!')


if __name__ == '__main__':
    with Configurator() as config:
        config.add_route('hello', '/')
        config.scan()
        app = config.make_wsgi_app()
    server = make_server('0.0.0.0', 6543, app)
    server.serve_forever()

扫描机器递归地导入包或模块中的每个模块和子包,查找附加到模块内定义的对象的特殊属性。这些特殊属性通常通过使用 decorator . 例如, view_config decorator可以附加到函数或实例方法。

一旦调用扫描,并且 configuration decoration 是由扫描仪找到的,对 Configurator 代表你。这些调用取代了添加命令式配置语句的需要,这些命令式配置语句不靠近正在配置的代码。

结合 configuration decoration 以及 scan 合称为 declarative configuration .

在上面的示例中,扫描程序将参数转换为 view_config 打电话给 pyramid.config.Configurator.add_view() 方法,有效:

config.add_view(hello_world, route_name='hello',
                request_method='GET')

总结

有两种方法可以配置 Pyramid 应用:声明性和强制性。您可以选择最舒适的模式;两者完全相同。本文档中的示例将交替使用这两种模式。