2016-05-13 6 views
6

В приложении «Траверса пирамиды» как обрабатывается ресурс с __name__, который соответствует имени вида?Перемещение пирамиды __name__, соответствующее имени представления

Если бы я хотел получить доступ к представлению, предназначенному для просмотра для ресурса, я бы использовал URL-адрес, например: /foo/bar/view. Она пересекает resource_tree, как так:

RootFactory(request) => RootFactory 
RootFactory['foo'] => Foo 
Foo['bar']   => Bar 
Bar['view']   => KeyError 

... и потому, что он не может пройти мимо бара & «зрения», что осталось, это предполагает, что «представление» является имя вида, и соответствует моему мнению вызываемая

@view_config(name='view') 
def view(context, request): 
    return Response(context.__name__) 

Чтобы получить URL для этого пути я бы использовать request.resource_url(resource, "view").

Однако, если у меня был ресурс такой, что Bar.__name__ = "view", как я могу разрешить URL-адрес для «просмотра» на Foo?

# path: /foo/view 
RootFactory(request) => RootFactory 
RootFactory['foo'] => Foo # ideally stop here with view_name="view" 
Foo['view']   => Bar.__name__ = "view" 
# all parts of path matched so view_name="" and context=Bar 

В идеале, в этой ситуации, /foo/view бы указать на view(Foo, request) и /foo/view/view бы указать на view(Bar, request) где Bar.__name__ == "view".

Есть ли способ справиться с этим, не записывая обнаружение для столкновений между __name__ и просматривать имена?

ответ

0

Решение, в которое я попал, добавляет произвольный слой ресурсов контейнера.

Ниже приведен пример структуры ресурсов:

class Foo(object): 

    def __init__(self, parent, name): 
     self.__parent__ = parent 
     self.__name__ = name 

    def __getitem__(self, key): 
     if key == "bar": 
      return BarContainer(self, "bar") 
     else: 
      raise KeyError() 

class BarContainer(object): 

    def __init__(self, parent, name): 
     self.__parent__ = parent 
     self.__name__ = name 

    def __getitem__(self, key): 
     return Bar(self, key) 

class Bar(object): 

    def __init__(self, parent, name): 
     self.__parent__ = parent 
     self.__name__ = name 

Вопрос упоминает желая, чтобы генерировать URL-адреса ресурсов для просмотра вызываемую под названием зрения. С BarContainer это добавляет дополнительную косую черту:

/{foo}/bar/{bar}/<view_name>  
/a/view   => view(context=Foo(name='a'), request) 
/a/bar/view  => view(context=BarContainer(name='bar'), request) 
/a/bar/b/view => view(context=Bar(name='b'), request) 
Смежные вопросы