2016-05-13 3 views
6

Dans une application Pyramide Traversale, comment gérer une ressource avec un __name__ correspondant au nom d'une vue?Pyramid Traversal __name__ correspondant à un nom de vue

Si je voulais accéder à la vue "vue" appelable pour une ressource, j'utiliserais un chemin d'URL comme: /foo/bar/view. Il traverse la resource_tree comme si:

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

... et parce qu'il ne peut pas traverser Bar passé & « view » qui reste, il suppose que « vue » est le nom de la vue, et qui correspond à mon avis appelable

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

pour obtenir l'URL pour ce chemin j'utiliser request.resource_url(resource, "view").

Cependant, si j'avais une ressource telle que Bar.__name__ = "view", comment puis-je résoudre une URL pour "voir" sur 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 

Idéalement, dans cette situation, /foo/view citerais view(Foo, request) et /foo/view/view citerais view(Bar, request)Bar.__name__ == "view".

Existe-t-il un moyen de gérer cela sans écrire de détection pour les collisions entre __name__ et afficher les noms?

Répondre

0

La solution à laquelle je suis arrivé est d'ajouter une couche arbitraire de ressources de conteneur.

est Ci-dessous un exemple de structure des ressources:

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 

La question mentionne vouloir générer des URL de ressources à la vue appelable vue intitulé. Avec BarContainer cela ajoute juste une barre oblique supplémentaire:

/{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)