def __call__(self,request):
kw = None
if self._has_var_kw_arg or self._has_named_kw_args or self._required_kw_args:
if request.method == 'POST':
if not request.content_type:
return web.HTTPBadRequest(text='Missing content_type')
ct = request.content_type.lower()
if ct.startswith('application/json'):
params = await request.json()
if not isinstance(params,dict):
return web.HTTPBadRequest(text='Json body mmust be object')
kw = params
elif ct.startswith('application/x-www-form-urlencoded') or ct.startswith('multipart/form-data'):
params = await request.post()
kw = dict(**params)
else:
return web.HTTPBadRequest(text = 'Unsupported content_type:%s' % request.content_type)
if request.method == 'GET':
qs = request.query_string
if qs:
kw = dict()
for k,v in parse.parse_qs(qs,True).items():
kw[k] = v[0]
if kw is None:
kw = dict(**request.match_info)
else:
# ????????????????request????????????????
if not self._has_var_kw_arg and self._named_kw_args:
#remove all unamed kw
copy = dict()
for name in self._named_kw_args:
if name in kw:
copy[name] = kw[name]
kw = copy
#check named arg
for k,v in request.match_info.items():
if k in kw:
logging.warning('Duplicate arg name in named arg and kw args:%s' % k)
kw[k] = v
if self._has_request_arg:
kw['request'] = request
#check required kw
if self._required_kw_args:
for name in self._required_kw_args:
if not name in kw:
return web.HTTPBadRequest(text='Missing argument : %s' % name)
logging.info('call with args:%s' % str(kw))
try:
r = await self._func(**kw)
return r
except APIError as e:
raise dict(error=e.error,data=e.data,message=e.message)
#??????????
评论列表
文章目录