Skip to main content
 首页 » 编程设计

python之Pyramid 和遍历问题

2025年05月04日12sxdcgaq8080

当我试图将我的 url 指向 http://localhost:6543/admin/product/50b0d01ce815af3c4167040e/edit 时,它以某种方式显示 404 错误。我相信某个地方,我的观点是错误的,但经过无数次尝试,我似乎无法找出问题所在。

resources.py 的内容:

    from pyramid.security import Authenticated 
    from pyramid.security import Allow 
    from pyramid.response import Response 
 
 
    class Root(object): 
        __name__ = '' 
        __parent__ = None 
 
        def __init__(self, request): 
            pass 
 
        def __getitem__(self, key): 
 
            if key == 'admin_login': 
               return Admin() 
 
            elif key == 'admin': 
               return Admin() 
 
            raise KeyError 
 
 
    class Admin(object): 
 
        __name__ = '' 
        __parent__ = Root 
        __acl__ = [ 
          (Allow, Authenticated, 'admin') 
        ] 
 
        def __init__(self): 
            pass 
 
        def __getitem__(self, key): 
 
            if key == 'product': 
               print ('admin: ' , key) 
               return Product() 
 
            if key == 'category': 
               print ('admin: ' + key) 
               return Category() 
 
            raise KeyError 
 
 
    class Product(object): 
 
        __name__ = '' 
        __parent__ = Admin 
        __acl__ = [ 
          (Allow, Authenticated, 'admin') 
        ] 
 
        def __init__(self): 
            pass 
 
        def __getitem__(self, key): 
            if key : 
               return ProductName(key) 
 
            print ('Approaching KeyError: ', key) 
            raise KeyError 
 
 
    class ProductName(object): 
 
        __parent__ = Product 
        __acl__ = [ 
            (Allow, Authenticated, 'admin') 
        ] 
 
        def __init__(self, _str): 
            self.__name__ = _str; 
            self.__parent__ = Settings; 
 
            print ('ProductName: ' + _str) 
            pass 

views/admin.py 的内容:

    @view_config(context='mycart:resources.Product', renderer='post.jinja2') 
    @view_config(context='mycart:resources.ProductName', name='edit', renderer='admin/settings/commissions.jinja2', permission = 'admin') 
        print (' in product edit? ') 
        return {'msg': 'yay editing!'} 

我对源代码做了一些修改。 http://localhost:6543/admin/product 绝对有效。但是,似乎现在 http://localhost:6543/admin/product/add 没有显示布局,http://localhost:6543/admin/product/YYYY/编辑显示布局。

views/admin.py 的内容:

    @view_config(context='mycart:resources.ProductName', name='edit',    renderer='admin/product/test.jinja2', permission = 'admin') 
    def product_edit(context, request): 
        print 'edit here?' 
        return { 'msg': '<div class="alert alert-success">Product Edit!</div>'} 
 
    @view_config(context='mycart:resources.ProductName', name='add', renderer='admin/product/test.jinja2', permission = 'admin') 
    def product_add(context, request): 
        print 'add in here?' 
        return { 'msg': '<div class="alert alert-success">Product Add</div>'} 
 
    @view_config(context='mycart:resources.ProductName',  name="add" , request_method="POST", renderer='admin/product/add.jinja2', permission = 'admin') 
    def product_add_post(context, request): 
    return { 'msg': '<div class="alert alert-success">Product Added Successfully!</div>'} 
 
    @view_config(context='mycart:resources.Product', name='', renderer='admin/product/list.jinja2', permission = 'admin') 
    def product_list(context, request): 
 
        return { 'msg': '<div class="alert alert-success">Listing of products</div>'} 

resources.py 的内容:

    from pyramid.security import Authenticated 
    from pyramid.security import Allow 
    from pyramid.response import Response 
 
    class Root(object): 
        __name__ = __parent__ = None 
 
        def __init__(self, request): 
            pass 
 
        def __getitem__(self, key): 
 
            if key == 'admin_login': 
                return Admin() 
 
            elif key == 'admin': 
                return Admin() 
 
           raise KeyError 
 
 
    class Admin(object): 
 
        __name__ = '' 
        __parent__ = Root 
        __acl__ = [ 
            (Allow, Authenticated, 'admin') 
        ] 
 
        def __init__(self): 
            pass 
 
        def __getitem__(self, key): 
 
            if key == 'product': 
               return Product() 
 
           #if key == 'category': 
          #    return Category() 
 
            raise KeyError 
 
    class Product(object): 
        __name__ = '' 
        __parent__ = Admin 
        __acl__ = [ 
            (Allow, Authenticated, 'admin') 
        ] 
 
        def __init__(self): 
            print ('Product() self _name: ' , self.__name__, ' parent: ', self.__parent__) 
            pass 
 
        def __getitem__(self, key): 
            print ('product: ' , key) 
 
            if key: 
                print ('key is true: ' , key) 
                return ProductName(key) 
 
            raise KeyError 
 
     class ProductName(object): 
        __name__ = '' 
        __acl__ = [ 
           ( Allow, Authenticated, 'admin') 
        ] 
 
        def __init__(self, _key): 
            p = Product() 
            p.__name__ = _key 
            p.__parent__ = self 
 
            print ( 'ProductName() init: ', _key) 
            print ( p.__parent__) 
            print ( p.__name__) 
 
            print ('\n\n') 
            pass 
 
 
        def __getitem__(self, _key): 
            print ( 'ProductName() __get__item key: ', _key) 
 
            if _key == 'edit': 
                p = Product() 
                p.__name__ = _key 
                p.__parent__ = self 
                print ('ProductName()->edit  parent: ') 
                print ( p.__parent__) 
                print ( p.__name__) 
                print ('\n\n') 
                return p 
 
            raise KeyError 

在我的控制台中,当我将我的 url 指向 http://localhost:6543/admin/product/add 时,输出是:

    < mycart.resources.ProductName object at 0x10abb7990 > 
    add 

但是,它显示了 404 错误,所以我猜我的 views/admin.py 哪里有问题?我试过改变 view_config 的顺序,但无济于事:

    @view_config(context='mycart:resources.ProductName', name='add',  ... ) 
    .... 
 
    @view_config(context='mycart:resources.ProductName', name='edit',  ... )  

至于使用以下url编辑时:http://localhost:6543/admin/vendor/50b0d01ce815af3c4167040e/edit,控制台输出为:

    < mycart.resources.ProductName object at 0x10abb4bd0 > 
    edit 

所以我知道在我的上下文中,我应该使用 context='mycart:resources.ProductName',并将其名称设置为 edit。但是,它没有在控制台中显示我在 views/admin.py 中设置的编辑消息。

我可能哪里出错了?

请您参考如下方法:

如果您在 __getitem__ 中执行 if key == 'somefing' 这表明您不需要纯遍历。 使用 URLdispatch 或混合方法。

ADDED:localhost:6543/admin/product/add 显示未找到,因为您为 ProductName 注册了“添加” View ,但是从该路径您获得了未查看“添加”的产品对象' 为它注册,这就是为什么找不到 404