这段时间刚着手开始研究Openstack Swift源码,为后续开发做准备。

Swift依据python WSGI规范。WSGI(Web Server Gateway Interface)是Python应用程序或框架与Web服务器之间的一种接口,定义了一套借口来实现服务器与应用端的通信规范。按照一套规范,应用端想要通信,很简单,只需要实现一个接受两个参数的,含有__call__方法并返回一个可遍历的含有零个或者多个string结果的python对象。 
而paste.deploy(Paste Deployment)是用于发现和配置WSGI server和application的系统。对WSGI应用消费者而言,它提供了一个很简单的函数loadapp()从配置文件或python EGG中加载应用。两种不同的加载方式分别对应在路径前添加“config:”和“egg:”(即URI)。 
在swift源码中,关于loadapp的调用在swift.common目录下wsgi.py文件中。

 ……
from paste.deploy import loadwsgi
……
def wrap_conf_type(f): #line no.93 in swift-havana#
def wrapper(conf_path, *args, **kwargs):
if os.path.isdir(conf_path):
conf_type = 'config_dir'
else:
conf_type = 'config'
conf_uri = '%s:%s' % (conf_type, conf_path)
return f(conf_uri, *args, **kwargs)
return wrapper appconfig = wrap_conf_type(loadwsgi.appconfig)
loadapp = wrap_conf_type(loadwsgi.loadapp)
…… def run_server(conf, logger, sock): #line no.199 in swfit-havana#
……
app = loadapp(conf['__file__'], global_conf={'log_name': log_name})
max_clients = int(conf.get('max_clients', ''))
pool = RestrictedGreenPool(size=max_clients)
try:
wsgi.server(sock, app, NullLogger(), custom_pool=pool)
except socket.error as err:
if err[0] != errno.EINVAL:
raise
pool.waitall()

如此相当于对loadwsgi模块中appconfig函数和loadapp函数进行了封装,自动在conf_path参数前添加”config:”。后在run_server()函数中调用了loadapp()函数,正式载入配置文件。

载入配置文件后,根据配置文件配置,找到相应application和middleware的入口点,加载这些应用及中间件。我们先对照着看看proxy-server的配置文件,然后在依据paste.deploy官方文档和相关资料进行详细解释。

  [DEFAULT]
# Enter these next two values if using SSL certificationscert_file = /etc/swift/cert.crt
key_file = /etc/swift/cert.key
bind_port = 8080
workers = 8
user = swift [pipeline:main]
# keep swauth in the line below if you plan to use swauth for authenticationpipeline = healthcheck cache swauth proxy-server [app:proxy-server]
use = egg:swift#proxy
allow_account_management = true [filter:swauth]
# the line below points to swauth as a separate project from swiftuse = egg:swauth#swauth
# Highly recommended to change this.super_admin_key = swauthkey [filter:healthcheck]
use = egg:swift#healthcheck [filter:cache]
use = egg:swift#memcache
memcache_servers = <PROXY_LOCAL_NET_IP>:11211

WSGI只关心那些带前缀的部分,即类似“pipeline:main”之类的。section为[type:name]格式,前缀表示section类型,后接section名称。常用的前缀分别有“composite”, “app”, “pipeline”, “filter-app”,“filter”几种。下面分别对其进行简单介绍。

1.composite,组合应用。由若干WSGI应用组成,composite为这些应用提供更高一层的分配工作。下面是一个composite section的例子。它能根据接受的http请求url中对应字段将不同HTTP请求发送给不同的应用进行处理。其中egg:Paste#urlmap指定了url解析所使用的函数——为系统自带的paste.urlmap库。

 [composite:main]
use = egg:Paste#urlmap
/ = home
/blog = blog
/wiki = wiki
/cms = config:cms.ini

2.app,声明具体的WSGI应用。应用的具体实现要在section中配置,有两种方法专门用于指出应用对应的代码:使用URI(用use标识)或 直接指向实现代码(用protocol标识)。例子如下:

 [app:myapp]
use = config:another_config_file.ini#app_name # 或任意URI:
[app:myotherapp]
use = egg:MyApp # 或指明某个模块中的可调用:
[app:mythirdapp]
use = call:my.project:myapplication # 甚至是其他的section:
[app:mylastapp]
use = myotherapp

下例的protocol paste.app_factory 是一个应用的工厂函数,指明import对象的类型;值 myapp.modulename:app_factory 指明具体加载的模块和方法。

 [app:myapp]
paste.app_factory = myapp.modulename:app_factory

3.filter,作用于WSGI应用上的函数或方法,以app为唯一的参数,并返回一个“过滤”后的app。 
4.filter-app,同样是处理应用的过滤器,写法不同。如下例,filter-app标明的“blog”表示定义的filter,而其处理的应用在next字段中指明——blogapp。

 [filter-app:blog]
use = egg:Authentication#auth
next = blogapp
roles = admin
htpasswd = /home/me/users.htpasswd

5.pipeline,便于对一个应用添加多个filter(过滤器)进行处理。在proxy-server的配置文件中即是如此,pipeline = healthcheck cache swauth proxy-server这一语句表示“proxy-server”应用需要healthcheck、cache和swauth三个过滤器的处理。将app名写在最后是pipeline section约定俗成的。

