Openstack中api參數(shù)傳遞機制

Api消息參數(shù)的傳遞

在服務(wù)啟動之后春缕,WSGIServer就開始在監(jiān)聽client的請求了
注:關(guān)于服務(wù)的啟動悦陋,在前面幾篇文檔中已有詳細說明么鹤,請移步查看那各app是如何獲取到請求的相關(guān)參數(shù)的呢案狠?比如策略的創(chuàng)建:

@parameter_checker.is_valid_body(dj_constants.SERVICES)
def create(self, req, **kwargs):
"""
create a service
:param req:
:param kwargs:
:return:
"""
context = req.environ['test.context']
services = objects.PlanList.get_all_by_project(context,
context.project_id,
None, None)

這就涉及到plan app的注冊過程
router.py的APIRouter中磕昼,mapper中plan對應(yīng)的controller是resource類型的對象

class APIRouter(wsgi_common.Router):
@classmethod
def factory(cls, global_conf, **local_conf):
return cls(ProjectMapper())

def __init__(self, mapper):
plans_resources = plans.create_resource()

可以看到create_resource()方法返回的是一個wsgi.py的Resource對象卷雕,而Resource類又繼承自wsgi.py的Application類,Resource實現(xiàn)了Application的__call__方法票从,這個方法會在對象調(diào)用的時候被自動執(zhí)行

def __call__(self, request):
"""WSGI method that controls (de)serialization and method dispatch."""

LOG.info(_LI("%(method)s %(url)s"),
{"method": request.method,
"url": request.url})

# Identify the action, its arguments, and the requested
# content type
action_args = self.get_action_args(request.environ)
action = action_args.pop('action', None)
content_type, body = self.get_body(request)
accept = request.best_match_content_type()

# NOTE(Vek): Splitting the function up this way allows for
# auditing by external tools that wrap the existing
# function. If we try to audit __call__(), we can
# run into troubles due to the @webob.dec.wsgify()
# decorator.
return self._process_stack(request, action, action_args,
content_type, body, accept)

該方法通過解析request漫雕,得到當前請求的http字段(content_type,method類型峰鄙,body等)浸间,_process_stack方法如下

def _process_stack(self, request, action, action_args,
content_type, body, accept):
"""Implement the processing stack."""

# Get the implementing method
try:
meth, extensions = self.get_method(request, action,
content_type, body)

# Now, deserialize the request body...
try:
if content_type:
contents = self.deserialize(meth, content_type, body)
else:
contents = {}

# Update the action args
action_args.update(contents)

project_id = action_args.pop("project_id", None)
context = request.environ.get('test.context')
if (context and project_id and (project_id != context.project_id)):
msg = _("Malformed request url")
return Fault(webob.exc.HTTPBadRequest(explanation=msg))

# Run pre-processing extensions
response, post = self.pre_process_extensions(extensions,

meth為從控制器中根據(jù)action的值獲取相應(yīng)的方法(例如:cinder.api.v1.volumes.VolumeController.create);extensions為根據(jù)控制器和action的值獲取相應(yīng)的擴展方法吟榴;

def pre_process_extensions(self, extensions, request, action_args):
# List of callables for post-processing extensions
post = []

for ext in extensions:
if inspect.isgeneratorfunction(ext):
response = None

# If it's a generator function, the part before the
# yield is the preprocessing stage
try:
with ResourceExceptionHandler():
gen = ext(req=request, **action_args)
response = next(gen)
except Fault as ex:
response = ex

# We had a response...
if response:
return response, []

上面的代碼中魁蒜,其中ext就是實際調(diào)用的方法名,可以發(fā)現(xiàn)ext(req=request, **action_args)吩翻,最終是從這里將業(yè)務(wù)方法的參數(shù)傳遞進去的

博客:https://tunsuy.github.io/

github:https://github.com/tunsuy

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末兜看,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子狭瞎,更是在濱河造成了極大的恐慌细移,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件熊锭,死亡現(xiàn)場離奇詭異弧轧,居然都是意外死亡,警方通過查閱死者的電腦和手機碗殷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門劣针,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人亿扁,你說我怎么就攤上這事∧窭” “怎么了从祝?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵襟己,是天一觀的道長。 經(jīng)常有香客問我牍陌,道長擎浴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任毒涧,我火速辦了婚禮贮预,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘契讲。我一直安慰自己仿吞,他們只是感情好,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布捡偏。 她就那樣靜靜地躺著唤冈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪银伟。 梳的紋絲不亂的頭發(fā)上你虹,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天,我揣著相機與錄音彤避,去河邊找鬼傅物。 笑死,一個胖子當著我的面吹牛琉预,可吹牛的內(nèi)容都是我干的董饰。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼模孩,長吁一口氣:“原來是場噩夢啊……” “哼尖阔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起榨咐,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤介却,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后块茁,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體齿坷,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年数焊,在試婚紗的時候發(fā)現(xiàn)自己被綠了永淌。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡佩耳,死狀恐怖遂蛀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情干厚,我是刑警寧澤李滴,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布螃宙,位于F島的核電站,受9級特大地震影響所坯,放射性物質(zhì)發(fā)生泄漏谆扎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一芹助、第九天 我趴在偏房一處隱蔽的房頂上張望堂湖。 院中可真熱鬧,春花似錦状土、人聲如沸无蜂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽酱讶。三九已至,卻和暖如春彼乌,著一層夾襖步出監(jiān)牢的瞬間泻肯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工慰照, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留灶挟,地道東北人。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓毒租,卻偏偏與公主長得像稚铣,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子墅垮,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容