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/')