3

最も単純な形式で呼び出し可能なピラミッドビューは、次のように記述できます。

def myview(request):
    pass

別の形式は、別のパラメーター(コンテキスト)を受け入れることです。

def myview(context, request):
    pass

Pyramidビュールックアップ機構は、呼び出し可能ビューがコンテキストを受け入れるかどうかをどのように認識しますか?

4

1 に答える 1

4

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

次に、コードの残りの部分は、ビューがコンテキストを受け入れない場合にコンテキストを省略するようにコードパスを調整します。

于 2013-03-09T19:42:30.507 に答える