最も単純な形式で呼び出し可能なピラミッドビューは、次のように記述できます。
def myview(request):
pass
別の形式は、別のパラメーター(コンテキスト)を受け入れることです。
def myview(context, request):
pass
Pyramidビュールックアップ機構は、呼び出し可能ビューがコンテキストを受け入れるかどうかをどのように認識しますか?
Pyramidは、inspect
モジュールを使用してビューを検査します(具体的には、関数.getargspec()
の呼び出し:requestonly()
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
次に、コードの残りの部分は、ビューがコンテキストを受け入れない場合にコンテキストを省略するようにコードパスを調整します。