django会话中的竞争条件
我有一个使用django的API,它使用会话: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
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"