定义
从打开浏览器,输入网址回车,返回页面,到关闭退出浏览器,叫做完成了一次会话。
由于http 协议是无状态的,无法保持会话状态,用户再次访问该网站时,又要重新认证。所以需要一种方法来保持会话状态,避免重复的认证
保持会话有以下两种存储技术:
cookies
session 会话保持,django后端只需要简单设置session,返回的响应会带着sessionid---->Vue代理处理存储并存储到cookie
Cookies
在浏览器端,开辟一块存储空间,将保持会话状态的数据存储在浏览器端
Chrome -->开发者工具–>application–>Storage–>Cookies
FireFox–>开发者工具–>Storage–>Cookies
Cookies数据
- key-value键值对存储,均为ASCII字符串
- 数据有过期时间,过期后自动删除,需重新认证
- 按域隔离存储,不同的域间无法访问,不同的url 地址有不同的Cookies
- 每次访问网站时,将数据带到服务端认证,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的使用:
- 配置session
#settings.py
INSTALLED_APPS = [
"django.contrib.sessions",
]
MIDDLEWARE = [
"django.contrib.sessions.middleware.SessionMiddleware"
]
SESSION_COOKIE_AGE = 3600 #sessionid在Cookies的过期时间
- 使用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
- 过期的session数据
session 是存储在服务端的数据库中,浏览器Cookies中的sessionid过期后,服务端的session数据不会自动删除,需要手动删除
python3 manage.py clearsessions
练习session会话保持
- GET 请求/index/ 主页,服务端判断是否有session会话保持,有则返回主页index.html,无则返回login.html
- 用户第一次登录后,服务端进行会话保持,短时间内用户再次GET 请求/index/ 或者/login/ 直接跳转到主页index.html
完整代码
提取码:g099