Web2py,存储在MySQL

时间:2016-02-24 15:15:24

标签: mysql session web2py pickle

为了使用cache.ram和ajax调用的进度条正常工作,需要清理(或只是解锁?)会话。 如果应用程序不使用会话变量传递给其他控制器,则session.forget(响应)就足够了。

另一方面,如果应用程序需要会话变量(因为我的应用程序确实如此) - 那么session.forget没有做太多好处,因为它会将会话变量链传输到其他控制器。

根据安东尼在Web2Py谷歌小组的另一篇文章(进度条和会话)中提出的建议:

我首先尝试使用cookies(最大zlib压缩 - 级别9)。 仍然不足以满足我的需求......我需要将每个会话超过10k传递给其他控制器,正如书中所提到的那样 - 如果会话预计很大,那么保持cookie会话并不是一个好的解决方案。比我假设的4k / cookie。

所以我正在尝试使用MySQL数据库的session.connect。 我可以看到正在填充的表web2py_session_AppName,我知道session_data列是用cPickle进行pickle的。 但是......看起来这个列中的数据,session_data是加密的,而不仅仅是pickle。

如何从MySQL表中取消session_data列中的信息? 我尝试使用cPickle.loads ...数据原样,数据为字符串...但它仍然会引发“糟糕的泡菜错误”

这是控制器:

def index():
    session.Yawza = 'Yawza from index'
    cache.ram(CacheKeyUID, lambda: 0, 0)
    return dict()

def cache_in_ram():
    for i in range(int(1e5)):
        avoda = int((i/(1e5))*100)
        cache.ram(CacheKeyUID, lambda:avoda, 0)
    session.Yawza = "Yawza from the cache_in_ram"
    redirect(URL('Test'))

def cache_reader():
    return cache.ram(CacheKeyUID, lambda: None, None)

def test():
    return dict(message = 'Long process ended')

以上将只有第一次进度条工作。之后,进度条将无法工作(由于多次ajax调用锁定) - 除非我手动清除会话或以编程方式执行 session.forget(响应),否则将消除session.Yawza。我需要这个session.Yawza用于其他目的而不是进度条,在其他控制器下游。

session.connect(request,response,cookie_key ='yoursecret',compression_level = 9)添加到我的db.py有帮助,但仅限于4k大小的cookie。我需要更大的饼干。因此,我开始在db中存储会话,在我的例子中是一个MySQL数据库。

在db.py中定义 session.connect(request,response,db)。我可以在MySQL中看到正在填充的表 web2py_session_AppName ,但我根本无法访问session.Yawza。 不是来自索引函数,也不是来自cache_in_ram函数。

这就是为什么我认为我应该手动取消对session_data列的修改...来访问必须隐藏在那里的session.Yawza。

以下是针对web2py_sessions_MyAppName的MySQL表的session_data列中可以找到的一小部分示例: gAJjZ2x1b24uZ2xvYmFscwpTZXNzaW9uCnEBfXECVQVZYXd6YXEDVQ1mcm9tIHRleHQgYm9 ...

对我来说它看起来不像是一个犹太人的泡菜...... ; - ))

为了从多个ajax调用中受益,没有会话锁定并且仍然使用会话变量将信息传输到其他控制器,我正在做什么或者没有正确地做什么?

1 个答案:

答案 0 :(得分:1)

您可以考虑是否可以更改长时间运行的cache_in_ram函数,而无需写入会话。在这种情况下,您可以在该函数的开头调用session.forget(response),即使使用默认的基于文件的会话(即,无需将会话移动到cookie或数据库),一切都将正常工作。

如果您必须在cache_in_ram请求中写入会话,您可以先解锁会话,然后运行长循环,然后重新打开会话并根据需要进行更新:

def cache_in_ram():
    session.forget(response) # Unlock the session file.
    for i in range(int(1e5)):
        avoda = int((i/(1e5))*100)
        cache.ram(CacheKeyUID, lambda:avoda, 0)
    session.connect() # Re-open/lock the session file.
    session._forget = False # Reverse the "forget" so we can write to the session.
    session.Yawza = "Yawza from the cache_in_ram"
    redirect(URL('Test'))

或者,您可以切换到在数据库中存储会话,该会话不会执行任何锁定,因此不会导致长时间运行的cache_in_ram请求阻止Ajax进度检查。在这种情况下,不需要手动从数据库中读取和取消对会话数据 - 只需像往常一样使用session对象。如果您发现在这种情况下无法按预期访问会话数据,那么您在设置连接或者如何写入/读取会话时都做错了。您应该发布一个单独的问题,显示您的所有代码。