金字塔和遍历的问题

时间:2012-11-26 05:20:10

标签: python pyramid traversal

当我尝试将我的网址指向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/edit也没有显示布局。

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

在我的控制台中,当我将我的网址指向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',  ... ) 

对于使用以下网址进行编辑时:http://localhost:6543/admin/vendor/50b0d01ce815af3c4167040e/edit,控制台输出为:

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

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

我哪里可能出错了?

1 个答案:

答案 0 :(得分:1)

如果您在if key == 'somefing'__getitem__,则表明您不需要纯粹的遍历。 使用URLdispatch或Hybrid aproach。

ADDED:localhost:6543/admin/product/add显示未找到,becoze您注册了ProductName的“添加”视图,但是从此路径获得了Product对象,该对象没有为其注册“add”注册,这就是为什么404找不到< / p>