Openstack Paste.ini 文件详解
目录
paste.ini 配置文件详解
paste.ini 文件的格式类似于INI格式,每个 Section 的格式均为 [type:name]。 
这里重要的是理解几种不同 type 的 Section 的作用:
composite
[composite:main]
use = egg:Paste#urlmap
/v2.0 = public_api
/v3 = api_v3
/ = public_version_api
[composite:admin]
use = egg:Paste#urlmap
/v2.0 = admin_api
/v3 = api_v3
/ = admin_version_apicomposite section:Request 进来后第一个通过的 Section,表示需要将一个 HTTP URL Request 调度到一个或者多种 Application 上。
- paste.ini 中有两种类型的 - [composite:main|admin]。Request 会通过哪一个 composite 由请求 URL 的端口或者 name 参数来决定,下面会有介绍。
- use:是一个关键字,指定处理请求的代码,这里表示我们使用 Paste egg包中 urlmap 来实现 composite 请求分发方式。 ==> 决定请求的分发方式为 urlmap(urlmap 算是一个通用的请求分发程序) 
- /v2.0 /v3 /:是 urlmap 进行分发时,需要使用到的参数。 URL为 /v3 开头的请求会路由给 pipeline api_v3 处理(也可以直接是一个 app section) 
 egg 是 python 的一个包
pipeline
[pipeline:api_v3]
# The last item in this pipeline must be service_v3 or an equivalent
# application. It cannot be a filter.
pipeline = sizelimit url_normalize request_id build_auth_context token_auth admin_token_auth json_body ec2_extension_v3 s3_extension simple_cert_extension revoke_extension federation_extension oauth1_extension endpoint_filter_extension service_v3pipeline section : 指定的 section 有如下要求:
- 1.最后一个名字对应的 section 一定要是一个 app 类型。 
- 2.非最后一个名字对应的 section 一定要是一个 filter 类型。 
filter
[filter:sizelimit]
paste.filter_factory = oslo_middleware.sizelimit:RequestBodySizeLimiter.factory  filter section: 是一个实现了过滤器功能的中间件(将 Application 进行进一步的封装),用于过滤 Request 和 Response。
- 程序员可以通过添加 filter 来增加对 Request 和 Response 进行操作的功能。EG. 我在实现一个 application 之前需要对 Request 进行身份验证,那么就让这个 Request 通过提供身份验证功能的 filter 即可。 
- paste.filter_factory表示调用哪个函数来获得这个 filter 中间件。- sizelimit是- [pipeline:api_v3]指定的第一个 filter ,作用是限制请求的大小。
app
[app:service_v3]
paste.app_factory = keystone.service:v3_app_factory  app: 一个 app 就是一个实现主要功能的具体的 application 。所以 app 必须是 Callable Object 类型,接受的参数(environ,start_response),这是WSGI Server交给Application的符合WSGI规范的参数。
- Application 需要完成的任务是响应 envrion 中的请求,准备好响应头 headers 和消息体 body,然后交给 start_response 处理,返回响应消息体。 
- [pipeline:api_v3]的最后一个元素,必须是一个 app section 。
- paste.app_factory :表示调用哪个函数来获得 application 
- keystone.service:v3_app_factory 指定处理请求和响应的 application 
- paste.app_factory = keystone.service:v3_app_factory这一种方式,将一个 app 指向了一段 python 代码。此方式下,必须执行 app 协议:以- app_factory表示,后面的值为需要 import 的东西,在这个例子中需要- import keystone.service,并从中取得了- v3_app_factory的实例。
- app_factory是一个 callable object,其接受的参数是一些关于 application 的配置信息,EG.- (global_conf,**kwargs):- global_conf 是在 ini 文件中 default section 中定义的一系列 key-value 对
- **kwargs 则是一些本地配置,是在 ini 文件中,app section 中定义的一系列 key-value 对。app_factory 返回值是一个 application 对象。这个对象是的 WSGI Server 和 WSGI Application 可以进行交互,即可以传递 Request 和 Response 的数据。
 
