创建您的第一个 Pyramid 应用

在这一章中,我们将介绍 Pyramid 应用。在我们完成创建应用程序之后,我们将更详细地解释它是如何工作的。它假设你已经 Pyramid 安装。如果你不去,就去 安装 Pyramid 部分。

你好世界

这是最简单的 Pyramid 应用:

 1from wsgiref.simple_server import make_server
 2from pyramid.config import Configurator
 3from pyramid.response import Response
 4
 5
 6def hello_world(request):
 7    return Response('Hello World!')
 8
 9
10if __name__ == '__main__':
11    with Configurator() as config:
12        config.add_route('hello', '/')
13        config.add_view(hello_world, route_name='hello')
14        app = config.make_wsgi_app()
15    server = make_server('0.0.0.0', 6543, app)
16    server.serve_forever()

将此代码插入名为 helloworld.py 并由具有 Pyramid 软件已安装,HTTP服务器在TCP端口6543上启动。

在UNIX上:

$VENV/bin/python helloworld.py

在Windows上:

%VENV%\Scripts\python helloworld.py

此命令不会返回,也不会向控制台打印任何内容。当URL上的浏览器访问端口6543时 / ,服务器将只提供文本“hello world!”。如果应用程序正在本地系统上运行,请使用 http://localhost:6543/ 在浏览器中将显示此结果。

每次在浏览器中访问应用程序提供的URL时,都会向控制台发出一条日志记录行,其中显示主机名、日期、请求方法和路径以及一些附加信息。这个输出是由我们用来服务这个应用程序的wsgiref服务器完成的。它将Apache组合日志格式的“访问日志”记录到控制台。

出版社 Ctrl-C (或) Ctrl-Break 在Windows上)停止应用程序。

既然我们已经对应用程序的功能有了初步的了解,那么让我们逐个检查它。

进口

以上 helloworld.py 脚本使用以下导入语句集:

1from wsgiref.simple_server import make_server
2from pyramid.config import Configurator
3from pyramid.response import Response

像许多其他的python web框架一样, Pyramid 使用 WSGI 将应用程序和Web服务器连接在一起的协议。这个 wsgiref 在本例中,为了方便起见,将服务器用作wsgi服务器,因为它是在Python标准库中提供的。

脚本导入 Configurator 类从 pyramid.config 模块。的实例 Configurator 类稍后用于配置 Pyramid 应用。

脚本还导入 pyramid.response.Response 类供以后使用。此类的实例将用于创建Web响应。

查看可调用声明

上面的脚本在其导入集的下面定义了一个名为 hello_world .

6def hello_world(request):
7    return Response('Hello World!')

函数接受单个参数 (request )它返回 pyramid.response.Response 班级。类的构造函数的单个参数是一个字符串,该字符串是根据与URL匹配的参数计算得出的。该值将成为响应的主体。

此函数称为 view callable . 可调用视图接受单个参数, request . 它将返回 response 对象。视图可调用不需要是一个函数;它可以通过另一种类型的对象(如类或实例)来表示,但就我们这里的目的而言,函数很好地为我们服务。

始终使用 request 对象。请求对象是发送到的HTTP请求的表示形式 Pyramid 通过活动 WSGI 服务器。

需要一个可调用视图才能返回 response 对象,因为响应对象具有制定实际HTTP响应所需的所有信息;然后通过 WSGI 称为金字塔的服务器,并将其发送回请求的浏览器。要返回响应,每个视图可调用创建 Response 班级。在 hello_world 函数,字符串作为主体传递给响应。

应用程序配置

在上面的脚本中,以下代码表示 配置 这个简单的应用程序。应用程序是使用先前定义的导入和函数定义配置的,这些导入和函数定义位于 if 声明:

10if __name__ == '__main__':
11    with Configurator() as config:
12        config.add_route('hello', '/')
13        config.add_view(hello_world, route_name='hello')
14        app = config.make_wsgi_app()
15    server = make_server('0.0.0.0', 6543, app)
16    server.serve_forever()

