一 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页面,只有登录才能看')

 

posted on 2022-12-10 15:44  wfw001  阅读(26)  评论(0编辑  收藏  举报