91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python中的Routes模塊是什么

發布時間:2021-12-27 13:49:21 來源:億速云 閱讀:435 作者:小新 欄目:云計算

這篇文章將為大家詳細講解有關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以及參數值

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模塊是什么”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

顺平县| 泰和县| 徐汇区| 荆州市| 黄骅市| 祁门县| 定襄县| 阿荣旗| 洱源县| 林周县| 南安市| 塘沽区| 安多县| 许昌市| 疏勒县| 孝感市| 洛隆县| 延吉市| 托里县| 新乡市| 万山特区| 平顺县| 治县。| 涿州市| 郸城县| 汉中市| 承德县| 延长县| 威信县| 清水县| 麻栗坡县| 镇巴县| 自治县| 吴堡县| 峡江县| 海伦市| 永和县| 浮山县| 鄢陵县| 东乡族自治县| 枝江市|