【问题标题】:global object access across the session in web2py?web2py中跨会话的全局对象访问?
【发布时间】:2011-05-24 08:50:52
【问题描述】:

我是 webdev 的新手,最近打算用 web2py 写一个 boradgame。

当开始编码时,我发现我不能轻易使用全局变量。

出于演示目的,我想要一个可供许多玩家访问的 python 列表对象,我使用 sqlite 使其工作。

数据库,(使用DAL('sqlite:memory:') 不起作用),所以我尝试了文件方式,它按我的想法工作:

memdb = DAL('sqlite://storage.sqlite')
memdb.define_table('room', Field('card_on_desk', 'blob'))

创建一个房间:

roomid = memdb.room.insert(card_on_desk=pickle.dumps(list()))
memdb.commit()

更改房间的 card_on_desk 字段:

record = memdb.room(roomid)
cards = pickle.loads(record.card_on_desk)
cards.append(','.join(c))
memdb(memdb.room.id==roomid).update(card_on_desk=pickle.dumps(cards))
memdb.commit()

有高手说有cache.ram()的方式,我想知道上面的东西怎么做。

等待您的回答。

S.Lott 提到我没有描述使用 DAL('sqlite:memory:') 时会发生什么:

使用sqlite:memory 而不是'sqlite://storage.sqlite',memdb 插入在 http 请求中没问题,但没有任何保存,每次我调用 memdb.room.insert() 返回我调用的时间以及请求的时间完成,内存中没有保存任何内容,memdb.room(1) 总是返回 None。

Anthony的建议比较有用,我会尽量用那个方法,有点难。

【问题讨论】:

  • “但它不起作用”?由于这没有任何意义,您将永远等待答案。也许你应该解释“但它不起作用”。
  • @S.Lott 好像你误会了我,抱歉我的描述不好。我的意思是DAL('sqlite:memory:') 不起作用,文件方式起作用。
  • @Gohan:看来你误解了我的意思。抱歉含糊其辞。 “行不通”没有任何意义。这是没有意义的。无法理解。您必须提供您实际得到的实际错误。总结(“行不通”)是不可接受的。事实(例如错误消息)是可以接受的。
  • 您看过caching 上的书籍部分吗——应该相当简单?此外,您通常不需要显式调用 commit() —— 事务会在每个请求结束时自动提交(请参阅here)。
  • @S.Lott 使用sqlite:memory 更新问题中的结果。 @Anthony 正在努力,但仍然感到困惑。

标签: python sqlite web2py cache-control


【解决方案1】:

如果你不需要持久化信息,那么你可以使用会话

session.myvariable

如果你需要持久化并且你想通过缓存加快速度,那么你可以缓存选择:

def cache_db_select():
    logs = db().select(db.log.ALL, cache=(cache.ram, 60))
    return dict(logs=logs) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-03
    • 2012-05-13
    相关资源
    最近更新 更多