【问题标题】:Django responding to different request from different browser with one python sessionDjango 使用一个 python 会话响应来自不同浏览器的不同请求
【发布时间】:2015-07-19 21:58:24
【问题描述】:

我实际上是一个 php(CodeIgniter) 网络开发人员,虽然我喜欢 python,但我刚刚安装了 Bitnami's Django Stack,它安装了 Apache、MySQL、PostgreSQL 和 Python 2.7.9,并安装了 Django。在安装过程中,它生成了一个简单的 Django 项目。

虽然我看起来很熟悉,但我开始向它添加一些代码行,但是当我保存它并刷新页面甚至重新启动浏览器时,我发现 python 实例仍在运行旧脚本。仅当我重新启动 Apache 服务器时脚本才会更新(我相信这就是 Python 实例被终止的地方)。

所以,为了用 Python 澄清这个问题,我创建了一个简单的视图并将其 URL 指向 r'^test/'

from django.http import HttpResponse

i = 0

def test_view(request):
    global i
    i += 1
    return HttpResponse(str(i))

然后我发现,即使在不同的浏览器之间切换,i 的值也会不断增加,即在另一个浏览器中继续增加值。

那么,谁能告诉我这是 Django 的默认行为还是我的 Apache 安装有问题。

【问题讨论】:

  • 这就是为什么 a) 您不在 Web 应用程序中使用全局变量,b) 您使用开发服务器而不是 Apache 进行开发。
  • 如果这个东西以这种方式工作,那么 MySQL 会话锁定如何成为可能 bcos 似乎 python 会话永远不会结束,即使没有什么要处理的。
  • 对不起,我不明白你的意思。 MySQL会话锁与什么有什么关系?为什么要锁定表呢?你在说什么 Python 会话?
  • 我想我可能对 MySQL 会话锁感到困惑。但这似乎与我从 PHP bcos 中了解到的完全不同,PHP $_SESSION 是一个全局变量,但它对每个用户都不同。

标签: python django apache python-2.7 bitnami


【解决方案1】:

这是默认行为,如果您在运行 gunicorn 并在 X 请求后杀死工人,它可能重置,我不记得了。之所以这样,是因为应用程序在请求得到处理后继续运行。

我使用 PHP 已经有一段时间了,但我相信,有一个请求进来,php 开始运行一个返回输出的脚本,然后该脚本终止。除了$_SESSION 之类的特殊全局变量之外,没有什么可以真正跨越请求。

您的 Django 应用程序启动并继续运行,除非有东西告诉它重新加载(使用 ./manage.py runserver 运行时,它会在检测到代码更改时重新加载,这是您在开发期间想要的)。

如果您对每位访问者的数据感兴趣,请参阅session data。它看起来像:

request.session['i'] = request.session.get('i', 0) + 1

您可以在其中为访问者存储数据,这些数据会一直存在,直到他们失去会话。

【讨论】:

  • 所以不像 PHP 为每个请求创建一个单独的实例,Django 只为所有请求使用一个实例,这就是让 Django 不异步的原因吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-25
  • 2015-08-08
  • 2014-03-25
  • 2016-01-23
  • 2015-06-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多