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