DEFAULT
[DEFAULT]
admin_email = webmaster@example.com
[app:main]
use = ...
set admin_email = jmilkfan@example.com全局配置主要是用于多个 app 共用一些变量,可以被覆盖,需要在 app 中重新定义。
server
[server:main]: 定义WSGI的一个server。
Request 被 paste.ini 处理的流程
WSGI Server(Web Server) 接受到 URL_Path 形式的 HTTP Request 时,这些 Request 首先会被 Paste 模块按照配置文件 paste.ini 进行处理。
处理的过程为: 
1. composite(将Request将URL_Path的前缀(/v2.0 /v3 /)和一个Application(app/filter)进行映射。然后将Request转发到pipeline或app中,最终会到达指定的 Application)  
2. ==> pipeline(包含了filter和app)  
3. ==> filter(调用Middleware对Request进行过滤)  
4. ==> app(具体的Application来实现Request的操作) 。 
这个过程就是将 Application 和 Middleware 串起来的过程,不一定要按照顺序执行,只要能到达 Application 即可。
EXAMPLE: Keystone Request URL 为 http://homename:35357/v3/auth/tokens
- Step1. (hostname:35357): 这一部分由 Web Server 来获取并处理的(EG.虚拟机功能)。 
- Step2. (/v3/auth/tokens): 根据 paste.ini 中的配置来对剩下的 URL(/v3/auth/tokens)部分进行处理。首先请求的 Post=35357 决定了会经过 [composite:admin] section 。(一般是admin监听35357端口,main监听5000端口;也可以由 - application = wsgi_server.initialize_application(name)中 name 参数来决定)
- Step3. (/v3): composite section 会根据 /v3 这个 URL 前缀来决定将 Request 路由到哪一个 pipeline secion,这里就把请求转发给 [pipeline:api_v3] 处理,转发之前,会把 /v3 这个部分的 URL 去掉。 
- Step4. (/auth/tokens) : [pipeline:api_v3] 收到请求,URL_Path是 (/auth/tokens),然后开始调用各个 filter(中间件) 来处理请求。最后会把请求交给 [app:service_v3] 进行处理。 
- Step5. (/auth/tokens): [app:service_v3] 收到请求,URL_Path是 (/auth/tokens),最后交由的 WSGI Application: - keystone.service:v3_app_factory去处理。
注意:剩下的URL后缀 /auth/tokens 则交由另一个模块 Routers 来处理,这个以后再介绍。
如何加载 paste.ini 配置文件?
使用 Paste.Deploy 模块, 
Paste Deploy是一种机制,通过核心函数 loadapp() 函数和一个 paste.ini 配置文件或者 Paste egg 包来载入 WSGI Application。
#keystone/httpd/keystone.py
import os
from keystone.server import wsgi as wsgi_server
name = os.path.basename(__file__)
# NOTE(ldbragst): 'application' is required in this context by WSGI spec.
application = wsgi_server.initialize_application(name)
# Web Server 只能通过 application 可调用对象来与 Application 进行交互#keystone/keystone/server/wsgi.py
def initialize_application(name):
    def loadapp():
        return keystone_service.loadapp(
            'config:%s' % config.find_paste_config(), name)
            ...
            _unused, application = common.setup_backends(
                startup_application_fn=loadapp)
             ...
            return application     #返回一个可调用的 application 对象- config.find_paste_config()用来查找并加载需要用到的 Paste 配置文件,这个文件在源码中的路径是 keystone/etc/keystone-paste.ini 文件。
- name 参数,是用来确定 WSGI Application 的入口 
- paste.ini 配置文件是用来确定使用哪一个 application 
- keystone_service.loadapp()函数内部调用了- paste.deploy.loadapp()函数通过 name 参数来加载 WSGI Application,至于加载哪一个具体实现功能的 application 对象则由 Paste 模块的配置文件 keystone-paste.ini 来决定。
factory 工厂函数
用于 factory 工厂函数的协议有:
- *paste.app_factory
- *paste.composite_factory
- *paste.filter_factory
- *paste.server_factory
所有的这些 factory 都是含有__call__方法的函数、方法或类。
EXAMPLE 1: paste.app_factory
def app_factory(global_config, **local_conf):
    return wsgi_app- global_config : 是一个字典
- local_conf : 则是关键字参数,返回一个 wsgi_app
EXAMPLE 2: paste.composite_factory
def composite_factory(loader, global_config, **local_conf):
    return wsgi_app- loader : 是一个对象,拥有get_app(name_or_uri, global_conf=None)根据 name 返回一个 application;get_filter() 和 get_server()也是如此。
EXAMPLE 3:paste.pipeline_factory
def pipeline_factory(loader, global_config, pipeline):
    # space-separated list of filter and app names:
    pipeline = pipeline.split()
    filters = [loader.get_filter(n) for n in pipeline[:-1]]
    app = loader.get_app(pipeline[-1])
    filters.reverse() # apply in reverse order!
    for filter in filters:
        app = filter(app)
    return appEXAMPLE 4:paste.filter_factory 这个 filter 会检查 CGI 中 REMOTE_USER 变量是否存在,并创建一个简单的认证 filter 过滤器。
def auth_filter_factory(global_conf, req_usernames):
    # space-separated list of usernames:
    req_usernames = req_usernames.split()
    def filter(app):
        return AuthFilter(app, req_usernames)
    return filter
class AuthFilter(object):
    def __init__(self, app, req_usernames):
        self.app = app
        self.req_usernames = req_usernames
