博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Openstack Paste.ini 文件详解
阅读量:5818 次
发布时间:2019-06-18

本文共 7009 字,大约阅读时间需要 23 分钟。

目录

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_api

composite 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_v3

pipeline 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 为

  • 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.pyimport osfrom keystone.server import wsgi as wsgi_servername = 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.pydef 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 返回一个 applicationget_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 app

EXAMPLE 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 filterclass AuthFilter(object):    def __init__(self, app, req_usernames):        self.app = app        self.req_usernames = req_usernamesdef __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。

转载于:https://www.cnblogs.com/jmilkfan-fanguiju/p/7532332.html

你可能感兴趣的文章
IntPtr 转 string
查看>>
学生名单
查看>>
(转) 多模态机器翻译
查看>>
【官方文档】Nginx负载均衡学习笔记(三) TCP和UDP负载平衡官方参考文档
查看>>
矩阵常用归一化
查看>>
Oracle常用函数总结
查看>>
【聚能聊有奖话题】Boring隧道掘进机完成首段挖掘,离未来交通还有多远?
查看>>
USNews大学排名遭美国计算机研究学会怒怼,指排名荒谬要求撤回
查看>>
七大关键数据 移动安全迎来历史转折点
查看>>
盘点物联网网关现有联网技术及应用场景
查看>>
mui 总结2--新建第一个app项目
查看>>
nginx的lua api
查看>>
考研太苦逼没坚持下来!看苑老师视频有点上头
查看>>
HCNA——RIP的路由汇总
查看>>
zabbix监控php状态(四)
查看>>
定时任务的创建
查看>>
实战Django:小型CMS Part2
查看>>
原创]windows server 2012 AD架构试验系列 – 16更改DC计算机名
查看>>
统治世界的十大算法
查看>>
linux svn安装和配置
查看>>