Python Pyramid 简明教程

Python Pyramid - Project Structure

如前所述,外部 testproj 文件夹包含 testproj 和 test 包。此外,它还有其他用于描述、运行和测试应用程序的文件。这些文件是 −

  1. MANIFEST.in 包含要包含在包源分发中的文件列表。

  2. development.ini 是 PasteDeploy 配置文件,可用用于在开发期间执行应用程序。

  3. production.ini 是 PasteDeploy 配置文件,可用用于在生产配置中执行应用程序。

  4. pytest.ini 是用于运行测试的配置文件。

  5. setup.py 是用于测试和分发应用程序的标准 Setuptools setup.py 文件。

  6. testing.ini 是用于执行应用程序的测试的配置文件。

".ini" 文件是 Cookiecutter 实用程序用来生成 Pyramid 应用程序结构的配置。这些文件使用一个称为 PasteDeploy 的系统,该系统由 Ian Bicking 开发。此库会随 Pyramid 自动安装。

尽管可以在没有 PasteDeploy 支持的情况下开发 Pyramid 应用程序,但它提供了一种启动、调试和测试应用程序的标准化方法。

预定义的设置从配置文件中读取(带有 .ini 扩展名)。这些文件主要包含应用程序配置设置、服务器设置和记录设置。

development.ini

如前所示,使用 Cookiecutter 构建的 Pyramid 应用程序由以下命令调用 −

pserve development.ini

development.ini 中包含应用程序的 PasteDeploy 配置规范。该文件中的配置规范包含各种部分,如 [app:main]、[server:main]、[loggers] 等。

最重要的部分是 [app:main]。它指定应用程序的起始点。

[app:main]
use = egg:testproj

pyramid.reload_templates = true
pyramid.debug_authorization = false
pyramid.debug_notfound = false
pyramid.debug_routematch = false
pyramid.default_locale_name = en
pyramid.includes = pyramid_debugtoolbar

sqlalchemy.url = sqlite:///%(here)s/testproj.sqlite

retry.attempts = 3

第一个条目“use = egg:testproj”表示 Pyramid WSGI 应用程序对象主函数的名称。它在 textproj 包的 init.py 文件(位于 testproj 项目文件夹中)中声明。此部分包含其它启动时间配置设置。

例如,“pyramid.includes”设置指定在运行时要包含的包。在上述示例中,包含 debugtoolbar 包,以便在单击 Pyramid 徽标时激活调试面板。我们在前一节中已经了解它的作用。

我们还会看到,此应用程序中要使用的数据库的 URL 也已指定。

[server:main] 部分指定监听在 TCP 端口 6543 上的 WSGI 服务器的配置。它配置为仅监听 localhost (127.0.0.1)。

[server:main]
use = egg:waitress#main
listen = localhost:6543

其它各种与日志记录相关的部分使用 Python 的日志记录库。这些“.ini”文件部分传递给日志记录模块的配置文件配置引擎。

production.ini

当应用程序在生产模式下部署时,此文件用于提供应用程序,而不是“development.ini”。这两个文件类似。但是,“production.ini”中禁用了调试工具栏,禁用了重新加载选项,并关闭了调试选项。

下面是一个经过精简的典型“production.ini”文件版本 −

[app:main]
use = egg:testproj
pyramid.reload_templates = false
pyramid.debug_authorization = false
pyramid.debug_notfound = false
pyramid.debug_routematch = false
pyramid.default_locale_name = en
sqlalchemy.url = sqlite:///%(here)s/testproj.sqlite
retry.attempts = 3
[pshell]
setup = testproj.pshell.setup
[alembic]
script_location = testproj/alembic
file_template = %%(year)d%%(month).2d%%(day).2d_%%(rev)s
[server:main]
use = egg:waitress#main
listen = *:6543
[loggers]
keys = root, testproj, sqlalchemy, alembic
[handlers]
keys = console
[formatters]
keys = generic
[logger_root]
level = WARN
handlers = console
[logger_testproj]
level = WARN
handlers =
qualname = testproj
[logger_sqlalchemy]
level = WARN
handlers =
qualname = sqlalchemy.engine
[logger_alembic]
level = WARN
handlers =
qualname = alembic
[handler_console]
class = StreamHandler
args = (sys.stderr,)
level = NOTSET
formatter = generic
[formatter_generic]
format = %(asctime)s %(levelname)-5.5s [%(name)s:%(lineno)s][%(threadName)s] %(message)s