Django cookie与session

cookie与session关系

cookie      是保存在客户端浏览器的键值对,浏览器发送请求时候会自动携带。

session    1、生成随机字符串
           2、回给浏览器,让它写到cookie  # {"sessionID":"234asd243dv35fd"}
           3、自己保留一份,作为一个key,存到一个地方,key后面对应一个保存用户相关信息的键值
                          session-key           session-data
                          234asd243dv35fd       {"user":"alex"

 概念

cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie因此诞生

cookie工作原理

用户在浏览器登录后,服务端根据用户的登录信息生成键值对(也就是cookie),保存用户的个人信息,然后将键值对返回给浏览器,浏览器保存在本地。当浏览器再次访问时,就会自动将这个键值对(cookie)带上,这样服务端就能通过cookie的内容判断这个用户是谁了。

cookie虽然在一定程度上解决了保持状态的需求,但由于cookie本身最大支持4096字节的数据,以及cookie本身是明文保存在客户端,很容易被拦截或窃取。因此就需要一种能够支持保存更多数据,并且保存在服务端,且具有较高安全性的机制,这就是session

session工作原理

session是基于cookie工作的

  1. 用户登录后,服务端随机生成一个字符串,将这个随机字符串作为键值对(cookie)的value,而键值对的key则是由Django的session配置中自定义,默认情况下是sessionid,组成的cookie就{'sessionid':'xxxxxxxxxx'},服务端将这个cookie返回给浏览器,这样,浏览器本地只保存着一个随机字符串;
  2. 服务端再将第1步中生成的随机字符串做为key,由用户信息产生的字典做为value,组成一个键值对,保存在服务器端;假设随机字符串是"abc123",那组成的键值对理论上类似这样:{'abc123'{'login':true,'username':'jassin'}}
  3. 下次用户访问时,浏览器带着cookie,服务端根据cookie中的随机字符串就可以找到对应的用户信息了。

session的好处浏览器端只存在一个随机字符串,避免用户信息被直接暴露在外。

from django.shortcuts import render
from app01 import models
def login(request):
    # 记录日志
    if request.method == 'GET':
        pass
    else:
        user = request.POST.get('user')
        pwd = request.POST.get('pwd')
        obj = models.UserInfo.objects.filter(user=user,pwd=pwd).first()
        if obj:
            # 用户名和密码正确
            """
                {
                    “xxxx的随机字符串”:{'id':1,'name':'jassin'},
                    “xx的随机字符串”:{'id':11},
                }

                表:
                session_key           value
                xxxx的随机字符串   asfasdfasdfasdfwer2342fszdfsdfs

            1. 生成随机字符串
            2. 把随机字符串写到客户端浏览器cookie中
            3. 在内存中大字典写入:
                {
                    随机字符串: {'id':用户id}
                }
            """
            request.session['id'] = obj.id
            request.session['name'] = obj.name

        else:
            # 用户名和密码错误
            pass
def home(request):
    """
    :param request:
    :return:
    """
    """
    1. 获取客户端cookie中的随机字符串
    2. 如果有:
            则获取 key 对应的值
            否则 返回None

    """
    user_id = request.session.get('id')


def temp(request):
    data_list = {
        'k1':'sf4sdf'
    }
    return render(request,'temp.html',data_list)

 Django实现的cookie

获取Cookie

request.COOKIES['key']
request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
    参数:
        default: 默认值
           salt: 加密盐
        max_age: 后台控制过期时间

 

原文地址:https://www.cnblogs.com/jassin-du/p/8378220.html