共计 4204 个字符,预计需要花费 11 分钟才能阅读完成。
这篇文章将为大家详细讲解有关 Python 中的 Routes 模块是什么,丸趣 TV 小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
Routes 是一个 python 重新实现的 Rails routes system,用来将 urls 映射到应用具体的 action 上,相反的,还生成 url。由于 Routes 是 Rails routes system 的 python 实现,并且网上关于 Routes 的文档很少,故从 rails 的 routes system 入手,就能很好的理解 Routes 库了。
首先看一个简单的例子,就明白 routes 的作用,
例如浏览器接收到下面的 HTTP 请求,GET /instances/1 Rails 的路由请求则负责将此请求解析后 dispatch 来代码中的具体某个函数,完成调用,例如返回虚拟机的信息。
第一部分:讲解 wsgi 的调用入口(paste)
python 中的 WSGI(Web Server Gateway Interface)是 Python 应用程序或框架与 Web 服务器之间的一种接口,定义了一套借口来实现服务器与应用端的通信规范。按照一套规范,应用端 想要通信,很简单,只需要实现一个接受两个参数的,含有__call__方法并返回一个可遍历的含有零个或者多个 string 结果的 python 对象。
服务端,对于每个 http 请求,调用一次应用端“注册”的那个协议规定应用必须实现的对象,然后返回相应的响应消息。WSGI Server 唯一的任务就是接收来自 client 的请求,然后将请求传给 application,最后将 application 的 response 传递给 client。中间存在的一些东西,就需要中间件来处理。
Paste Deployment 是用于发现和配置 WSGI appliaction 和 server 的系统。对于 WSGI application,用户提供一个单独的函数(loadapp),用于从配置文件或者 python egg 中加载 WSGI application。因为 WSGI application 提供了唯一的单独的简单的访问入口,所以 application 不需要暴露 application 的内部的实现细节。
Paste.Deploy 主要是用来载入 WSGI 中的 Web App 使用,其核心函数是 loadapp()。
以下将以 openstack 的 nova 为例讲解 paste 如何载入启动 nova 服务(即发布 routes API 给上层提供调用)
1、nova –debug list 开始:
命令的主要目的就是发送了两个 url 请求:(第一个发送给 keystone 授权,授权通过发送给 nova 获取虚拟机列表)
url 中包括了 token 以及参数值
下图说明请求 url 成功,返回 200.
2、接下来详解,发送以下 url,如何映射到后台的 v2 版本的 nova API 以及又是如何进行权限认证配置。
http://192.168.1.120 :8774/v2/c865d5a3760348a4b8a92cf657a9176d/servers/detail
3、每一个 url 映射都是有 paste 模块进行解析,paste 模块具体解析模块入口就是 *.ini 配置文件。以下展示了整个 openstack 中所有的 url 映射控制的 paste 入口配置文件。
find /etc/ | xargs grep paste –color=auto 查找到所有的 paste 的 ini 配置文件。
4、以 nova 的 api-paste.ini 配置文件讲解。
首先介绍 paste 配置文件中的几个概念:
一个配置文件后缀为 ini,内容被分为很多段(section),paste.depoly 只关心带有前缀的段,比如 [app:main] 或者[filter:errors],总的来说,一个 section 的标识就是[type:name], 不是这种类型的 section 将会被忽略。
一个 section 的内容是以键 = 值来标示的。# 是一个注释。在段的定义中,有以下几类:
[app:main]: 定义 WSGI 应用,main 表示只有一个应用,有多个应用的话 main 改为应用名字
[server:main]: 定义 WSGI 的一个 server。
[composite:xxx]:表示需要将一个请求调度定向(dispatched)到多个, 或者多种应用上。以下是一个简单的例子,例子中,使用了 composite,通过 urlmap 来实现载入多应用。
[fliter:]:定义“过滤器”,将应用进行进一步的封装。
[DEFAULT]:定义一些默认变量的值。
vim /etc/nova/api-paste.ini
其中 openstack_compute_api_v2 的 use = call:nova.api.auth:pipeline_factory 表示通过访问的 url,来选择具体使用哪个应用。
根据 http://192.168.1.120:8774/v2/c865d5a3760348a4b8a92cf657a9176d/servers/detail,由匹配规则,接下来调用
/v2: openstack_compute_api_v2 应用。
这个 Application 对应了三个参数:noauth,keystone 和 keystone_nolimit。我们可以看到这里 Application 具体实现的方法是 pipeline_factory。我们可以看到在参数 noauth,keystone 和 keystone_nolimit 中,分别集成了多个应用,实际上每个参数最终实现的 Application 分别是最后一个,即 osapi_compute_app_v2,osapi_compute_app_v2 和 osapi_compute_app_v2,其前面的 Application 都扮演这最后一个 Application 的过滤器。我们以参数 keystone 为例,实现参数 keystone 的 Application 为 osapi_compute_app_v2,它前面的 faultwrap sizelimit authtoken keystonecontext 等应用都是它的过滤器,其实现过程也就是 faultwrap(sizelimit(authtoken(keystonecontext(osapi_compute_app_v2)))),具体的调用过程就是 osapi_compute_app_v2- keystonecontext- authtoken- sizelimit- faultwrap,前面方法的执行结果作为后面方法的输入参数,最后得到的运行结果作为参数 keystone 的值。可以说明,三个参数 noauth,keystone 和 keystone_nolimit 的值都是这样得到的。
详解:
后面三句分别对应配置文件中不同配置执行不通的过滤流程,最终三个都将返回 osapi_compute_app_v2 应用。
use = call:nova.api.auth:pipeline_factory 代码:
pipeline_factory 函数的目的就是读取解析配置文件(/etc/nova/nova.conf)中定义的认证策略:noauth、keystone、keystone_nolimit。
假若在配置文件 nova.conf 中,配置的是 auth_strategy=keystone,接下来匹配:
keystone_nolimit = faultwrap sizelimit authtoken keystonecontext osapi_compute_app_v2
faultwrap sizelimit 过滤器不做进一步详解,有兴趣者请自行跟进代码查看。
5、分析 authtoken 过滤器:
找到对应的代码:
由上述代码可知,授权对应过滤器 authtoken,具体操作在 AuthProtocol 类的__call__函数。授权的具体细节请自行分析以上函数,再次不做过多讲解。
注:有 paste 的知识可知,每一个 factory,都会有一个__call__函数。调用该 factory 就会调用此函数。
6、接下来分析 keystonecontext 过滤器:
对应代码:
上述代码功能:在上一步授权走过滤器 authtoken 时候,从 keystone 中获取了一些必要的信息。例如 X_USER_ID、X_TENANT_NAME、X_ROLES、token 值等等,然后组装成一个 http 的 request,请求对应的 url 信息。
从命令执行结果也可以看出 authtoken、和 keystonecontext 两个过滤器各自功能及交互过程。
authtoken 过滤器执行过程:(curl - i 是发送一个 url 请求,INFO 后面则是从 keystone 模块请求回来的参数,这些参数传递给 keystonecontext 过滤器,
keystonecontext 过滤器根据这些参数,再组装出对应的 http request,请求相应的 url)
keystonecontext 过滤器执行过程:
7、到此过滤器执行完了,接下来重点分析 osapi_compute_app_v2 应用:
keystone_nolimit = faultwrap sizelimit authtoken keystonecontext osapi_compute_app_v2
找到对应入口代码:
上述 APIRouter 类就是 paste 加载 osapi_compute_app_v2 应用,然后发布路由规则处。
class APIRouter(nova.api.openstack.APIRouter):
找到父类nova.api.openstack.APIRouter:
8、打印 router 信息:
vim /usr/lib/python2.6/site-packages/nova/api/openstack/__init__.py
重启 openstack-nova-api 服务
service openstack-nova-api restarttailf /var/log/nova/api.log
关于“Python 中的 Routes 模块是什么”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。