【问题标题】:sql alchemy + pyramid, "request cache"sql alchemy + 金字塔,“请求缓存”
【发布时间】:2013-03-13 09:36:55
【问题描述】:

我正在制作一个网站,使用金字塔、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:这不是真正的代码,因为网站是模块化的,所以很难知道什么时候会被使用两次

【问题讨论】:

    标签: caching sqlalchemy pyramid chameleon template-tal


    【解决方案1】:

    只需在您的模板中调用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>
    

    【讨论】:

    • 在这种情况下是的......但由于我的网站是模块化的,用户可以在同一页面内个性化多个小部件和页面,因此很难知道“计数”将是多少次调用,有时可能会被分配多次......或者没有
    • 这更接近我的需要,我想要更直接的东西,但如果必须这样做,它可能没那么糟糕
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-21
    • 1970-01-01
    • 2012-06-02
    • 2015-05-20
    • 2020-08-26
    • 2012-09-18
    • 1970-01-01
    相关资源
    最近更新 更多