Python Pyramid 项目结构
如前所述,外部testproj文件夹包含testproj和test包。此外,它还有其他用于描述、运行和测试应用程序的文件。这些文件包括:
- MANIFEST.in 包含要包含在软件包源代码分发中的文件列表。
- development.ini 是一个PasteDeploy配置文件,可用于在开发期间执行应用程序。
- production.ini 是PasteDeploy配置文件,可用于在生产环境配置中执行应用程序。
- pytest.ini 是用于运行测试的配置文件。
- setup.py 是标准的Setuptools setup.py文件,用于测试和分发应用程序。
- testing.ini 是用于执行应用程序测试的配置文件。
“.ini”文件是Cookiecutter实用程序用于生成金字塔应用程序结构的配置。这些文件使用的是Ian Bicking开发的PasteDeploy系统。该库与Pyramid一起自动安装。
尽管可以在没有PasteDeploy支持的情况下开发金字塔应用程序,但它提供了一种启动、调试和测试应用程序的标准化方法。
预定义的设置从配置文件中读取(扩展名为.ini)。这些文件主要包含应用程序配置设置、服务器设置和日志记录设置。
development.ini
如前所述,使用Cookiecutter构建的金字塔应用程序可以通过以下命令调用 −
pserve development.ini
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应用程序对象 main 的名称。它在 textproj 包的 init.py 文件中声明(在 testproj 项目文件夹内)。此部分包含其他启动时配置设置。
例如,”pyramid.includes” 设置指定要在运行时包含的软件包。在上面的示例中,包含了 debugtoolbar 包,以便在点击 Pyramid logo 时激活调试面板。我们在之前的章节中已经看到了它的功能。
我们还可以看到在此应用程序中要使用的数据库的URL也已经指定。
[server:main]
部分指定了在TCP端口6543上监听的WSGI服务器的配置。它只配置为仅监听本地主机(127.0.0.1)。
[server:main]
use = egg:waitress#main
listen = localhost:6543
其他各种与日志记录相关的部分都使用Python的logging库。这些“.ini”文件部分会被传递给logging模块的配置文件配置引擎。
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