Python Pyramid 简明教程
Python Pyramid - Command Line Pyramid
Pyramid 库有一个 scripts 子包,它包含许多 Python 脚本,这些脚本可用于控制和检查 Pyramid 应用程序。这些模块既可以用作可导入模块,也可用于命令提示符。因此,它们通常被称为命令行脚本。
这些命令行脚本是-
-
pserve − 提供一个使用 PasteDeploy 配置文件 Web 应用程序。
-
pviews − 为给定 URL 显示匹配的视图。
-
pshell − 交互式 Shell。
-
proutes − 显示所有应用程序路由。
-
ptweens − Displaying "Tweens".
-
prequest − 调用请求。
-
pdistreport − 显示所有已安装的发行版及其版本。
所有这些命令行脚本都使用 PasteDeploy 配置文件 (development.ini)。
pserve
这是最重要的脚本。在“development.ini”[app:main] 部分配置的 Pyramid 应用程序借助所选服务器(Waitress)和提到的主机和端口(localhost:6543)提供服务。
假设 Pyramid 项目 (testproj) 在 Pyramid 虚拟环境中创建在同名的文件夹中,以下命令开始侦听传入的浏览器请求-
Env>..\scripts\pserve development.ini
pserve 模块(以及其他 Pyramid 命令行脚本)可以用作命令提示符中 Python 解释器的参数运行。
Env>python -m pyramid.scripts.pserve development.ini
Starting server in PID 1716.
2022-06-23 14:13:51,492 INFO [waitress:485][MainThread] Serving on http://[::1]:6543
2022-06-23 14:13:51,492 INFO [waitress:485][MainThread] Serving on http://127.0.0.1:6543
为使 pserve 实用程序更灵活,可以使用以下命令行参数-
-
config_uri − 配置文件的 URI。
-
-n <name> − 加载命名应用程序(默认的 main)。
-
-s <server_type> − 使用命名的服务器。
-
--server-name <section_name> − 使用在配置文件中定义的已命名服务器(默认值:main)
-
--reload − 使用自动重启文件监视器。
-
-b − 打开一个网络浏览器到服务器 url。
应用程序提供于 http://localhost:6543 的情况下,访问将受到限制,以致于只有运行在同一机器上的浏览器才能访问。如果您允许网络上其他机器访问,请编辑“development.ini”文件,然后像下面所示替换 [server:main] 部分中的侦听值 −
[server:main]
use = egg:waitress#main
listen = *:6543
设置 *:6543 等于 0.0.0.0:6543 [::]:6543,结果,应用程序响应系统拥有的所有 IP 地址上的请求,而不仅仅是响应 localhost 的请求。
pserve 命令行中的 --reload 选项会在运行代码修改时自动重新加载应用程序。
使用 --reload option. 启动应用程序
pserve development.ini --reload
Starting monitor for PID 36224.
Starting server in PID 36224.
Serving on http://localhost:6543
Serving on http://localhost:6543
如果对项目的 .py 文件或 .ini 文件进行了任何更改,服务器会自动重启 −
testproj/development.ini changed; reloading ...
Gracefully killing the server.
Starting monitor for PID 36286.
Starting server in PID 36286.
Serving on http://localhost:6543
Serving on http://localhost:6543
pviews
pviews 命令行脚本用在命令终端窗口中,为给定 URL 匹配的路由和视图打印摘要。 pviews 命令接受两个参数。第一个参数是应用程序的“ini”文件和内置节的路径。格式应为 config_file#section_name (默认值为 main)。第二个参数是要测试匹配视图的 URL。
让我们在先前使用 Cookiecutter 构建的 testproj 项目中使用 development.ini 文件执行 pviews 命令。
Env>..\scripts\pviews development.ini /
URL = /
context: <pyramid.traversal.DefaultRootFactory object at 0x000001DD39BF1DE0>
view name:
Route:
------
route name: home
route pattern: /
route path: /
subpath:
View:
-----
testproj.views.default.my_view
输出显示请求的 URL,其下方显示所有匹配的视图及其视图配置详细信息。此示例中只有一个视图匹配,因此只有一个视图部分。
pshell
pshell 脚本使得可以用 Python 提示符与金字塔应用程序的环境进行交互。此 shell 使用 PasteDeploy 配置文件(如 development.ini)作为命令行参数(类似于其他金字塔脚本),并打开 Python 交互式 shell。
Env>..\scripts\pshell development.ini
Python 3.10.1 (tags/v3.10.1:2cd268a, Dec 6 2021, 19:10:37) [MSC v.1929 64 bit (AMD64)] on win32
Type "help" for more information.
Environment:
app The WSGI application.
dbsession <sqlalchemy.orm.session.Session object at 0x0000020E9F1452D0>
models <module 'testproj.models' from 'f:\\pyram-env\\testproj\\testproj\\models\\__init__.py'>
registry Active Pyramid registry.
request Active request object.
root Root of the default resource tree.
root_factory Default root factory used to create `root`.
tm Single-thread implementation of `~transaction.interfaces.ITransactionManager`.
>>>
脚本将读取配置,并将其声明的对象作为 Python 对象用于交互。我们能够检查 Python 提示符中的其行为。
>>> root
<pyramid.traversal.DefaultRootFactory object at 0x0000020E9E2507F0>
>>> registry
<Registry testproj>
将注册表设置从“development.ini”读入词典。我们可以使用 for 循环遍历其内容 −
>>> for k,v in registry.settings.items():
... print (k,":",v)
...
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:///…\testproj/testproj.sqlite
retry.attempts : 3
tm.manager_hook : <function explicit_manager at 0x000001D9E64E4550>
甚至有可能借助模型中的 SQLAlchemy 模块与数据库进行交互。
当我们首次完成 cookiecutter 步骤时,应用程序数据库最初被初始化。我们在“testproj.sqlite”数据库中发现一个 models 表格,其中有一个记录。
现在我们按照以下内容从 Python 提示符访问此表格 −
>>> m=models.MyModel
>>> obj=dbsession.query(m).get(1)
>>> obj
<testproj.models.mymodel.MyModel object at 0x0000020E9FD96DA0>
>>> obj.name
'one'
现在我们在 models 表中添加一行。首先声明一个 MyModel 类的对象,并将它添加到 dbsession 中。
>>> tm.begin()
>>> obj=models.MyModel(id=2, name='two', value=2)
>>> dbsession.add(obj)
>>> tm.commit()
Pyramid 使用在 pyramid_tm 包中声明的事务管理器对象 tm。要确认新记录已添加,请检索它。
>>> obj=dbsession.query(models.MyModel).get(2)
>>> obj.name
'two'
这也可以通过在 SQLite GUI 工具中实际查看数据库的 models 表来确认。
prequest
prequest 实用工具可让你测试 URL 模式的响应,而无需实际启动服务器。命令需要配置文件和 URL 路径作为命令行参数。例如 −
Env>prequest development.ini /
该命令会生成我们之前看到的 Cookiecutter 主页的原始 HTML 响应。
可以使用一些命令行开关。-d 选项显示服务器返回的状态和标题。要覆盖默认的 GET 请求方法,我们可以使用 -m 选项。
proutes
此命令行 Pyramid 脚本显示所有已添加到你应用程序注册表中的路由。它只接受一个参数,即配置文件 (development.ini)
proutes 命令会显示 testproj 包的以下路由配置 −
Env>proutes development.ini
Name Pattern View
---- ------- ----
__static/ /static/*subpath testproj:static/
home / testproj.views.default.my_view
debugtoolbar /_debug_toolbar/*subpath <unknown>
__/_debug_toolbar/static/ /_debug_toolbar/static/*subpath pyramid_debugtoolbar:static/