一 cookies简述
Cookie的由来
大家都知道HTTP协议是无状态的。
无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不
会受前面的请求响应情况直接影响,也不会直接影响后面的请求响应情况。
一句有意思的话来描述就是人生只如初见,对服务器来说,每次的请求都是全新的。
状态可以理解为客户端和服务器在某次会话中产生的数据,那无状态的就以为这些数据不会被保留。会话中
产生的数据又是我们需要保存的,也就是说要“保持状态”。因此Cookie就是在这样一个场景下诞生。
什么是Cookie
Cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏
览器会自动携带这些键值对,以便服务器提取有用信息。
Cookie的原理
cookie的工作原理是:由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会
自动带上Cookie,这样服务器就能通过Cookie的内容来判断这个是“谁”了。
二 设置cookie
rep = HttpResponse(...)
rep = render(request, ...)
rep.set_cookie(key,value,...)
rep.set_signed_cookie(key,value,salt='加密盐', max_age=None, ...)
# 参数:
# key, 键
# value='', 值
# max_age=None, 超时时间(只能用于除IE以外的浏览器)
# expires=None, 超时时间(可兼容于IE)
# path='/', Cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问
# domain=None, Cookie生效的域名
# secure=False, https传输
# httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
三 获取cookie
request.COOKIES['key']
request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
参数:
# default: 默认值
# salt: 加密盐
# max_age: 后台控制过期时间
四 例子
def login(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
if username == 'jason' and password == '123':
# 用户可能访问了一个页面,但是没登录,就让他去登录了
# 登陆完以后,还让他重新回到他上次想访问的页面
# 拿到用户上次想访问的页面(装饰器里设置的next)
old_path = request.GET.get('next')
# 如果old_path有值,就让他跳过去
if old_path:
obj = redirect(old_path)
# 如果old_path没值,就让跳到home
else:
obj = redirect('/home/')
# 用户登录成功 往浏览器设置一个cookie键值对
# expires(可兼容IE):cookie超时时间,这里写的是一周
# 除了IE,其他浏览器也可用 max_age 参数
obj.set_cookie('name', 'jason', expires=7*24*3600)
return obj
return render(request, 'login.html')
from functools import wraps
# 可能有很多页面,就装饰器帮我干跳转到登录页面的活
def login_auth(func):
@wraps(func)
def inner(request, *args, **kwargs):
# 校验cookie
# 没跳转之前,先拿到第一次访问的页面
old_path = request.get_full_path()
if request.COOKIES.get('name'):
return func(request, *args, **kwargs)
return redirect('/login/?next=%s' % old_path)
return inner
@login_auth
def index(request):
return HttpResponse('index页面,只有登录才能看')
@login_auth
def home(request):
return HttpResponse('home页面,只有登录才能看')
@login_auth
def xxx(request):
return HttpResponse('xxx页面,只有登录才能看')