def __call__(self, environ, start_response):
    if environ.get('REMOTE_USER') in self.req_usernames:
        return self.app(environ, start_response)
    start_response('403 Forbidden',
                   [('Content-type', 'text/html')])
    return ['You are forbidden to view this resource']fliter 的工厂函数和 app 的工厂函数类似,除了它返回的是一个 filter。fliter 是一个把 application 作为唯一参数的 Callable 对象,返回一个被过滤了的 application。
Openstack Paste.ini 文件详解的更多相关文章
- QT QSettings 操作(导入导出、保存获取信息)*.ini文件详解
		1.QSettings基本使用 1.1.生成.ini文件,来点实用的代码吧. QString fileName;fileName = QCoreApplication::applicationDirP ... 
- mysql的my.ini文件详解
		mysql数据库在配置时包含很多信息:端口号,字符编码,指定根路径 basedir,指定数据存放的路径等信息 mysql的字体编码分为两种: 服务器编码 客户端输入的编码 通常服务器的编码都是utf- ... 
- C++——INI文件详解
		原创声明:本文系博主原创文章,转载及引用请注明出处. 1. INI文件介绍 INI是英文单词 INItialization 的缩写,常作为Windows系统下的配置文件.INI文件是文本文件,通常用于 ... 
- OpenStack Paste.ini详解(二)
		接着OpenStack Paste.ini详解(一),接下来就分析request被paste.ini处理的流程 WSGI server接收到URL形式的request时,这些request首先会被Pa ... 
- OpenStack Paste.ini详解(一)
		问题背景 最近在研究openstack 服务的源代码,由于项目代码较多对其又不熟悉,刚开始就不知道从哪里开始入手分析.经过分析发现,在正式分析源码之前需要对python的wsgi.paste.rout ... 
- (转)linux paste命令用法详解
		linux paste命令用法详解原文:http://www.xfcodes.com/linuxcmd/mulu/10211.htmlinux下paste命令,可用于合并文件的列. 功能说明:合并文件 ... 
- my.ini配置详解
		Mysql my.ini 配置文件详解 #BEGIN CONFIG INFO #DESCR: 4GB RAM, 只使用InnoDB, ACID, 少量的连接, 队列负载大 #TYPE: SYSTEM ... 
- web.xml文件详解
		web.xml文件详解 Table of Contents 1 listener. filter.servlet 加载顺序 2 web.xml文件详解 3 相应元素配置 1 listener. f ... 
- Linux中/proc目录下文件详解
		转载于:http://blog.chinaunix.net/uid-10449864-id-2956854.html Linux中/proc目录下文件详解(一)/proc文件系统下的多种文件提供的系统 ... 
随机推荐
- 【原理】RabbitMQ概要图
			使用流程 发布者(推送消息的一端): 创建一个tcp长连接connection,连接rabbitmq的监听端口5672: 在TCP长连接下创建一个信道channel,信道可以理解为connection ... 
- javascript表单验证的例子
			function checkUsername(){ //对username的内容进行验证. //要求:首字符是字母或下划线,其他由下划线字母数字组成,共4-20位 var inputOb=docume ... 
- linux POSIX信号量
			POSIX信号量机制是3种IPC机制之一,3种IPC机制源于POSIX.1的实时扩展. 创建一个新的命名信号量或者使用一个现有信号量 #include <fcntl.h> #include ... 
- APICloud框架——获取本地图片信息
			api.getPicture 获取本地图片放置到服务器上或者在app中预览是app的基本功能,今天使用了APICloud框架的api.getPicture这个api获取到的本地图片预览在app中,就像 ... 
- 区间dp(二维)——cf1199F
			复杂度是O(N^5),枚举所有小矩形,转移时再按每列,每行进行转移 #include<bits/stdc++.h> using namespace std; #define N 55 in ... 
- AcWing    203. 同余方程    (线性同余方程)打卡
			求关于x的同余方程 ax ≡ 1(mod b) 的最小正整数解. 输入格式输入只有一行,包含两个正整数a,b,用一个空格隔开. 输出格式输出只有一行,包含一个正整数x,表示最小正整数解. 输入数据保证 ... 
- 第十四届华中科技大学程序设计竞赛--J	Various Tree
			链接:https://www.nowcoder.com/acm/contest/106/J来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ... 
- 破解极验(geetest)验证码
			破解极验(geetest)验证码 这是两年前的帖子: http://www.v2ex.com/t/138479 一个月前的破解程序,我没用过 asp.net ,不知道是不是真的破解了, demo ... 
- libcmt.lib(crt0dat.obj) : error LNK2005: _amsg_exit 已经在 MSVCRTD.lib(MSVCR110D.dll) 中定义
			问题描述(VC2012): 1>MSVCRTD.lib(cinitexe.obj) : warning LNK4098: 默认库"libcmt.lib"与其他库的使用冲突:请 ... 
- jdk tomcat的项目版本一致操作
			操作jdk版本以及tomcat版本:右键项目--buildpath--configure buildpath...---project Facets---libraries---add/选中remov ... 
