Mar*_*ark 6 python django session multithreading race-condition
总结:Django会话中是否存在竞争条件,如何防止它?
我对Django会话有一个有趣的问题,我认为由于同一用户的同时请求而涉及竞争条件.
它出现在一个脚本中,用于同时上传多个文件,在localhost上进行测试.我认为这很可能同时发生来自同一用户的请求(由于本地主机的响应时间很短,因文件上传而导致请求时间过长).尽管如此,在localhost之外的正常请求仍然可能,但不太可能.
我发送了几个(文件发布)请求,我认为这样做:
request.session['files'](字典)request.session['files']再次存储字典这里的检查将指示信息确实已存储在会话中.但是,未来的请求表明有时它有,有时它没有.
我认为正在发生的是这些请求中的两个(A和B)同时发生.请求A request.session['files']首先检索,然后B执行相同的操作,更改并存储它.当A终于完成时,它会用B覆盖会话更改.
两个问题:
在更改之前检索会话数据并立即保存它应该会减少我认为的机会.但是我还没有找到办法做到这一点request.session,只能使用它来解决它django.contrib.sessions.backends.db.SessionStore.但是我认为如果我改变它,那么Django将request.session在请求结束时覆盖它.
所以我需要一个request.session.reload()和request.session.commit(),基本上是这样.
是的,请求可以在另一个请求完成之前启动.您可以通过在视图的开头和结尾打印一些内容来检查这一点,并同时启动一堆请求.
实际上,会话在视图之前加载并在视图之后保存.您可以使用重新加载会话request.session = engine.SessionStore(session_key)并使用保存request.session.save().
但是重新加载会话会丢弃之前添加到会话中的任何数据(在视图中或之前).在重新加载之前保存会延迟加载点.更好的方法是将文件作为新模型保存到数据库.
答案的实质在于托马斯答案的讨论,这个答案是不完整的,所以我发表了完整的答案.
| 归档时间: |
|
| 查看次数: |
1350 次 |
| 最近记录: |