【问题标题】:Why Django blocks simultaneous requests within the same session?为什么 Django 会阻止同一会话中的同时请求?
【发布时间】:2012-05-17 06:07:49
【问题描述】:

我尝试在视图的第一行添加sleep(30)。之后,我在两个浏览器选项卡中打开了这个页面。第一个标签页在 30 秒后加载,第二个标签页在 60 秒后加载。与此同时,我能够从另一台电脑打开页面就好了。所以看起来 Django 阻止了来自同一个客户端的并发请求。

这非常适合我的应用程序。而且我想确保我的网站将来会以这种方式工作。但是我没有找到任何描述这种 Django 行为的文档或文章。所以我仍然不确定这是一个功能还是只是运气。有人可以解释一下它是如何以及为什么起作用的吗?

我真正需要的是在视图处理时阻止会话。当然我可以使用一些标志或数据库事务。但我不想添加已经在 Django 中实现的功能。

我使用 python 2.6.5、django 1.4、ubuntu 服务器、nginx 和 uwsgi。尝试了 postgresql 和 sqlite。

我的 uwsgi 设置:

<uwsgi>
    <pythonpath>/home/admin/app/src</pythonpath>
    <app mountpoint="/">
        <script>deploy.wsgi</script>
    </app>
    <workers>4</workers><!-- Not sure this is needed -->
    <processes>2</processes>
</uwsgi>

runserver 命令也有同样的效果。

【问题讨论】:

  • 你实际运行的是什么服务器(ubuntu 只是它运行的操作系统,而不是服务器本身)Apache?独角兽?你用的是内置的django服务器(即python manage.py runserver)吗?
  • 对不起,我忘记了服务器 :) 刚刚用服务器详细信息更新了问题。
  • 您是否使用某些基于浏览器的开发工具(例如:chrome dev tools: Network)查看延迟是否会缩短加载时间?
  • Chrome 开发工具在第一个选项卡上显示 30 秒,在第二个选项卡上显示 60 秒。然而,我发现了另一个有趣的事情。请参阅下面的回复。

标签: django session concurrency


【解决方案1】:

实际上 Django 不会阻止同时请求。

如果我在同一个会话中运行两个浏览器(例如 chrome 和 firefox)(通过将 sessionid cookie 从第一个浏览器复制到第二个浏览器),则不会发生阻塞。所以,这是一个浏览器功能,无论如何它与 Django 无关。这意味着我仍然需要自己添加一些阻塞功能以确保代码安全。

【讨论】:

  • 您是否找到任何方法来配置 Django/nginx 以在会话中强制执行顺序处理?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-20
  • 2017-03-19
  • 2015-12-17
相关资源
最近更新 更多