Django会话变量有时会在多线程环境中丢失



我试图在每个会话中缓存一组字符串,方法是将每个字符串存储在它们自己的变量中,并使用django.contrib.session.

我有以下代码:

import copy
def get_result(request, operation):
    previous_result = request.session.get(operation.name)
    if previous_result:
        result = copy.deepcopy(previous_result)
    else:
        result = get_json_response(operation)
        request.session[operation.name] = copy.deepcopy(result)
    return result

get_result()是

  1. 通过ajax请求触发
  2. 用于可以同时调用的许多不同操作
  3. 在一个会话中每个操作可以调用多次

这段代码在我的本地环境中运行得非常好。然而,在安装了gevent和chausette的生产服务器中,它失败了。

大多数情况下,request.seession.get(operation.name)会返回None,即使这不是第一次为该操作调用get_result。在某些情况下,它会返回一个值,但在某些情况中,它不会。它什么时候起作用,什么时候不起作用,似乎没有什么规律。

我怀疑这种不一致性是因为不同的线程在不同的状态下引用会话变量。在这种情况下,处理会话变量的正确方法是什么?

事实上,我也遇到了同样的问题,并试图通过您发布的调整来正确保存会话。

最后,解决我问题的是将settings.py中的默认缓存更改为

'BACKEND': 'django.core.cache.backends.dummy.DummyCache',

使用FileBasedCache也有帮助,但它会在本地环境中崩溃(开发)。假人适用于当地和生产。

最新更新