Python中的Routes模块是什么

这篇文章将为大家详细讲解有关Python中的Routes模块是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

成都创新互联长期为上千家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为烈山企业提供专业的成都网站设计、网站制作烈山网站改版等技术服务。拥有十余年丰富建站经验和众多成功案例,为您定制开发。

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以及参数值

Python中的Routes模块是什么

Python中的Routes模块是什么

下图说明请求url成功,返回200.

Python中的Routes模块是什么

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配置文件。      

Python中的Routes模块是什么

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 

Python中的Routes模块是什么

其中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应用。

Python中的Routes模块是什么

这个Application对应了三个参数:noauth,keystone和keystone_nolimit。我们可以看到这里Application具体实现的方法是pipeline_factory。我们可以看到在参数noauth,keystone和keystone_nolimit中,分别集成了多个应用,实际上每个参数最终实现的Application分别是最后一个,即osapi_compute_app_v2osapi_compute_app_v2osapi_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代码:

Python中的Routes模块是什么

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 过滤器:  
    Python中的Routes模块是什么  

找到对应的代码:
Python中的Routes模块是什么  
Python中的Routes模块是什么  
Python中的Routes模块是什么  
由上述代码可知,授权对应过滤器authtoken,具体操作在AuthProtocol类的__call__函数。授权的具体细节请自行分析以上函数,再次不做过多讲解。  
注:有paste的知识可知,每一个factory,都会有一个__call__函数。调用该factory就会调用此函数。  

6、接下来分析keystonecontext 过滤器:

Python中的Routes模块是什么

对应代码:

Python中的Routes模块是什么

上述代码功能:在上一步授权走过滤器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)

Python中的Routes模块是什么

keystonecontext过滤器执行过程:

Python中的Routes模块是什么

7、到此过滤器执行完了,接下来重点分析osapi_compute_app_v2应用:

keystone_nolimit = faultwrap sizelimit authtoken keystonecontext osapi_compute_app_v2

Python中的Routes模块是什么

找到对应入口代码:

Python中的Routes模块是什么

上述APIRouter类就是paste加载osapi_compute_app_v2应用,然后发布路由规则处。

class APIRouter(nova.api.openstack.APIRouter):

找到父类   nova.api.openstack.APIRouter:  
Python中的Routes模块是什么  
   

8、打印router信息:

 vim /usr/lib/python2.6/site-packages/nova/api/openstack/__init__.py      

Python中的Routes模块是什么

重启openstack-nova-api服务

service  openstack-nova-api restart      

tailf /var/log/nova/api.log      


 

Python中的Routes模块是什么

关于“Python中的Routes模块是什么”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。


当前名称:Python中的Routes模块是什么
网站URL:http://scyanting.com/article/pjohis.html