Python Pyramid 命令行Pyramid
Pyramid库有一个 脚本 子包,它包含了一些Python脚本,可用于控制和检查Pyramid应用程序。这些模块既可以作为一个可导入的模块使用,也可以从命令提示符中使用。因此,它们通常被称为命令行脚本。
这些命令行脚本是–
- pserve – 为使用PasteDeploy配置文件的Web应用程序服务。
-
pviews – 显示给定URL的匹配视图。
-
pshell – 交互式外壳。
-
proutes – 显示所有应用程序的路由。
-
ptweens – 显示 “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-name
- **使用配置文件中定义的命名的服务器(默认:main -
--reload — 使用自动重启文件监视器。
-
-- b — 打开一个网页浏览器到服务器的网址。
该应用程序在 http://localhost:6543 ,在这种情况下,访问被限制,只有在同一台机器上运行的浏览器。如果你想让其他机器在同一网络上运行,那么编辑 “development.ini “文件,并替换[server:main]部分的listen值,如下所示
[server:main]
use = egg:waitress#main
listen = *:6543
设置*:6543相当于0.0.0.0:6543 [:]:6543,因此,应用程序会对你的系统所拥有的所有IP地址的请求做出响应,而不仅仅是对localhost的请求。
pserve 命令行中的–reload选项使应用程序在运行代码被修改时自动被重新加载。
用 --reload选项 启动应用程序。
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文件来测试views命令。
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提示下与Pyramid应用程序的环境进行交互成为可能。这个shell使用PasteDeploy的配置文件,即development.ini作为命令行参数(像其他Pyramid脚本一样),并打开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>
甚至可以借助models.py中声明的SQLAlchemy模型与数据库进行交互。
当我们第一次完成cookiecutter的步骤时,应用程序的数据库在一开始就被初始化。我们在 “testproj.sqlite “数据库中找到一个模型表,里面有一条记录。
现在我们从Python提示符中访问这个表,如下所示
>>> m=models.MyModel
>>> obj=dbsession.query(m).get(1)
>>> obj
<testproj.models.mymodel.MyModel object at 0x0000020E9FD96DA0>
>>> obj.name
'one'
让我们在模型表中添加一条新的行。首先声明一个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工具中实际查看数据库的模型表来确认。
prequest
prequest工具让你在不实际启动服务器的情况下测试一个URL模式的响应。该命令需要配置文件和URL路径作为命令行参数。例如 –
Env>prequest development.ini /
该命令产生了我们前面看到的Cookiecutter主页的原始HTML响应。
有几个命令行开关可以使用。-d选项显示服务器返回的状态和头文件。要覆盖默认的GET请求方式,我们可以使用-m选项。
脚本
这个命令行Pyramid脚本显示所有添加到你的应用程序注册表的路由。它只接受一个参数,即配置文件(development.ini)。
以下是testproj包的路由配置,由proutes命令显示 –
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/