django - 创建 Django session 时

标签 django django-sessions

我真的不明白 session 是什么时候创建的,以及它是根据什么实体创建的(每个 ip、每个浏览器、每个登录用户)。我在文档中看到默认情况下 session 是为每个访问者创建的 - 但什么是访问者(浏览器或 ip)?

最佳答案

什么是 HTTP session ?

要显示网页,您的浏览器会发送 HTTP向服务器发出请求,服务器发回 HTTP 响应。每次单击网站上的链接时,都会发生新的 HTTP 事务,即它不是随时间持续存在的连接(如电话)。您与网站的通信由许多单一的 HTTP 事务组成(数十或数百个电话,每个电话都是几个字)。

那么服务器如何记住用户的信息,例如用户登录(IP地址不可靠)?您第一次访问网站时,服务器会创建一个随机字符串,并在 HTTP 响应中要求浏览器使用该值创建所谓的 HTTP cookie。 cookie 实际上只是一个名称(cookie 的)和一个值。如果您访问一个简单的启用 session 的 Django 站点,服务器将要求您的浏览器使用这样一个随机生成的值设置一个名为“sessionid”的 cookie。

Screenshot of FireBug net tab, while making the first request to a Django site. It shows how a HTTP cookie is set.

以后您的浏览器向该域发出 HTTP 请求时,它将在 HTTP 请求中包含 cookie。

Shows how subsequent requests will include the cookie, that was set in the initial transaction.

服务器保存这些 session ID(对于 django,默认是保存在数据库中)并将它们与所谓的 session 变量一起保存。因此,基于与 HTTP 请求一起发送的 session ID,它可以挖掘出先前设置的 session 变量以及修改或添加 session 变量。如果您删除您的 cookie(在 Firefox 中为 ctrl+shift+delete),您将意识到没有网站再记得您(Gmail、Facebook、Django 站点等),您必须重新登录。大多数浏览器都允许您禁用一般性或特定网站的 cookie(出于隐私原因),但这意味着您无法登录这些网站。

每个浏览器,每个窗口,每个标签,每个 IP?

无法在同一浏览器中登录不同的 GMail 帐户,甚至无法从不同的窗口登录。但是可以使用 Firefox 登录一个帐户,使用 Chrome 登录另一个帐户。所以答案是:每个浏览器。然而,事情并不总是那么简单。您可以在 Firefox 中使用不同的配置文件,每个配置文件都可以保存不同的 cookie,因此您可以同时登录不同的帐户。还有用于保持多个 session 的 Firefox 插件,例如MultiFox .

session 完全取决于您的浏览器在其 HTTP 请求中发送的 session cookie。

玩转

为了充分了解发生了什么,我建议安装 FireBugFireCookie Firefox 插件。以上截图取自 FireBug 的网络面板。 FireCookie 将为您提供访问站点时设置 cookie 的时间和设置的概览,并让您管理允许使用哪些 cookie。

如果存在服务器端错误,并且您设置了 DEBUG=True,那么 Django 错误消息将显示有关 HTTP 请求的信息,包括发送的 cookie

enter image description here

关于django - 创建 Django session 时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11055654/

相关文章:

.all() 上的 Django QuerySet 评估

Django Rest框架在条件后禁用字段更新

python - requests.post() 的 CSRF 验证失败

django session 不在 iframe 中维护

django - 如果我的 Django 应用程序使用基于缓存的 session 后端,删除 `django_session` 表是否安全?

django - 如何在 Django session 中存储表单输入?

django-sessions - 在 Django 中,如何找到当前登录用户的所有其他事件 session ?

session - 用于 Django 中缓存 session 的 Redis 复制

django - 如何使用 django-sslify 在我的 Django+nginx+gunicorn Web 应用程序上强制使用 https,并依赖 Cloudflare 的新免费 SSL?

python - Django后台任务