Django Cookies 和 Session 小结

前言:HTTP被设计为”无状态”,在一次请求和下一次请求之间没有任何状态保持,服务器无法识别来自同一客户端的连续请求。因此,Cookies和Session应运而生。

1、Cookies

Cookies由Web服务器产生,是Web服务器发送给客户端的一小段信息。客户端会将这段信息保存在本地某个目录下的文件内。当客户端再次发送请求时,可以发送该信息到服务器端,这样服务器端就知道该客户端早前访问过我。就相当于街头暗号,我告诉你一个暗号,再次见面时你一说暗号,我就知道是你。cookie的应用之一是判断用户是否已经登录。

Django Cookie 和 Session 小结_客户端

django中,写cookies,可以使用set_cookie()方法,有点像往字典里添加key-value

def my_set_cookie(request):
...
# set a cookie on the response
response = HttpResponse()
response.set_cookie("cookie", {cookie_content})
...

读cookies,request.COOKIES就像一个字典,我们可以通过key得到value,就像下面这样:

def my_get_cookie(request):
...
request.COOKIES["cookie"])
...

Cookies的缺点在于,不可靠和不安全。

  • 首先,浏览器不一定要保存cookies,用户可以通过设置选择是否保存cookie。
  • 另外,cookie是有生命周期的(通过Expire设置),如果超过周期,cookie就会被清除。
  • 最后,HTTP数据通过明文发送,容易受到攻击,因此不能在Cookies中存放敏感信息。

2、Session

session 又叫做“会话”,用于存取会话信息, 这些数据在服务器端存储,并对cookie的收发进行了抽象。 Cookies只存储数据的哈希会话ID,而不是数据本身,从而避免了大部分的常见cookie问题。

Session工作的流程如下:

  • 客户端向服务器发送请求时,看本地是否有cookie文件。如果有,就在HTTP的请求头(Request Headers)中,包含一行cookie信息。
  • 服务器接收到请求后,根据cookie信息,得到sessionId,根据sessionId找到对应的session,用这个session就能判断出用户是否登录等等。如果session超时被销毁了,那么服务器会生成新的sessionId发回给客户端。客户端收到新的sessionId后,更新本地cookie文件中的信息,下次访问时就会使用新的cookie信息。

在Django中,Session功能通过中间件SessionMiddleware来实现。在使用过程中,可以像使用字典一样使用它。​​request.session["password"] = "asdf"​

Session的另外一种使用方式是:像Model一样使用它,比如

from django.contrib.sessions.models import Session

# session由32字节的Hash串标识,可以用数据库API来存取session
# session数据存储在数据库表django_session中
s = Session.objects.get(pk='2b1189a188b44ad18c35e113ac6ceead')
s.session_data

使用Session的好处在于,即使用户关闭了浏览器,session仍将保持到会话过期。

Cookies与Session常用于用户的登录与退出,在这一方面,Django为我们提供了更方便的API:User对象,这里不过多讨论。

本文参考了django book,留作学习参考之用~