摘要:Django 会话中是否存在竞争条件,我该如何防止它?
我对 Django 会话有一个有趣的问题,我认为这涉及由于同一用户的同时请求而导致的竞争条件。
它发生在一个同时上传多个文件的脚本中,正在本地主机上进行测试。我认为这使得来自同一用户的同时请求很可能(由于本地主机的响应时间低,由于文件上传导致的长请求)。不过,本地主机之外的正常请求仍然是可能的,只是可能性较小。
我正在发送几个我认为这样做的(文件发布)请求:
- Django 自动检索用户的会话*
- 需要一些时间的无关代码
- 获取
request.session['files']
(字典) - 将有关当前文件的数据附加到字典
request.session['files']
再次存储字典- 检查它是否确实已存储
- 更多不相关的代码需要时间
- Django 自动存储用户的会话
此处 6. 处的检查将表明信息确实已存储在会话中。但是,未来的请求表明有时它有,有时它没有。
我认为正在发生的是其中两个请求(A 和 B)同时发生。请求 Arequest.session['files']
首先检索,然后 B 执行相同操作,更改并存储它。当 A 最终完成时,它会覆盖 B 的会话更改。
两个问题:
- 这真的是正在发生的事情吗?django开发服务器是多线程的吗?在谷歌上,我正在寻找关于使其成为多线程的页面,这表明默认情况下它不是?否则,可能是什么问题?
- 如果这种竞争条件是问题所在,解决它的最佳方法是什么?这是一个不便,但不是安全问题,所以如果机会可以显着减少,我已经很高兴了。
我认为在更改之前检索会话数据并在之后立即保存应该会显着降低机会。但是我还没有找到一种方法来解决这个问题request.session
,只能使用django.contrib.sessions.backends.db.SessionStore
. 但是我认为如果我以这种方式更改它,Django 只会request.session
在请求结束时覆盖它。
所以我需要一个request.session.reload()
and request.session.commit()
,基本上。