上面提到了WSGI中app和middleware。实际上wsgi 是一个 web 组件的接口规范.,wsgi将 web 组件分为三类: web服务器,web中间件(filter),web应用程序(app)。wsgi基本处理模式为 : WSGI Server -> (WSGI Middleware)* -> WSGI Application 。最开始的那一段openstack swift源码中 wsgi.server(sock, app, NullLogger(), custom_pool=pool)便是运行了一个wsgi server,它会监听指定socket接收http请求,然后根据config文件配置调用application处理并返回。

通过对这些知识的了解,成功利用wsgi规范编写了一个server,配置文件直接指定实现代码的方式(factory函数),返回简单测试信息。接下来,深入学习paste.deploy库的细节,比如app定义的具体语法规则,几种factory函数的实现细节等等。还要学习eventlet函数库,弄懂协程,对照学习webob函数库和swift中swob,学习setuptools和相应的pbr。任重道远,继续努力!

关于本文的更多参考资料: 
【1】paste.deploy python文档 
【2】网络博客–Openstack paste deploy介绍 
【3】网络博客–paste deploy

paste deploy初探的更多相关文章

  1. [原]Paste.deploy 与 WSGI, keystone 小记

    Paste.deploy 与 WSGI, keystone 小记 名词解释: Paste.deploy 是一个WSGI工具包,用于更方便的管理WSGI应用, 可以通过配置文件,将WSGI应用加载起来. ...

  2. 探索 OpenStack 之(11):cinder-api Service 启动过程分析 以及 WSGI / Paste deploy / Router 等介绍

    OpenStack 中的每一个提供 REST API Service 的组件,比如 cinder-api,nova-api 等,其实是一个 WSGI App,其主要功能是接受客户端发来的 HTTP R ...

  3. 自己使用python webob,paste.deploy,wsgi总结

    paste.deploy就是一个可以配置wsgi_app的工具,可以让服务器运行时,按照配置文件执行一系列的程序.需要使用.ini配置文件. (1)这里补充一下当时没看到的配置文件 1.[app:ma ...

  4. 如何使用Paste.Deploy

    转自:http://bingotree.cn/?p=100 1.Paste Deploy的一个组件,但是并不依赖于Paste的其它组件.其可以看成是一个独立的包.其主要用于通过一个配置文件完成WSGI ...

  5. Python Paste.deploy 笔记

    首先python paste是一个WSGI工具包,在WSGI的基础上包装了几层,让应用管理和实现变得方便.说实话,Python Paste的文档做的真差劲!加之python代码可读性本来就不怎么滴,真 ...

  6. 详解Paste deploy

    原创作品,转载注明本文出处:http://www.cnblogs.com/Security-Darren/p/4087587.html 谈到WSGI,就免不了要了解paste,其中paste depl ...

  7. keystone源码分析(一)——Paste Deploy的应用

    本keystone源码分析系列基于Juno版Keystone,于2014年10月16日随Juno版OpenStack发布. Keystone作为OpenStack中的身份管理与授权模块,主要实现系统用 ...

  8. how to read openstack code : paste deploy

    本篇分为以下几个部分 paste 是什么 怎样使用paste paste of neutron paste 是什么 WSGI 是python 中application 和 web server互通的标 ...

  9. WSGI框架及Paste+Pastedeploy+route+webob开发

    一.前言 WSGI服务器 一个Web服务器网关接口 (WSGI)服务器实现了WSGI接口的Web服务器端运行的Python的Web应用程序. 为什么需要WSGI? 传统的Web服务器不理解或有任何方式 ...

随机推荐

  1. [Swift通天遁地]三、手势与图表-(7)创建饼形图表并导出图表为PNG图片

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  2. 微信小程序后台获取用户的opeid

    1.微信小程序后台获取登录用户的openid,首先微信小程序将code传给后台服务器 wx.login({ success: function (res) { var code = res.code ...

  3. CTSC+APIO+THUACM游记

    退役之前,写点破事乐呵乐呵.. (同DaD3zZ) CTSC Day0 来到丽都 哈哈哈这可是四星级豪华酒店啊   想想要在这住7天  美滋滋 换了半天的房间 也没有换到一起   最后yzy& ...

  4. 使用Quartz2.2.3做持久化,启动程序后,控制台报错问题

    该错误是由mysql-connector-java.jar版本太低导致. MLog clients using log4j logging. Initializing c3p0-0.9.1.1 [bu ...

  5. Lua相关回调总结【转】

    原文 http://www.zaojiahua.com/lua-callback-functions.html 最近做一个小项目,是用Lua写的,中间用到了很多的回调,基本Cocos中的那几种常用回调 ...

  6. Android 微信分享图片

    "; //微信 APPID private IWXAPI iwxapi; private void regToWx() { iwxapi = WXAPIFactory.createWXAPI ...

  7. [Windows Server 2008] 安装Apache+PHP+MySQL

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:Win2008 ...

  8. vue项目中使用百度地图的方法

    1.在百度地图申请密钥: http://lbsyun.baidu.com/  将 <script type="text/javascript" src="http: ...

  9. windows设置右键菜单

    1. 打开注册表,(win + R,输入regedit) 2. 在 HKEY_CLASSES_ROOT\Directory\Background\shell 中,新建项:如(cmder),在 cmde ...

  10. 关于JS闭包的一点理解

    通常来讲,闭包通常是指函数内部可以访问到外部作用域的一个过程. 一.广义的定义:任何函数都产生了闭包. 二.狭义的定义:函数内部能访问到其他变量函数的作用域. 我们来看个例子 var a = 10; ...