2016-05-13 16 views
6

ट्रैवर्सल पिरामिड ऐप में, कोई संसाधन डब्ल्यू/__name__ को कैसे देखता है जो दृश्य के नाम से मेल खाता है?पिरामिड ट्रैवर्सल __name__ एक दृश्य नाम से मेल खाता है

यदि मैं संसाधन के लिए कॉल करने योग्य "दृश्य" देखने के लिए जाना चाहता था, तो मैं एक यूआरएल पथ का उपयोग करता हूं जैसे: /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__) 

कि पथ मैं request.resource_url(resource, "view" का उपयोग करेंगे के लिए URL प्राप्त करने के)।

हालांकि, अगर मेरे पास संसाधन था कि Bar.__name__ = "view", मैं फू पर "व्यू" के लिए यूआरएल कैसे हल कर सकता हूं?

# 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/viewview(Foo, request) को इंगित होता है, और /foo/view/viewview(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) 
संबंधित मुद्दे