WSGI服务的相关相关基础只是前面已经介绍,而且Paste模块也有所介绍。现在就一步一步实现paste模块的每个功能。
一、知识点讲解
1、为什么需要 PasteDeploy 模块? 一个 WSGI服务 的核心部分,是它的应用程序。如果WSGI服务的应用程序修改了,那么WSGI相应
的功能也就改变了。
2、通过配置文件来配置 WSGI 服务的应用程序,当需要对WSGI服务的应用程序进行修改(需要添加或删除某个功能模块)时,只需要简
单的修改下配置文件,而不需要修改 WSGI 的代码。
3、利用PasteDeploy来定制WSGI服务,大大增强了WSGI服务的伸缩性。
4、PasteDeploy定义的几类部件:
app(应用程序):WSGI服务的核心部分,用于实现WSGI服务的主要逻辑
app是一个callable object,接受的参数(environ,start_response),这是paste系统交给application的,符合
WSGI规范的参数. app需要完成的任务是响应envrion中的请求,准备好响应头和消息体,然后交给start_response
处理,并返回响应消息体。
filter(过滤器):一般用于一些准备性的工作,例如验证用户身份、准备服务器环境等。在一个filter执行完之后,可以直接返
回,也可以交给下一个filter或者app继续执行。
filter是一个callable object,其唯一参数是(app),这是WSGI的application对象,filter需要完成的
工作是将application包装成另一个application(“过滤”),并返回这个包装后的application。
pipeline(管道):由若干个filter和1个app组成。通过pipeline,可以很容易定制WSGI服务
composite(复合体):用于实现复杂的应用程序,可以进行分支选择。例如:根据不同的URL调用不同的处理程序
- app_factory是一个callable object,其接受的参数是一些关于application的配置信息:(global_conf,**kwargs),
global_conf是在ini文件中default section中定义的一系列key-value对,而**kwargs,即一些本地配置,是在ini文件中,
app:xxx section中定义的一系列key-value对。app_factory返回值是一个application对象
- filter_factory是一个callable object,其接受的参数是一系列关于filter的配置信息:(global_conf,**kwargs),
global_conf是在ini文件中default section中定义的一系列key-value对,而**kwargs,即一些本地配置,是在ini文件中,
filter:xxx section中定义的一系列key-value对。filter_factory返回一个filter对象
5、几点说明
(1)、一个配置文件有不同的段。Paste Deploy只关心前缀部分,例如(app:main、filter:error)中的app、filter。 ":"前面是类
型,后面是段的名字。 配置文件是一个简单的INI格式的文件(name=value)。
通常,配置文件中至少有1个或2个段。main段:[app:main]应用程序段,[server:main]服务器配置段
(2) [composite:...]表示将请求分发到不同的程序中去。 use = egg:Paste#urlmap 使用urlmap程序(Paste package中的
composite application)。 urlmap使用路径前缀将请求映射到另一个程序。
[app:hydrant]
paste.app_factory = hydrant:app_factory
in_arg = water
[app:tap]
paste.app_factory = tap:app_factory
in_arg = water
[app:shower]
paste.app_factory = shower:app_factory
in_arg = hot_water
[app:drinking_fountain]
paste.app_factory = drinking_fountain:app_factory
in_arg = pure_water
[filter:purifier]
paste.filter_app_factory = purifier:filter_app_factory
in_arg = water
[filter:boiler]
paste.filter_app_factory = boiler:filter_app_factory
in_arg = water
[pipeline:pip_to_shower]
pipeline = boiler shower
[pipeline:pip_to_drinking_fountain]
pipeline = purifier drinking_fountain
[composite:valve]
use = egg:Paste#urlmap
/hydrant = hydrant
/tap = tap
/boil/shower = pip_to_shower
/purifier/drinking_fountain = pip_to_drinking_fountain
[composite:main]
use = egg:Paste#urlmap
/master_valve: valve
PasteDeploy模块最重要的是理清配置文件模块之间的关系,代码实现都是套路,很容易实现。
二、代码实现
配置文件:configure.ini
[app:main]
paste.app_factory = wsgi_paste:app_factory
:前面是类型,后面是段名。指定main应用程序对应的工厂方法,该工厂方法必须返回一个方法的实例,该方法便是处理WSGI服务
HTTP请求的应用程序。
应用程序:wsgi_paste.py :在configure.ini文件中引用wsgi_paste包,其实就是自定义的wsgi_paste.py文件。
from webob import Request,Response
from webob.dec import wsgify
from paste.deploy import loadapp
from wsgiref.simple_server import make_server
import os
@wsgify #应用程序
def application(req):
return Response('hello world!\n')
#应用程序工厂方法
def app_factory(global_config, **local_config):
return application
if __name__ == '__main__':
configname = 'api-paste.ini' #配置文件
appname = 'main'
print 'listen on 8000...'
wsgi_app = loadapp('config:%s' % os.path.abspath(configname), appname) #绝对路径
httpd = make_server('127.0.0.1', 8000, wsgi_app)
httpd.serve_forever()
定义configure.ini文件中引用的app_factory方法。直接返回application方法的实例。调用loadapp方法加载应用程序。
在一个api-paste.ini文件中,可以定义多个部件。
默认情况下,loadapp方法会把名为main的部件作为应用程序的入口。
输出结果:
另一个终端使用curl命令发送HTTP请求:
今天学习到这里了,回去睡觉!