让我们把这个一块一块地拆下来。

配置器结构

10if __name__ == '__main__':
11    with Configurator() as config:

这个 if __name__ == '__main__': 上面代码示例中的行表示一个python习惯用法:除非包含此代码的脚本直接从操作系统命令行运行,否则不会调用if子句中的代码。例如,如果文件名为 helloworld.py 包含整个脚本正文,其中的代码 if 只有在以下情况下才会调用语句 python helloworld.py 从命令行执行。

使用 if 子句是必需的,或者至少是最佳实践,因为Python中的代码 .py 文件可能最终通过python导入 import 其他人的陈述 .py 文件。 .py 由其他人导入的文件 .py 文件被称为 模块 . 通过使用 if __name__ == '__main__': 成语,上面的脚本表示它不希望代码在 if 如果此模块是从另一个模块导入的,则要执行的语句;中的代码 if 只应在直接执行脚本期间运行块。

这个 with Configurator() as config: 上面的一行创建 Configurator 类使用 context manager . 结果 config 对象表示脚本用于配置此特定的API Pyramid 应用。对配置器调用的方法将导致在 application registry 与应用程序关联。

正在添加配置

12        config.add_route('hello', '/')
13        config.add_view(hello_world, route_name='hello')

上面的第一行调用 pyramid.config.Configurator.add_route() 方法,其中注册了 route 扎根 (/ )URL路径。

第二行记录 hello_world 作为一个函数 view callable 并确保在 hello 路线匹配。

WSGi应用程序创建

14        app = config.make_wsgi_app()

在配置视图和结束配置之后,脚本将创建一个wsgi 应用 通过 pyramid.config.Configurator.make_wsgi_app() 方法。对…的呼唤 make_wsgi_app 意味着所有配置都已完成(意味着对配置器的所有方法调用(配置器设置视图和各种其他配置设置)都已执行)。这个 make_wsgi_app 方法返回 WSGI 任何wsgi服务器都可以使用应用程序对象向请求者呈现应用程序。 WSGI 是一种允许服务器与Python应用程序通信的协议。我们不讨论 WSGI 在这本书的任何深度,但你可以通过阅读 documentation .

这个 Pyramid 尤其是应用程序对象是表示 Pyramid router . 它引用了 application registry 这是对用于配置它的配置器的方法调用的结果。这个 router 查询注册表以遵守单个应用程序所做的策略选择。这些策略选择是通过调用 Configurator 在我们的案例中,唯一的政策选择是通过调用 add_viewadd_route 方法。

WSGi应用程序服务

15    server = make_server('0.0.0.0', 6543, app)
16    server.serve_forever()

最后,我们实际上通过启动一个WSGi服务器为请求者提供应用程序服务。我们碰巧使用 wsgiref make_server 服务器制造商。我们把第一个论点传了进来。 '0.0.0.0' 这意味着“监听所有TCP接口”。默认情况下,HTTP服务器只在 127.0.0.1 接口,如果您在远程系统上运行服务器,并且希望通过本地系统的Web浏览器访问该服务器,则会出现问题。我们还指定了一个要监听的TCP端口号,它是6543,作为第二个参数传递它。最后的论点是 app 对象(A) router ,这是我们希望提供的应用程序。最后,我们调用服务器的 serve_forever 方法,它启动主循环,在主循环中等待来自外部世界的请求。

当调用该行时,它会导致服务器开始监听TCP端口6543。服务器将永久地服务请求,或者至少直到我们通过终止运行它的进程(通常通过按 Ctrl-CCtrl-Break 在终端,我们用来启动它)。

结论

我们的Hello World应用程序是最简单的应用程序之一 Pyramid 应用程序,配置为“强制”。我们可以看到它是强制配置的,因为在执行配置任务时,我们可以使用Python的全部功能。

工具书类

有关a的API的详细信息 Configurator 对象,参见 Configurator .

有关的详细信息 view configuration查看配置 .