您好,登錄后才能下訂單哦!
如何進行openstack組件nova代碼解析,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
隨手記錄一下查看nova代碼時的筆記。nova.wsgi文件定義了wsgi功能組件的基類。
此類為wsgi app的基類:
class Application(object):"""WSGI應用程序基類封裝. 子類需要實現__call__方法.""" @classmethod def factory(cls, global_config, **local_config):"""在paste.deploy配置文件中被調用 任何local配置 (即paste配置文件中[app:APPNAME]的值) 都將作為kwargs傳遞到 `__init__` 方法中。 假設的配置內容如下: [app:wadl] latest_version = 1.3 paste.app_factory = nova.api.fancy_api:Wadl.factory 這樣就可以實現paste類似如下的方式調用Wadl類: import nova.api.fancy_api fancy_api.Wadl(latest_version='1.3') 當然,您可以在子類中重新實現`factory`方法,但是使用kwarg傳遞它應該是不必要的。 """ return cls(**local_config)def __call__(self, environ, start_response):""" 子類可以類似下面的內容去實現__call__: @webob.dec.wsgify(RequestClass=Request) def __call__(self, req): # 以下任何對象都可以作為responses: # Option 1: 簡單字符串 res = 'message\n' # Option 2: 格式化良好的HTTP異常頁面 res = exc.HTTPForbidden(explanation='Nice try') # Option 3: 一個webob Response object (需要處理header等內容...) res = Response() res.app_iter = open('somefile') # Option 4: 接下來運行的任何wsgi應用程序 res = self.application # Option 5: 可以為wsgi應用程序獲取一個Response對象,以處理header等內容 res = req.get_response(self.application) # 也可以只返回response... return res # ... 或設置req.response然后返回None. req.response = res See the end of http://pythonpaste.org/webob/modules/dec.html for more info. """ raise NotImplementedError(_('You must implement __call__'))
此類為nova路由器系統的基類:
class Router(object):"""此類是WSGI中間件,可以將傳入請求映射到WSGI應用程序.""" def __init__(self, mapper):""" 為給定的routes.Mapper創建一個路由器. `mapper`中的每個路由必須指定一個'controller'。指定一個'action'并讓控制器成為一個對象, 這樣可以將請求路由到特定于action的方法。 Examples: mapper = routes.Mapper() sc = ServerController() # 一個路由到controller+action的顯式映射 mapper.connect(None, '/svrlist', controller=sc, action='list') # Actions都是隱式定義的 mapper.resource('server', 'servers', controller=sc) # 指向任意的WSGI app. 可以指定{path_info:.*}參數, # 這樣目標應用程序就可以只傳遞URL的這一部分。 mapper.connect(None, '/v1.0/{path_info:.*}', controller=BlogApp()) """ self.map = mapperself._router = routes.middleware.RoutesMiddleware(self._dispatch, self.map) @webob.dec.wsgify(RequestClass=Request)def __call__(self, req):""" 將傳入請求路由到基于self.map的控制器。 如果不匹配,返回404。 """ return self._router@staticmethod @webob.dec.wsgify(RequestClass=Request)def _dispatch(req):""" 將請求分派到適當的控制器。 將傳入請求與路由匹配并將信息放入 req.environ 由self._router調用。 """ match = req.environ['wsgiorg.routing_args'][1]if not match:return webob.exc.HTTPNotFound()app = match['controller']return app
class Middleware(Application):""" WSGI中間件基類. #這些類需要初始化一個應用程序,該應用程序將在下一步調用。 #默認情況下,中間件只調用其封裝的應用程序,或者可以重載__call__ 方法來自定處理行為。 """ @classmethod def factory(cls, global_config, **local_config):"""在paste.deploy配置文件中被調用 任何local配置 (即paste配置文件中[app:APPNAME]的值) 都將作為kwargs傳遞到 `__init__` 方法中。 假設的配置內容如下: [filter:analytics] redis_host = 127.0.0.1 paste.filter_factory = nova.api.analytics:Analytics.factory可以實現如python調用 `Analytics` 類方式行為,如下所示: import nova.api.analytics analytics.Analytics(app_from_paste, redis_host='127.0.0.1') 當然,您可以在子類中重新實現`factory`方法 """ def _factory(app):return cls(app, **local_config)return _factorydef __init__(self, application):self.application = applicationdef process_request(self, req):"""在每個request中調用. #如果它不返回任何值,則繼續執行堆棧中的下一個應用程序。 #如果它返回一個響應,那么該響應將被返回,執行將在這里停止。 """ return None def process_response(self, response):"""返回response前可以進行一些預處理.""" return response @webob.dec.wsgify(RequestClass=Request)def __call__(self, req): response = self.process_request(req)#調用此方法處理api請求if response:return response #如果有響應則返回,一般情況有response代表著有異常 response = req.get_response(self.application)#執行wsgi 應用程序獲取響應return self.process_response(response)#調用此方法預處理響應。
看完上述內容,你們掌握如何進行openstack組件nova代碼解析的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。