Python 金字塔:视图可调用项如何接受一个或两个参数?
以最简单的形式调用的金字塔视图可以写成:Python 金字塔:视图可调用项如何接受一个或两个参数?,python,pyramid,Python,Pyramid,以最简单的形式调用的金字塔视图可以写成: def myview(request): pass 另一种形式是接受另一个参数——上下文: def myview(context, request): pass 金字塔视图查找机制如何知道视图可调用是否接受上下文?金字塔使用inspect模块检查视图(特别是在以下位置调用.getargspec(): 然后,如果视图不接受上下文,其余代码将调整代码路径以忽略上下文。您可以链接到Pyramid github source上发生这种情况的位
def myview(request):
pass
另一种形式是接受另一个参数——上下文:
def myview(context, request):
pass
金字塔视图查找机制如何知道视图可调用是否接受上下文?金字塔使用
inspect
模块检查视图(特别是在以下位置调用.getargspec()
:
然后,如果视图不接受上下文,其余代码将调整代码路径以忽略上下文。您可以链接到Pyramid github source上发生这种情况的位置吗?()可能在这里:谢谢。因此添加路由将运行检查(正如@Martijn指出的),然后将视图“包装”为标准化调用,并通过
DefaultViewMapper
router.py
()将其存储在注册表中,具有router.handle\u request
方法,该方法使用两个参数调用映射(标准化)请求response=view\u callable(上下文,请求)
。实际上,我也一直对如何完成这项工作感兴趣。很高兴他们通过DefaultViewMapper
标准化优化了检查。@JonathanVanasco:是的,我很抱歉;不得不离开一会儿。
def requestonly(view, attr=None):
ismethod = False
if attr is None:
attr = '__call__'
if inspect.isroutine(view):
fn = view
elif inspect.isclass(view):
try:
fn = view.__init__
except AttributeError:
return False
ismethod = hasattr(fn, '__call__')
else:
try:
fn = getattr(view, attr)
except AttributeError:
return False
try:
argspec = inspect.getargspec(fn)
except TypeError:
return False
args = argspec[0]
if hasattr(fn, im_func) or ismethod:
# it's an instance method (or unbound method on py2)
if not args:
return False
args = args[1:]
if not args:
return False
if len(args) == 1:
return True
defaults = argspec[3]
if defaults is None:
defaults = ()
if args[0] == 'request':
if len(args) - len(defaults) == 1:
return True
return False