Zope3のスキンの仕組み
nsParseで名前空間と検索名が変わる。:
>>> nsParse('@@contents.html')
('view', 'contents.html')
>>> nsParse('++vh++http:www.example.com:80')
('vh', 'http:www.example.com:80')
>>> nsParse('++skin++Boston')
('skin', 'Boston')
nsParseで得た名前空間を使ってTraverseする。
++skin++Bostonなら、skinの名前空間のITraversableを使って処理を行う。:
class skin(view):
def traverse(self, name, ignored):
self.request.shiftNameToApplication()
skin = zope.component.getUtility(ISkin, name)
applySkin(self.request, skin)
return self.context
applySkinでrequestにスキンのインターフェースをdirectlyProvidesしている。
スキンはインターフェース。レイヤーもインターフェース。
スキンインターフェースはレイヤーインターフェースを継承している。
ビューアダプタはレイヤに所属している。リクエストがスキンインターフェースをdirectlyProvidesしているので
アダプタの検索でビューアダプタを見つけることができる。
securityproxiedされたオブジェクトのアトリビュートから取得したオブジェクトもまたsecurityproxiedされる。
つまりtraverseして得たオブジェクトはsecurityproxiedされることになる。securityedproxiedされたオブジェクトを アダプトするときは必要に応じてtrustedアダプタにする必要あり。自分でproxyを外すのはやめよう。
| Last edited Sat, 09 Sep 2006 18:44:35 +0900 | Edit this page |