【问题标题】:View is not found after adding a context添加上下文后未找到视图
【发布时间】:2017-11-16 00:09:39
【问题描述】:

我正在尝试将 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

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

【问题讨论】:

    标签: python acl pyramid


    【解决方案1】:

    您不应在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)意味着“如果上下文是Foo,则使用该视图函数”。这是一个谓词。

    【讨论】:

    • 我不确定我是否理解这与教程中的 context= 之间的区别:docs.pylonsproject.org/projects/pyramid/en/latest/tutorials/… - 如果在这种情况下上下文匹配 .models.Page - 该对象来自哪里?
    • 对,我刚刚注意到那个例子中有一个config.set_root_factory(root_factory),这解释了很多!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-26
    • 1970-01-01
    相关资源
    最近更新 更多