一、Cookie
Cookie的由来:
由于HTTP是无状态的,浏览器的每次请求对于服务端来说都是全新的,而在某种特定的情况下,我们需要浏览器保持当前的某种状态,因此就产生了Cooke。
先来介绍一下Cookie:
Cookie是服务器发送出来存储到浏览器中的一组组键值对,浏览器再次访问该该服务器时,会自动携带这些键值对,以便服务器从中提取有用的信息,而服务器也可以通过这些键值对来判断不同的用户。
Cookie的使用:
1.设置Cookie
from django.shortcus import HttpResponse, render, redirect
response = HttpResponse(...)
response = render(...)
response = redirect(...)
response.set_cookie(key, value, ...)
response.set_signed_cookie(key, value, salt=‘..‘, ..) # 设置签名cookie
其它参数:
max_age = None, # 超时时间,单位是s
expires = None, # 超时时间,datetime格式
path = ‘/‘, # 生效的路径
domain = None, # Cookie生效的域名
secure = False, # https传输
httponly = False, # 只能http传输,无法被JS获取(除抓包)
2.获取Cookie的value:
request.COOKIES[key]
request.get_signed_cookie(key, default=RAISE_ERROR, salt=‘..‘, max_age=None)
3.删除Cookie:
4.Cookie版登陆校验:
def check_login(func):
@wraps(func)
def inner(request, *args, **kwargs):
next_url = request.get_full_path()
if request.get_signed_cookie("login", salt="SSS", default=None) == "yes":
# 已经登录的用户...
return func(request, *args, **kwargs)
else:
# 没有登录的用户,跳转刚到登录页面
return redirect("/login/?next={}".format(next_url)) #加这个的原因在于让登陆页面获取到它的值,然后在登陆成功之后,就自动跳转到先前登陆的页面
return inner
def login(request):
if request.method == "POST":
username = request.POST.get("username")
passwd = request.POST.get("password")
if username == "xxx" and passwd == "dashabi":
next_url = request.GET.get("next")
if next_url and next_url != "/logout/":
response = redirect(next_url)
else:
response = redirect("/class_list/")
response.set_signed_cookie("login", "yes", salt="SSS") # 设置cookie
return response
return render(request, "login.html")
@check_login
def index(request):
return render(request, ‘index.html‘)
二、Session
Session的由来:
虽然Cookie的出现解决了HTTP请求无状态的问题,但Cookie本身有两个缺陷:a. Cookie本身最大支持4096个字节;b. Cookie保存在客户端的浏览器上,容易被拦截或窃取,不安全。在这种情况下Session就出现了。
Session的介绍:
Session和Cookie本质上是共通的,只是Session中的key(自动生成的字符串)作为浏览器中Cookie的value保存在本地,而Session中的key(自动生成的字符串)和value(自定义格式存储的用户信息,如user)则以字典形式保存在服务器的数据库中。
而Session依赖于Cookie,当Django用到Session时,数据库中的key就会随机生成一段字符串,保存到浏览器Cookie的value中,而这段字符串是Session用来寻找用户信息(value)的唯一标识。