sql alchemy + pyramid,“请求缓存”

时间:2013-03-23 15:56:40

标签: caching sqlalchemy pyramid chameleon template-tal

我正在建立一个网站,使用金字塔,sqlalchemy和变色龙...... 在view.py上我发送了sqlalchemy:

@view_config(route_name='entity_subpage')
def entity_subpage_view(request):
    dbsession = DBSession()
    User = dbsession.query(Users).filter_by(id=0).first()
    return render_to_response('page.pt', User=User, request=request)

和变色龙:

<a tal:condition="user.minions.filter_by(dead=0).count() > 1">Prev</a>
<a tal:condition="user.minions.filter_by(dead=0).count() > 1">Next</a>
<repeat tal:omit-tag="" tal:repeat="_page user.minions">
    <condition tal:omit-tag="" tal:condition="not minion.dead"> 
        <li>
             ${minion.name}
        </li>
    </condition>
</repeat>

但sqlalchemy“user.minions.count()”运行两次,所以我在模型上添加了这个:

class Users(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String(convert_unicode=True))
    minions = dynamic_loader("Minions", backref="User")
    _NumFixedMinions = None

    @property
    def NumAliveMinions(self):
        if not self._NumFixedMinions:
            self._NumFixedMinions = self.minions.filter_by(dead=0).count()
        return self._NumFixedMinions

并开始使用“NumFixedMinions”而不是“.count()”,但这使得_NumFixedMintions定义,直到我重新启动服务器,我错过了什么?或者是否有任何方法只在请求期间制作一个简单的“缓存”..

ps:这不是真正的代码,因为网站是模块化的,所以很难知道什么时候会被使用两次

1 个答案:

答案 0 :(得分:2)

只需在模板中调用count()

<tal:links tal:condition="user.minions.filter_by(dead=0).count() > 1">
    <a>Prev</a>
    <a>Next</a>
</tal>

有关您希望在请求中使用的信息,我会使用request property;如果您将reify设置为True,那么它在使用时只会计算一次

def entity_subpage_view(request):
    dbsession = DBSession()
    User = dbsession.query(Users).filter_by(id=0).first()

    def dead_minion_count(request):
        return User.minions.filter_by(dead=0).count()

    request.set_property(dead_minion_count, 'dead_minion_count', reify=True)

    return render_to_response('page.pt', User=User, request=request)

然后

<tal:links tal:condition="request.dead_minion_count > 1">
    <a>Prev</a>
    <a>Next</a>
</tal>