2016-05-13 36 views
6

In un'applicazione piramide Traversal, come si gestisce una risorsa w/a __name__ che corrisponde al nome di una vista?Pyramid Traversal __name__ corrispondente a un nome vista

Se volessi visualizzare la vista "visualizza" per una risorsa, utilizzerei un percorso URL come: /foo/bar/view. Si attraversa la resource_tree come così:

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

... e perché non può attraversare passato Bar & 'vista' che resta, si presume che 'vista' è il nome della vista, e li associa alle mio punto di vista callable

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

per ottenere l'URL per quel percorso userei request.resource_url(resource, "view").

Tuttavia, se avessi una risorsa tale che Bar.__name__ = "view", come posso risolvere un URL per "visualizza" su 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 

Idealmente, in questa situazione, /foo/view indicherebbe view(Foo, request), e /foo/view/view indicherebbe view(Bar, request) dove Bar.__name__ == "view".

C'è un modo per gestire questo senza scrivere il rilevamento per le collisioni tra __name__ e visualizzare i nomi?

risposta

0

La soluzione a cui ho aggiunto è l'aggiunta di un livello arbitrario di risorse contenitore.

seguito è riportato un esempio di struttura di risorse:

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 domanda cita voler generare URL risorse alla vista callable vista dal titolo. Con BarContainer si aggiunge solo una barra aggiuntiva:

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