Python Pyramid - 命令行Pyramid



Pyramid 库有一个scripts子包,其中包含许多可用于控制和检查 Pyramid 应用的 Python 脚本。这些模块既可以作为可导入的模块使用,也可以从命令提示符使用。因此,它们通常被称为命令行脚本。

这些命令行脚本包括:

  • pserve - 用于服务使用 PasteDeploy 配置文件的 Web 应用程序。

  • pviews - 显示给定 URL 的匹配视图。

  • pshell - 交互式 Shell。

  • 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_type> - 使用指定的服务器。

  • --server-name <section_name> - 使用在配置文件中定义的指定服务器 (默认为:main)

  • --reload - 使用自动重启文件监视器。

  • -b - 在 Web 浏览器中打开服务器 URL。

应用程序在https://: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 选项启动应用程序。

pserve development.ini --reload
Starting monitor for PID 36224.
Starting server in PID 36224.
Serving on https://:6543
Serving on https://:6543

如果对项目的 .py 文件或 .ini 文件进行了任何更改,服务器将自动重启:

testproj/development.ini changed; reloading ...
Gracefully killing the server.
Starting monitor for PID 36286.
Starting server in PID 36286.
Serving on https://:6543
Serving on https://: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,并在其下方显示所有匹配的视图及其视图配置详细信息。在此示例中,只有一个视图匹配,因此只有一个 View 部分。

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”数据库中找到一个 models 表,其中包含一条记录。

Testproj

我们现在如下从 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 使用事务管理器对象 tm,该对象在pyramid_tm包中声明。为了确认添加了新记录,请将其检索回来。

>>> obj=dbsession.query(models.MyModel).get(2)
>>> obj.name
'two'

这也可以通过在 SQLite GUI 工具中实际查看数据库的 models 表来确认。

SQLite

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/
广告
© . All rights reserved.