11.2.2、搭建RESTful API之使用PasteDeploy定制WSGI服务

来源:互联网 发布:xperia软件修复 初始化 编辑:程序博客网 时间:2024/05/16 17:33

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,Responsefrom webob.dec import wsgifyfrom paste.deploy import loadappfrom wsgiref.simple_server import make_serverimport os@wsgify      #应用程序def application(req):    return Response('hello world!\n')#应用程序工厂方法def app_factory(global_config, **local_config):    return applicationif __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请求:



今天学习到这里了,回去睡觉!

0 0
原创粉丝点击