HTTP被设计为”⽆态”,也就是俗称“脸盲”。 这⼀次请求和下⼀次请求之间没有任何状态保持,我们⽆法根据请求的任何⽅⾯(IP地址,⽤户代理等)来识别来⾃同⼀⼈的连续请求。
实现状态保持的⽅式:在客户端或服务器端存储与会话有关的数据(客户端与服务器端的⼀次通信,就是⼀次会话)
- cookie
- session
不同的请求者之间不会共享这些数据,cookie和session与请求者⼀⼀对应。
本篇文章大概说一下Django中两者的一些内容。
一、cookie
cookies 是浏览器为 Web 服务器存的⼀⼩信息。 每次浏览器从某个服务器请求⻚⾯时,都会⾃动带上以前收到的cookie。
我们看一下具体的定义:
Cookie是由服务器发给客户端的特殊信息,而这些信息以文本文件的方式存放在客户端,然后客户端每次向服务器发送请求的时候都会带上这些特殊的信息,用于服务器记录客户端的状态。
cookie保存在客户端,安全性较差,注意不要保存敏感信息
。
典型应⽤:
- 网站登录
- 购物车
⽤法:
# 1.设置cookie
HttpResponse.set_cookie(key, value='', max_age=None, expires=None,
path='/', domain=None, secure=None, httponly=False)
#2 获取cookie
HttpRequest.COOKIES.get(key)
# 3删除cookie
HttpResponse.delete_cookie(key, path='/', domain=None)
⼆、session
cookie看似解决了HTTP(短连接、⽆状态)的会话保持问题,但把全部⽤户数据保存在客户端,存在安全隐患,
于是session出现了。我们可以把关于⽤户的数据保存在服务端,在客户端cookie⾥加⼀个sessionID(随机字符串)。其⼯作流程:
(1)、当⽤户来访问服务端时,服务端会⽣成⼀个随机字符串;
(2)、当⽤户登录成功后 把 {sessionID :随机字符串} 组织成键值对加到cookie⾥发送给⽤户;
(3)、服务器以发送给客户端 cookie中的随机字符串做键,⽤户信息做值,保存⽤户信息;
(4)、再访问服务时客户端会带上sessionid,服务器根据sessionid来确认⽤户是否访问过⽹站
2.1 cookie和session的区别与联系
- 区别
- session将数据存储与服务器端 cookie存储在客户端
- cookie 存储在客户端,不安全,sess存储在服务器端,客户端只存sesseionid,安全
- cookie在客户端存储值有⼤⼩的限制,⼤约⼏kb。session没有限制
- 联系
session 基于cookie
2.2 session配置
- ⾸先在settings.py中有如下配置(系统默认)
INSTALLED_APPS = [
'django.contrib.sessions',
]
MIDDLEWARE = [
'django.contrib.sessions.middleware.SessionMiddleware',
]
- 进行数据迁移,生成session使用的数据库表
2.3 session操作
- session设置
# 设置session
request.session['username'] = username
return render(request, "a.html", context={
'code':1,
'msg':'成功’,
...
}
- session获取
def index(request):
# session获取
username = request.session.get('username')
return render(request,'a.html',context=
{'username':username})
- session删除
- clear()
清空所有session 但是不会将session表中的数据删除- flush()
清空所有 并删除表中的数据- logout()
退出登录 清除所有 并删除表中的数据- del req.session[‘key’]
删除某⼀个session的值
def logout(request):
request.session.flush()
return redirect(reverse("index"))
- session过期时间
req.session.set_expiry(5)
可以参考爬虫里总是用到的Cookie是什么?这篇文章讲的特别具体。