您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)Python中的Routes模塊是什么,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
Routes 是一個(gè)python重新實(shí)現(xiàn)的Rails routes system,用來(lái)將urls映射到應(yīng)用具體的action上,相反的,還生成url。由于Routes是Rails routes system的python實(shí)現(xiàn),并且網(wǎng)上關(guān)于Routes的文檔很少,故從rails的routes system入手,就能很好的理解Routes庫(kù)了。
首先看一個(gè)簡(jiǎn)單的例子,就明白routes的作用,
例如瀏覽器接收到下面的HTTP請(qǐng)求, GET /instances/1 Rails的路由請(qǐng)求則負(fù)責(zé)將此請(qǐng)求解析后dispatch來(lái)代碼中的具體某個(gè)函數(shù),完成調(diào)用,例如返回虛擬機(jī)的信息。
第一部分:講解wsgi的調(diào)用入口(paste)
python中的WSGI(Web Server Gateway Interface)是Python應(yīng)用程序或框架與Web服務(wù)器之間的一種接口,定義了一套借口來(lái)實(shí)現(xiàn)服務(wù)器與應(yīng)用端的通信規(guī)范。按照一套規(guī)范,應(yīng)用端 想要通信,很簡(jiǎn)單,只需要實(shí)現(xiàn)一個(gè)接受兩個(gè)參數(shù)的,含有__call__方法并返回一個(gè)可遍歷的含有零個(gè)或者多個(gè)string結(jié)果的python對(duì)象。
服務(wù)端,對(duì)于每個(gè)http請(qǐng)求,調(diào)用一次應(yīng)用端“注冊(cè)”的那個(gè)協(xié)議規(guī)定應(yīng)用必須實(shí)現(xiàn)的對(duì)象,然后返回相應(yīng)的響應(yīng)消息。 WSGI Server唯一的任務(wù)就是接收來(lái)自client的請(qǐng)求,然后將請(qǐng)求傳給application,最后將application的response傳遞給client。中間存在的一些東西,就需要中間件來(lái)處理。
Paste Deployment是用于發(fā)現(xiàn)和配置WSGI appliaction和server的系統(tǒng)。對(duì)于WSGI application,用戶(hù)提供一個(gè)單獨(dú)的函數(shù)(loadapp),用于從配置文件或者python egg中加載WSGI application。因?yàn)閃SGI application提供了唯一的單獨(dú)的簡(jiǎn)單的訪(fǎng)問(wèn)入口,所以application不需要暴露application的內(nèi)部的實(shí)現(xiàn)細(xì)節(jié)。
Paste.Deploy主要是用來(lái)載入WSGI中的Web App使用,其核心函數(shù)是loadapp()。
以下將以openstack的nova為例講解paste如何載入啟動(dòng)nova服務(wù)(即發(fā)布routes API給上層提供調(diào)用)
1、nova --debug list開(kāi)始:
命令的主要目的就是發(fā)送了兩個(gè)url請(qǐng)求:(第一個(gè)發(fā)送給keystone授權(quán),授權(quán)通過(guò)發(fā)送給nova獲取虛擬機(jī)列表)
url中包括了token以及參數(shù)值
下圖說(shuō)明請(qǐng)求url成功,返回200.
2、接下來(lái)詳解,發(fā)送以下url,如何映射到后臺(tái)的v2版本的nova API以及又是如何進(jìn)行權(quán)限認(rèn)證配置。
http://192.168.1.120 :8774/v2/c865d5a3760348a4b8a92cf657a9176d/servers/detail
3、每一個(gè)url映射都是有paste模塊進(jìn)行解析,paste模塊具體解析模塊入口就是*.ini配置文件。
以下展示了整個(gè)openstack中所有的url映射控制的paste入口配置文件。
find /etc/ | xargs grep paste --color=auto 查找到所有的paste的ini配置文件。
4、以nova的api-paste.ini配置文件講解。
首先介紹paste配置文件中的幾個(gè)概念:
一個(gè)配置文件后綴為ini,內(nèi)容被分為很多段(section),paste.depoly只關(guān)心帶有前綴的段,比如[app:main]或者[filter:errors],總的來(lái)說(shuō),一個(gè)section的標(biāo)識(shí)就是[type:name],不是這種類(lèi)型的section將會(huì)被忽略。
一個(gè)section的內(nèi)容是以鍵=值來(lái)標(biāo)示的。#是一個(gè)注釋。在段的定義中,有以下幾類(lèi):
[app:main]:定義WSGI應(yīng)用,main表示只有一個(gè)應(yīng)用,有多個(gè)應(yīng)用的話(huà)main改為應(yīng)用名字
[server:main]:定義WSGI的一個(gè)server。
[composite:xxx]:表示需要將一個(gè)請(qǐng)求調(diào)度定向(dispatched)到多個(gè),或者多種應(yīng)用上。以下是一個(gè)簡(jiǎn)單的例子,例子中,使用了composite,通過(guò)urlmap來(lái)實(shí)現(xiàn)載入多應(yīng)用。
[fliter:]:定義“過(guò)濾器”,將應(yīng)用進(jìn)行進(jìn)一步的封裝。
[DEFAULT]:定義一些默認(rèn)變量的值。
vim /etc/nova/api-paste.ini
其中openstack_compute_api_v2的use = call:nova.api.auth:pipeline_factory表示通過(guò)訪(fǎng)問(wèn)的url,來(lái)選擇具體使用哪個(gè)應(yīng)用。
根據(jù)http://192.168.1.120:8774/v2/c865d5a3760348a4b8a92cf657a9176d/servers/detail,由匹配規(guī)則,接下來(lái)調(diào)用
/v2: openstack_compute_api_v2應(yīng)用。
這個(gè)Application對(duì)應(yīng)了三個(gè)參數(shù):noauth,keystone和keystone_nolimit。我們可以看到這里Application具體實(shí)現(xiàn)的方法是pipeline_factory。我們可以看到在參數(shù)noauth,keystone和keystone_nolimit中,分別集成了多個(gè)應(yīng)用,實(shí)際上每個(gè)參數(shù)最終實(shí)現(xiàn)的Application分別是最后一個(gè),即osapi_compute_app_v2,osapi_compute_app_v2和osapi_compute_app_v2,其前面的Application都扮演這最后一個(gè)Application的過(guò)濾器。我們以參數(shù)keystone為例,實(shí)現(xiàn)參數(shù)keystone的Application為osapi_compute_app_v2,它前面的faultwrap sizelimit authtoken keystonecontext等應(yīng)用都是它的過(guò)濾器,其實(shí)現(xiàn)過(guò)程也就是faultwrap(sizelimit(authtoken(keystonecontext(osapi_compute_app_v2)))),具體的調(diào)用過(guò)程就是osapi_compute_app_v2->keystonecontext->authtoken->sizelimit->faultwrap,前面方法的執(zhí)行結(jié)果作為后面方法的輸入?yún)?shù),最后得到的運(yùn)行結(jié)果作為參數(shù)keystone的值??梢哉f(shuō)明,三個(gè)參數(shù)noauth,keystone和keystone_nolimit的值都是這樣得到的。
詳解:
后面三句分別對(duì)應(yīng)配置文件中不同配置執(zhí)行不通的過(guò)濾流程,最終三個(gè)都將返回osapi_compute_app_v2應(yīng)用。
use = call:nova.api.auth:pipeline_factory代碼:
pipeline_factory函數(shù)的目的就是讀取解析配置文件(/etc/nova/nova.conf)中定義的認(rèn)證策略:noauth、keystone、keystone_nolimit。
假若在配置文件nova.conf中,配置的是auth_strategy=keystone,接下來(lái)匹配:
faultwrap sizelimit過(guò)濾器不做進(jìn)一步詳解,有興趣者請(qǐng)自行跟進(jìn)代碼查看。
keystone_nolimit = faultwrap sizelimit authtoken keystonecontext osapi_compute_app_v2
5、分析authtoken 過(guò)濾器:
找到對(duì)應(yīng)的代碼:
由上述代碼可知,授權(quán)對(duì)應(yīng)過(guò)濾器authtoken,具體操作在AuthProtocol類(lèi)的__call__函數(shù)。授權(quán)的具體細(xì)節(jié)請(qǐng)自行分析以上函數(shù),再次不做過(guò)多講解。
注:有paste的知識(shí)可知,每一個(gè)factory,都會(huì)有一個(gè)__call__函數(shù)。調(diào)用該factory就會(huì)調(diào)用此函數(shù)。
6、接下來(lái)分析keystonecontext 過(guò)濾器:
對(duì)應(yīng)代碼:
上述代碼功能:在上一步授權(quán)走過(guò)濾器authtoken時(shí)候,從keystone中獲取了一些必要的信息。例如X_USER_ID、X_TENANT_NAME、X_ROLES、token值等等,然后組裝成一個(gè)http的request,請(qǐng)求對(duì)應(yīng)的url信息。
從命令執(zhí)行結(jié)果也可以看出authtoken、和keystonecontext兩個(gè)過(guò)濾器各自功能及交互過(guò)程。
authtoken過(guò)濾器執(zhí)行過(guò)程:(curl -i是發(fā)送一個(gè)url請(qǐng)求,INFO后面則是從keystone模塊請(qǐng)求回來(lái)的參數(shù),這些參數(shù)傳遞給keystonecontext過(guò)濾器,
keystonecontext過(guò)濾器根據(jù)這些參數(shù),再組裝出對(duì)應(yīng)的http request,請(qǐng)求相應(yīng)的url)
keystonecontext過(guò)濾器執(zhí)行過(guò)程:
7、到此過(guò)濾器執(zhí)行完了,接下來(lái)重點(diǎn)分析osapi_compute_app_v2應(yīng)用:
keystone_nolimit = faultwrap sizelimit authtoken keystonecontext osapi_compute_app_v2
找到對(duì)應(yīng)入口代碼:
上述APIRouter類(lèi)就是paste加載osapi_compute_app_v2應(yīng)用,然后發(fā)布路由規(guī)則處。
找到父類(lèi) nova.api.openstack.APIRouter:
class APIRouter(nova.api.openstack.APIRouter):
8、打印router信息:
vim /usr/lib/python2.6/site-packages/nova/api/openstack/__init__.py
重啟openstack-nova-api服務(wù)
service openstack-nova-api restart
tailf /var/log/nova/api.log
關(guān)于“Python中的Routes模塊是什么”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。