创建django会话时

时间:2012-06-15 17:40:45

标签: django django-sessions

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

2 个答案:

答案 0 :(得分:14)

什么是HTTP会话?

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

那么服务器如何记住用户的信息,例如用户登录(ip地址不可靠)?第一次访问网站时,服务器会创建一个随机字符串,并在HTTP响应中要求浏览器创建一个带有该值的所谓HTTP cookie。 Cookie实际上只是(cookie的名称)和值。如果你去一个简单的启用会话的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.

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

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

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

会话全部取决于您的浏览器在其HTTP请求中发送的会话cookie。

玩耍

为了全面了解正在发生的事情,我建议为Firefox安装FireBugFireCookie插件。上面的截图来自FireBug的网络面板。 FireCookie将概述您访问网站时设置的时间和Cookie,并允许您规定允许使用哪些Cookie。

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

enter image description here

答案 1 :(得分:12)

它的浏览器(不是IP)。会话基本上是存储在服务器上的数据,由作为cookie发送到浏览器的会话ID标识。浏览器将在所有后续请求中发回包含会话ID的cookie,直到浏览器关闭或cookie过期(取决于随cookie头发送的过期值,您可以使用set_expiry从Django控制)。 / p>

服务器也可以通过基本上忽略浏览器发送的(未到期的)cookie并要求启动新会话来使会话到期。

关于会话的工作原理有很好的描述here