在金字塔应用程序中,我有一些资源对象也是SQLAlchemy ORM对象。对于这些对象,我需要在类型级别(即在类级别)表达一些权限,通常可以执行类似这样的操作(将acl指定为类字段):
class MyModelClass(Base):
__acl__ = []
但是,我也有一些权限,其内容需要在运行时计算,在加载ORM类之后,通常可以执行此操作(将acl指定为实例上的可调用对象):
class MyModelClass(Base):
def __acl__(self):
return my_dynamic_acl
我的问题是,我想为同一个班级做这两件事,这可能吗?如果我按原样混合上面的两个,则callable会隐藏类字段,这样就不会有效。
我希望在类和实例级别都指定权限的原因是我有一些操作(例如" new")无法访问模型对象,并且因此相应的路线工厂将提供MyObject的类(类级别 acl 是我想要生效的那个);我有其他操作在MyObject的一个实例上运行(这些操作需要动态计算,因此不能在类字段 acl 中声明),对于这些我将拥有route factory返回MyObject的实例,在这种情况下,我希望金字塔看到在实例上创建的 acl 。
迈克尔
答案 0 :(得分:3)
您需要手动将默认acls与动态acls合并。这需要在代码中使用更多的框架来实现,但不是太难。
class MyModelClass(Base):
__default_acl__ = []
__acl__ = __default_acl__ # helpful if you're doing this on a base class
def __acl__(self): # overrides the base class' __acl__ attribute with a dynamic one
dynamic_acl = []
return self.__default_acl__ + dynamic_acl