天天看点

刨析django---会话保持定义Cookiessession练习session会话保持

会话保持

  • 定义
  • Cookies
    • Cookies数据
    • 设置Cookies
    • 代码示例
    • 原理详解
    • 练习
  • session
  • 练习session会话保持

定义

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

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

保持会话有以下两种存储技术:

cookies

session

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("拒绝请求")
           

原理详解

刨析django---会话保持定义Cookiessession练习session会话保持

练习

1.配置一个路由 /login/

请求方式 :ajax发送POST请求,提交用户的登录数据

视图login:接收用户的数据,并设置Cookies

response.set_cookie(“name”,"",max_age=300)

在浏览器端查看Cookies

2. 用户再次访问/login/ 查看效果

3. 删除浏览器端的Cookies,在次访问/login/ 查看效果

代码

提取码:ms7h

注意事项:

刨析django---会话保持定义Cookiessession练习session会话保持

爬虫使用Cookies登录

刨析django---会话保持定义Cookiessession练习session会话保持

session

在服务端,开辟一块存储空间,存储保持会话状态的数据,返回一个sessionid,存入Cookies

刨析django---会话保持定义Cookiessession练习session会话保持

session的使用:

  1. 配置session
#settings.py

INSTALLED_APP = [
	"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”)

    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

继续阅读