pyramid框架学习之(一)——搭建第一个pyramid应用
0.前言
来自:http://blog.****.net/qq_25362095/article/details/76537976
此文主要是用于记录从0开始学习pyramid框架的过程,文章内容来源于英文官方文档的翻译,附上官网链接https://docs.pylonsproject.org/projects/pyramid/en/latest/index.html。
1.安装
在你安装pyramid之前
Pyramid的安装需要使用pip和 setuptools工具,python2>2.7.9以及python3>3.4的版本已经内置了pip和setuptools工具包,如果你对项目的python版本没有特别要求,强烈建议使用最新的python版本,会为你省去不少麻烦。如果你使用的是旧版的python,则需要先使用二进制文件或其他方式安装setuptools,pip。
为你的操作系统安装Python2.7,Python3.4或更高的版本,并确保相关的其他包都被安装(Requirements for Installing Packages)(当前的Pyramid 1.9.1版本,已经在Python2.7,python 3.4,3.5,3.6以及PyPy环境通过测试)
Pyramid框架可以运行在所有主流的UNIX风格的操作系统上,比如Linux,Mac OS X,FreeBSD等,也可以运行在windows平台以及PyPy(1.9+)之上.
在Unix类系统上安装pyramid
当你的操作系统已经包含了python并且装好了pip时,安装pyramid变得非常简单
建立python虚拟环境(不建立亦可,为了防止不同版本python间问题):
pip install virtualenv
virtualenv <DIR>
source <DIR>/bin/activate使用
pip install “pyramid==1.9.1”
来安装pyramid
2.建立你的第一个pyramid项目
在这一节中,我们会演示建立一个最轻量级别的Pyramid应用。在我们完成创建应用之后,我们会从细节上解释它是如何工作的。这部分文档建立在你已经安装好Pyramid的基础之上。
Hello World
以下是一个最简单的Pyramid应用:
我们将这段代码写入一个名为helloworld.py的Python脚本文件并且使用一个已经安装了pyramid的python编译器执行这个文件之后,一个HTTP服务就已经在TCP协议的8080端口上启动了。
在UNIX上: python helloworld.py
这个指令不会有任何的返回并且控制台不会有任何的输出。当我们在一个浏览器上访问hostname:8080/hello/world
地址,服务器会简单的返回一个“Hello world!”.如果你的应用是在你的本地环境运行,在你的浏览器内的地址栏输入http://localhost:8080/hello/world即可显示这个结果。
每次你通过浏览器访问一个该应用的URL地址时,一条记录了主机名,日期,请求方法和路径,以及一些额外信息的日志就会被输出出到控制台。这些日志输出是通过搭载了我们的应用的wsgiref服务器输出的。它的输出形式结合了Apache的日志输出和控制台的日志输出方式。
通过快捷键Ctrl+C可以停止这个应用。
到此,我们已经对这个应用有了初步的了解,下面,我们一步一步来详细解释这段代码。
导入依赖
上面的helloworld.py脚本使用了下面几条导入依赖的声明:
这个脚本从pyramid.config模块导入了Configurator类。一个Configurator类的实例在后面的代码中会被用来配置你的pyramid应用。
像很多其他的Python web框架一样,Pyramid使用了WSGI 网关协议来将web服务器和应用连接在一起。在这个例子中,wsgiref 服务器模块被用来很方便的启用WSGI服务,整合各模块也是被Python标准库所支持的。
这个例子中还导入了pyramid.response.Response 类。一个这个类的实例将被用来创建一个web响应。
视图调用声明
上面的例子中,在导入依赖的部分之下,定义了一个叫hello_world的函数。
这个函数接收一个请求参数(request)并且他返回一个pyramid.response.Response类的实例。这个请求参数是由URL的参数匹配得到的字符串。在这个例子中,这个值被作为响应的body部分返回了。
这个函数就是视图的调用(view callable)。一个view callable函数接收一个request参数. 它被期望能够返回一个response对象。view callable不一定是一个函数,也可以是一个类或者一个实例。但是在这个例子里,一个函数形式的view callable是最适合我们的。
view callable也经常被称作一个request请求对象,它可以解释为通过一个运行的wsgi服务器向pyramid发送的HTTP请求的表述信息(如request请求方式cookie等)。即包含了request请求信息的一个对象。
view callable需要返回一个response对象因为response对象包含了所有能够发起一个http response的所有必要信息。这个对象会被WSGI服务器转换成文本的形式来调用Pyramid并最终用于真正去响应我们的浏览器。为了返回一个reponse对象,每个view callable创建了一个response类的实例。
应用配置
在上面的例子中,下面的代码表示对这个简单的应用进行配置。这个应用在一个if代码块中,通过事先导入的类以及函数声明来进行配置。
让我们一步步的解析它。
配置器结构
上面代码里的这个if代码块(__name__ == '__main__'
) 是一种python的约定俗成的写法:只有当包含这块代码的脚本是被系统命令行直接运行的,这个if块中的代码才会被调用,否则它将不会执行。举例来说,如果helloworld.py脚本包含了全部的if代码块,只有python helloworld.py这条指令是从命令行执行的,这个if代码块的内容才会被执行。
使用这个if代码块是必要的,或者说是一种最佳实践,这是因为在python中,.Py文件可能作为模块会被其他的.py文件所导入引用声明。使用__name__== __main__
的if代码块可以保证脚本作为模块被加载进其他脚本的时候代码块中的内容不会被执行,仅当它被直接被执行时才会生效。
第二行的with Congiurator() as config:
使用上下文环境(context manager)创建了一个Configurator 类的实例对象config。
后面的代码都是使用这个config实例对象来调用Configurator类中的方法来进行Pyramid应用的配置。对Configurator()构造函数的调用将会对应用进行应用注册(由金字塔提供的配置信息的注册表,并为应用程序提供服务。应用程序注册表将资源类型映射到视图,以及其他特定于应用程序的组件注册。每个金字塔应用程序都有且仅有一个应用程序注册表。)。
添加配置属性
上面的第一行调用了Configurator类中的add_route方法,顾名思义,用于添加了一个匹配“/hello/”URL地址的路由,这个url地址由/hello/和一个字符串组成。
第二行将hello_world方法注册成为一个view callable ,它保证了当hello路由匹配时,hello_world方法会被调用。
建立WSGI 应用
完成了视图的配置部分后,脚本通过Configurator类的make_wsgi_app()创建了一个WSGI应用。这个方法的调用必须是在所有的配置完成之后,并使得所有的配置生效。这个方法会返回一个WSGI应用的对象,这个对象可以被用于任何WSGI服务器来实现和Python web 应用的通信。我们不在这里深入的讨论WSGI的内容,如果你感兴趣,可以在它的文档中机继续深入https://wsgi.readthedocs.io/en/latest/
这个应用对象,实际上也是一个包含了Pyramid路由信息的类的实例。它引用了应用程序的注册表,这里的应用程序注册表是由configurator构造函数调用生成的。前面说到过注册表包含了路由的映射关系,路由器将会查询注册表,以决定应用以何种策略对应每一跳路由(对应到每个url请求)。这里的策略是前面的config实例调用的配置方法完成的。在我们的示例中,add_view和add_route方法在调用时都没有设置策略,使用的默认的策略属性。
启动WSGI 应用
最后,我们终于可以通过·WSGI服务器启动我们的应用了。我们使用了wsgiref中的make_server方法来配置服务器,这里的‘0.0.0.0’表示监听所有的TCPip地址.默认情况下,http服务器将会监听127.0.0.1本地端口,这会导致你通过远程访问应用时出现问题。同时我们也规定了8080端口作为第二个参数,最后一个参数便是app对象(同时也是路由对象),它我们希望启动服务的应用对象。最后,我们调用了服务器的serve_forever方法,它会进入等待赖在外界的http请求的循环。
当这2行代码被调用时,服务器会监听8080端口所有请求。服务器将会一直运行直到我们通过ctrl+C手动将它停止。
结论
以上是一个最简单的hello_world应用,它被以命令式形式配置的。后文会介绍命令式及声明式配置的区别。