您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Python中的Routes模塊是什么,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
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,接下來匹配:
faultwrap sizelimit過濾器不做進一步詳解,有興趣者請自行跟進代碼查看。
keystone_nolimit = faultwrap sizelimit authtoken keystonecontext osapi_compute_app_v2
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應用,然后發布路由規則處。
找到父類 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服務
service openstack-nova-api restart
tailf /var/log/nova/api.log
關于“Python中的Routes模塊是什么”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。