Django丨cookie与session

cookie与session


cookie是存储在客户端计算机上的文本文件,并保留了各种跟踪信息。

识别返回用户包括三个步骤:

  • 服务器脚本向浏览器发送一组Cookie,例如:姓名 、年龄或识别号等

  • 浏览器将这些信息存储在本地计算机上,已备将来使用。

  • 当下一次浏览器向Web服务器发送任何请求时,浏览器会把这些Cookie信息发送到服务器,服务器将使用这些信息来识别用户。

HTTP是一种"无状态"协议,每次客户端检索网页时,客户端打开一个单独的连接到Web服务器,服务器会自动不保留之前客户端请求的任何记录。

Cookies

一个Web服务器可以分配一个唯一的session会话ID作为每个Web客户端的cookie,对于客户端的后续请求可以使用接受到的cookie来识别。

在Web开发中,使用session来完成会话跟踪,session底层依赖Cookie技术。
在这里插入图片描述

Django中Cookie的语法

设置cookie

rep.set_cookie(key, value,...) 
rep.set_signed_cookie(key, value, salt='加密盐',...)

获取cookie

request.COOKIES.get(key)

删除cookie

rep = HttpResponse || render || redirect 
rep.delete_cookie(key)

示例

def login(request):
    if request.method == "GET":
        return render(request, "login.html")
    username = request.POST.get("username")
    password = request.POST.get("pwd")

    user_obj = models.UserInfo.objects.filter(username=username, password=password).first()
    print(user_obj.username)

    if not user_obj:
        return redirect("/login/")
    else:
        rep = redirect("/index/")
        rep.set_cookie("is_login", True)
        return rep
       
def index(request):
    print(request.COOKIES.get('is_login'))
    status = request.COOKIES.get('is_login') # 收到浏览器的再次请求,判断浏览器携带的cookie是不是登录成功的时候响应的 cookie
    if not status:
        return redirect('/login/')
    return render(request, "index.html")


def logout(request):
    rep = redirect('/login/')
    rep.delete_cookie("is_login")
    return rep # 点击注销后执行,删除cookie,不再保存用户状态,并弹到登录页面
   
def order(request):
    print(request.COOKIES.get('is_login'))
    status = request.COOKIES.get('is_login')
    if not status:
        return redirect('/login/')
    return render(request, "order.html")
Session(保存在服务端的键值对)

服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据在各自的session中,当用户再去访问该服务器中的其它web资源时,其他web资源再从用户各自的session中取出数据为用户服务。

在这里插入图片描述

工作原理
  • 浏览器第一次请求获取登录页面login

  • 浏览器输入账号密码第二次请求,若输入正确,服务器响应浏览器一个index页面和一个键为sessionid,值为随机字符串的cookie,即set_cookie(“sessionid”,随机字符串)

  • 服务器内部再django.session表中记录一条数据。
    djiango session表中三个字段:

    • session_key:存的是随机字符串,即响应给浏览器的cookie的sessionid键对应的值
    • session_data:存的是用户的信息,即多个request.session[“key”]=value,且是密文
    • expire_data:存的是该条记录的过期时间(默认14天)
  • 浏览器第三次请求其他资源时,携带cookie(sessionid:随机字符串),服务器django.session表中根据该随机字符串取出该用户的数据,供其使用(即保存状态)

注意:django.session表中保存的是浏览器的信息,而不是每一个用户的信息。

同一浏览器多个用户请求只保存一条记录(后面覆盖前面),多个浏览器请求菜保存多条记录。

session设置

request.session["key"] = value

执行步骤:

  • 生成随机字符串
  • 把随机字符串和设置的键值对保存到django_session表的session_key和session_data里
  • 设置cookie:set_cookie(“sessionid”,随机字符串)响应给浏览器

session获取

request.session.get('key')

执行步骤:

  • 从cookie中获取sessionid键的值,即随机字符串。
  • 根据随机字符串从django_session表过滤出记录
  • 取出session_data字段的数据

session删除,删除整条记录(包括session_key、session_data、expire_data三个字段)

request.session.flush()

删除session_data里的其中一组键值对

del request.session["key"]

执行步骤:

  • 从cookie中获取sessionid键的值,即随机字符串
  • 根据随机字符串从django_session表过滤出记录
  • 删除过滤出来的记录

示例

def login(request):
    if request.method == "GET":
        return render(request, "login.html")
    username = request.POST.get("username")
    password = request.POST.get("pwd")

    user_obj = models.UserInfo.objects.filter(username=username, password=password).first()
    print(user_obj.username)

    if not user_obj:
        return redirect("/session_login/")
    else:
        request.session['is_login'] = True
        request.session['user1'] = username
        return redirect("/s_index/")


def s_index(request):
    status = request.session.get('is_login')
    if not status:
        return redirect('/session_login/')
    return render(request, "s_index.html")


def s_logout(request):
   # del request.session["is_login"] # 删除session_data里的一组键值对
    request.session.flush() # 删除一条记录包括(session_key session_data expire_date)三个字段
    return redirect('/session_login/')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值