Django中的Cookie和Session


Cookie和Session

什么是Cookie

在网站开发中,使用HTTP协议传输数据。HTTP协议是无状态的协议,一旦数据交换完毕,客户端和服务器端的连接就会关闭,再次交换数据需要建立新的连接。这也就意味着服务器无法从连接上跟踪会话。Cookie的出现就是为了解决这个问题,它可以弥补HTTP协议无状态的不足。在Session出现之前,基本上所有的网站都是采用Cookie来跟踪会话。用户第一次登录后服务器会返回一些数据(这里指Cookie)给浏览器,浏览器将数据保存在本地,当用户再次发送请求时,浏览器会将请求数据及Cookie一同提交给服务器。服务器检查Cookie信息,以此来确认用户状态。不同浏览器有不同的存储Cookie大小,但一般不超过4KB。

什么是Session

Session 是另一种记录客户状态的机制,是一次浏览器和服务器的交互的会话。会话是什么呢? 浏览器请求一次服务器,服务器接收请求,处理之后,给出响应,这就是一次会话。为了记录 Session,在客户端和服务器端都要保存数据,客户端Cookie中记录一个标记(session_id),服务器端不但存储了这个标记同时还存储了这个标记映射的数据(key-value)。在服务器端记录的 key-value,其中key是指 session_id,value是指Session的详细内容。用户在做HTTP请求时,会生成一个随机且唯一的 session_id,并传递给服务器,服务器把它存储在内存中。然后服务器根据这个session_id 来查询Session的内容(即value)。当关闭页面时,此session_id会自动注销,重新登录此页面时, 又会再次生成随机且唯一的session_id。

Django操作Cookie

设置Cookie

设置Cooki是设置值给浏览器的。因此需要通过response的对象来设置。设置Cookie可以通过response.set_cookie来设置,这个方法有如下的相关参数:

  • key:cookie的key;
  • value:cookie的value;
  • max_age:生命周期,单位是秒;
  • expires:过期时间。跟max_age类似,不过expires需要传递一个具体的日期。如果同时设置了max_ageexpires,将会使用expires的值作为过期时间;
  • path:对域名下哪个路径有效,默认是对域名下所有路径都有效;
  • domain:针对哪个域名有效。默认是针对主域名有效,若只针对某个子域名才有效,那么可以设置这个属性;
  • secure:是否是安全的,如果设置为True,那么只能在HTTPS协议下才可用;
  • httponly:默认是False。若为True,那么在客户端不能通过JavaScript进行操作。
from django.http import HttpResponse
from datetime import datetime


def index(request):
    response = HttpResponse("index")
    # response.set_cookie("username", "laobai",max_age=180)
    expires = datetime(year=2024, month=1, day=1, hour=0, minute=0, second=0)
    response.set_cookie("username", "laobai", expires=expires)
    return response

删除Cookie

通过delete_cookie方法即可删除cookie。实际上删除cookie就是将指定的cookie的值设置为空的字符串,然后将过期时间设置为0,也就是关闭浏览器后就过期。

from django.http import HttpResponse

def delete_cookie(request):
    response = HttpResponse('delete')
    response.delete_cookie('username')
    return response

获取Cookie

from django.http import HttpResponse

def get_cookie(request):
    cookies = request.COOKIES
    username = cookies.get('username')
    return HttpResponse(username)

Django操作Session

django中的session默认情况下是存储在服务器的数据库中,在表中会根据sessionid来提取指定的session数据,然后再把这个sessionid放在cookie中发送给浏览器存储,浏览器下次再向服务器发送请求的时候会自动的把所有cookie信息都发送给服务器,服务器再从cookie中获取sessionid,最后再从数据库中获取session数据。具体操作时,通过request.session实现。

session的常用方法:

  • get:从session中获取指定值;
  • pop:从session中删除一个值;
  • keys:从session中获取所有的键;
  • items:从session中获取所有的值;
  • clear:清除当前这个用户的session数据;
  • flush:删除session并且删除在浏览器中存储的session_id,一般用在注销功能上;
  • set_expiry(value):设置过期时间;
    • 整型:代表秒数,表示多少秒后过期;
    • 0:代表只要浏览器关闭,session就会过期;
    • None:会使用全局的session配置。在settings.py中可以设置SESSION_COOKIE_AGE来配置全局的过期时间。默认是1209600秒,也就是2周的时间。
  • clear_expired:清除过期的session。Django并不会清除过期的session,需要手动清理或在终端使用python manage.py clearsessions命令来清除过期的session。
from django.http import HttpResponse

def session_view(request):
    request.session['username'] = ['laobai']
    # username = request.session.get('username')
    # username = request.session.pop('username')
    # print(username)
    keys = request.session.keys()
    items = request.session.items()

    # request.session.clear()
    request.session.flush()
    return HttpResponse('session view')

修改session的存储机制

默认情况下,session数据是存储到数据库中的,可以通过设置SESSION_ENGINE来更改session的存储位置:

  • django.contrib.sessions.backends.db:使用数据库。默认就是这种方案。
  • django.contrib.sessions.backends.file:使用文件来存储session。
  • django.contrib.sessions.backends.cache:使用缓存来存储session。想要将数据存储到缓存中,前提是你必须要在 settings.py 中配置好 CACHES ,并且是需要使用Memcached,而不能使用纯内存作为缓存。
  • django.contrib.sessions.backends.cached_db:在存储数据的时候,会将数据先存到缓存中,再存到数据库中。这样就可以保证万一缓存系统出现问题,session数据也不会丢失。在获取数据的时候,会先从缓存中获取,如果缓存中没有,那么就会从数据库中获取。
  • django.contrib.sessions.backends.signed_cookies:将session信息加密后存储到浏览器的cookie中。这种方式要注意安全,建议设置SESSION_COOKIE_HTTPONLY=True,那么在浏览器中不能通过js来操作session数据,并且还需要对settings.py中的SECRET_KEY进行保密,因为一旦别人知道这个SECRET_KEY,那么就可以进行解密。在cookie中,存储的数据不能超过4kb。

文章作者: 老百
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 老百 !
  目录