2012-03-07 9 views
2

トラバーサルと全リソースとコンテキストの概念を私のquestionから理解したので、ドキュメントに記載されているようにハイブリッドルーティングを使ったチュートリアルの例を試しました。次add_route構成でhttp://example.com/product/123/edit::私は供給したときに ピラミッドトラバーサルとURLディスパッチと異なるルート

  1. config = Configurator(settings=**settings, root_factory=RootFactory) 
    config.add_route('product_edit', '/product/{pid}/edit', factory=ProductFactory, traverse='/{pid}/edit') 
    
    config.add_view(route_name='product_edit', name='edit', renderer='edit.mako') 
    
    は、それがあることを意味しています、私は、次のURLを通過した場合

    :いない場合、私は一種のいくつかのマイナーな問題のためにそれを理解します製品ファクトリをadd_routeファンクションに追加すると、ルートリソースファクトリが製品ファクトリに変更されます(したがって、製品ファクトリは新しいルートリソースになりました)。

  2. ルートリソースが実際に私がProductFactoryの__parent__ & __name__の属性を設定するだろうか、トラバーサルのためProductFactoryに変更された場合は? __parent__Noneになるように見えるので、私は正しいですか?

ここに私のProductFactoryのコードは次のとおりです。

class ProductFactory(object): 
    __name__ = 'product' 
    __parent__ = None 

    def __getitem__(self, key): 
     if key.isnumber(): 
      try: 
       p = sess_.query(model.Product).filter(pid=key).one() 
      except: 
       raise DBException() 
      if p: 
       return p 
      else: 
       return KeyError 

答えて

3

「工場」paramはそのルートのコンテキスト(および間接的にACL)を決定するためにそれを使用するようにピラミッドを伝えます。

定義によるルートリソースには親がありません。したがっては実際には存在しません。今あなたのコードを見て、私はそれが動作するかどうかはわからないが、これはあなたが望むものを達成する必要があります。

config = Configurator(settings=**settings, root_factory=RootFactory) 
config.add_route('product_edit', '/product/*traverse', factory=ProductFactory) 

config.add_view(route_name='product_edit', name='edit', renderer='edit.mako', context=model.Product) 
関連する問題