刨析django---会话保持

定义

从打开浏览器,输入网址回车,返回页面,到关闭退出浏览器,叫做完成了一次会话。

由于http 协议是无状态的,无法保持会话状态,用户再次访问该网站时,又要重新认证。所以需要一种方法来保持会话状态,避免重复的认证

保持会话有以下两种存储技术:
cookies
session 会话保持,django后端只需要简单设置session,返回的响应会带着sessionid---->Vue代理处理存储并存储到cookie

Cookies

在浏览器端,开辟一块存储空间,将保持会话状态的数据存储在浏览器端

Chrome -->开发者工具–>application–>Storage–>Cookies
FireFox–>开发者工具–>Storage–>Cookies

Cookies数据

  1. key-value键值对存储,均为ASCII字符串
  2. 数据有过期时间,过期后自动删除,需重新认证
  3. 按域隔离存储,不同的域间无法访问,不同的url 地址有不同的Cookies
  4. 每次访问网站时,将数据带到服务端认证,Cookies过大会影响响应速度

设置Cookies

response.set_cookie(key,value,max_age=300,expires=“2021-05-03”)
key,value为具体数据
max_age最大过期时间的秒数
expires具体过期时间 日期字串

若不指定过期时间,关闭浏览器时,数据丢失

代码示例

#views.py
def index(request):
	res = HttpResponse("设置 Cookies OK")
	#设置Cookies
	res.set_cookie("name","lauf",max_age=300)
	
	#删除Cookies
	#res.delete_cookie(key)
	return res

#验证浏览器提交的Cookies数据
def validate(request):
	cookies = request.COOKIES  #字典对象
	name = cookies.get(name)
	if name == "lauf":
		return HttpResponse("处理请求")
	else:
		return HttpResponse("拒绝请求")

原理详解

在这里插入图片描述

练习

1.配置一个路由 /login/
请求方式 :
GET,返回登录页面login.html;
POST,ajax发送POST请求,提交用户的登录数据
视图login:
GET请求时,判断用户是否已经登录,已经登录则响应 ’已经登录‘
POST请求时,接收用户的数据,并设置Cookies
response.set_cookie(“name”,"",max_age=300)
在浏览器端查看Cookies
2. 用户再次访问/login/ 查看效果
3. 删除浏览器端的Cookies,再次访问/login/ 查看效果

代码
提取码:ms7h

注意事项:
在这里插入图片描述

爬虫使用Cookies登录
在这里插入图片描述

session

在服务端,开辟一块存储空间,存储保持会话状态的数据,返回一个sessionid(自动跟随响应),存入Cookies;
下次请求,浏览器自动携带Cookie(中的sessionid)
删除会话保持:在服务端删除session即可

在这里插入图片描述

session的使用:

  1. 配置session
#settings.py

INSTALLED_APPS = [
	"django.contrib.sessions",
]
MIDDLEWARE = [
	"django.contrib.sessions.middleware.SessionMiddleware"
]

SESSION_COOKIE_AGE = 3600 #sessionid在Cookies的过期时间

  1. 使用session
    #会话保持
    request.session[“name”] = user
    #查询是否登录
    request.session.get(“name”)

#退出登录,仅仅删除session
del request.session[“name”]

#views.py
from django.shortcuts import render,redirect
from django.http import HttpResponse
from django.http import HttpResponseRedirect
from django.http import JsonResponse
import json

def index(request):

    #判断用户是否完成认证
    session_ = request.session.get("name",None)
    print("main page validate session",session_)

    if session_ is None:
        return render(request,"login.html")
    else:
        #已经认证,允许进入主页
        return render(request,"index.html")

def login(request):
    if request.method == "GET":

        # 判断用户是否完成认证
        session_ = request.session.get("name", None)
        print("login validate session:", session_)

        #有session认证
        if session_:
            print("有session回话保持")
            print(session_)
            return redirect("/index/")

        else:
            #没有session认证
            print("第一次登录,无session")

            return render(request,"login.html")

    elif request.method == "POST":

        print("接受到ajax的数据",request.body)
        json_str = request.body
        json_obj = json.loads(json_str)

        user = json_obj.get("user")
        pw = json_obj.get("pw")
        #validate user & pw

        #set session
        request.session["name"] = user
        res = JsonResponse({"code":200,"data":"登录成功"})
        return res

  1. 过期的session数据
    session 是存储在服务端的数据库中,浏览器Cookies中的sessionid过期后,服务端的session数据不会自动删除,需要手动删除
python3 manage.py clearsessions

练习session会话保持

  1. GET 请求/index/ 主页,服务端判断是否有session会话保持,有则返回主页index.html,无则返回login.html
  2. 用户第一次登录后,服务端进行会话保持,短时间内用户再次GET 请求/index/ 或者/login/ 直接跳转到主页index.html

完整代码
提取码:g099

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

laufing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值