Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
django会话中的竞争条件_Django_Session_Django Rest Framework - Fatal编程技术网

django会话中的竞争条件

django会话中的竞争条件,django,session,django-rest-framework,Django,Session,Django Rest Framework,我有一个使用django的API,它使用会话: def api_a(request): request.session["foo1"] = "bar1" return Response({}) def api_b(request): request.session["foo2"] = "bar2" return Response({}) 如果我调用api_a,那么api_b,request.ses

我有一个使用django的API,它使用会话:

def api_a(request):
  request.session["foo1"] = "bar1"
  return Response({})

def api_b(request):
  request.session["foo2"] = "bar2"
  return Response({})
如果我调用
api_a
,那么
api_b
request.session
设置为
{foo1:bar1,foo2:bar2}
,这是预期的行为

但是,如果我同时调用
api_a
api_b
(调用由JavaScript前端执行),似乎每次调用开始时,
request.session
都是空的,每次调用只使用一个元素保存会话,结果是
request.session
设置为
{foo1:bar1}
foo2
缺失)(或反之亦然)

是否有方法更改会话行为以解决此竞争条件

注意:会话是用Redis配置的(但我不确定它是否相关):


很难“回答”,因为这取决于您尝试执行的操作。使用默认缓存后端,整个会话都是单个对象,因此这是不可避免的。需要一种新策略。可能需要在“会话”之外保存单个密钥对象使用redis,或实现新行为的自定义会话后端?这是当前的计划。但是,应该提到它,并在某个地方发出警告,该会话容易出现争用情况,应该只用于一个密钥。(想象一个具有
请求的在线商店。会话[item]=amount
,它几乎会被破坏)很难“回答”,因为这取决于您尝试执行的操作。使用默认缓存后端,整个会话都是单个对象,因此这是不可避免的。需要一种新策略。可能需要在“会话”之外保存单个密钥对象使用redis,或实现新行为的自定义会话后端?这是当前的计划。但是,应该提到它,并在某个地方发出警告,该会话容易出现争用情况,应该只用于一个密钥。(想象一个具有
请求的在线商店。会话[item]=amount
,它几乎会被破坏)
CACHES = {"default": {"BACKEND": "django_redis.cache.RedisCache",}}
SESSION_ENGINE = "django.contrib.sessions.backends.cache"