2012-11-16 2 views
0

나를 걱정하는 것과 같은 문제가 있습니다. 거의 순회 만하는 앱이 있습니다.Zodb가 자동으로 필드를 저장하지 못하도록합니다.

내 관리 경로를 얻으려면 루트에 연결된 노드가 있어야합니다. __getitem__에 내 실제 루트 인 parent.__getitem__을 반환합니다. 내 의견에 containment. 이 관리 노드가 포함되어 있는지 확인할 수 있습니다.

재 라우트 할 때 문제가 발생합니다. 나는

class AdminRoot(object): 

    __acl__ = [ 
       (Allow, 'g:admin', ALL_PERMISSIONS), 
       (Deny, 'system.Everyone', ALL_PERMISSIONS), 
       ] 

    def __init__(self, parent, name): 
     self.__parent__ = parent 
     self.__name__ = name 

    def __getitem__(self, name): 
     item = Mapping.__getitem__(self.__parent__, name) 
     item.__parent__ = self                                        
     return item 

selfitem.__parent__에 영향을하면 그렇게합니다. 때때로 부모 노드로 저장됩니다. 따라서 request.resource_url 일을 할 때. 관리자 루트 또는 실제 루트에서 출력됩니다.

이 영향이 전혀 저장되지 않았 으면 좋겠습니다.

답변

0

Persistent 개체에 속성을 설정할 때마다 해당 속성이 ZODB에 저장됩니다 (트랜잭션 중단을 트리거 한 예외가없는 경우).

ZODB에서 개체는 실제로 하나의 부모와 표준 URL 만 가질 수 있습니다. 최소한 __parent__ 속성을 조작하지 않고 그러한 객체를 여러 개의 URL로 표시하도록 설정하는 것은 좋지 않습니다.

대신 대체 URL을 제공하려면 __resource_url__() 메소드를 제공해야합니다. 휘발성 속성을 사용하면 그러한 메소드를 사용하기 위해 객체에 비 영구 정보를 저장할 수 있습니다.

휘발성 속성은 _v_으로 시작하는 모든 속성이며 지속성 엔진에서 무시됩니다.

+0

심지어 관리 노드의 필요성은'acls'을 지정하는 것이 었습니다. 지금은 일부 경로에서 임의 액세스가 거부 될 수 있습니다. –

+0

''__parent__'을 어딘가에 부모를 저장하는 속성으로 만들고 찾지 못한다면 진짜 부모를 반환 할 것입니다. –

+0

불행히도, 그렇게 할 수있는 좋은 방법이 없다고 생각합니다. 휘발성 속성은 객체가 언로드 될 때만 각 요청에서 삭제되지 않습니다. 깔끔하게 할 수있는 유일한 방법은 가로 질러서 urldispatch를 사용하는 것입니다. –