添加上下文后找不到视图

View is not found after adding a context

我正在尝试将 ACL 添加到 Pyramid 项目中的视图

我有一个最低限度的工作测试:

config.add_route('foo', '/foo')

查看:

@view_config(route_name='foo', renderer='../templates/foo.jinja2',
             permission='view', context=Foo)
def foo(request):
    return {}

上下文:

class Foo:
    __acl__ = [
        (Allow, Everyone, 'view'),
    ]

在没有设置权限和上下文的情况下效果很好,但在添加它们之后,我得到 pyramid.httpexceptions.HTTPNotFound: /foo

为什么突然找不到这条路线?这几乎完全是从教程中复制的。

您不应在 view_config 中指定上下文,而应在您的路由中指定工厂。

config.add_route('foo', '/foo', factory=lambda r: Foo(r))

此外,您可能必须在 __init__:

中接受请求
class Foo:
    def __init__(self, request):
        pass

    __acl__ = [
        (Allow, Everyone, 'view'),
    ]

你这样做的方式(在 view_config 中使用 context)意味着 "if the context is Foo, use that view function"。这是一个谓词。