Django-cookie

一: 概述

大家都知道HTTP协议是无状态的。

无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后面的请求响应情况。

一句有意思的话来描述就是人生只如初见,对服务器来说,每次的请求都是全新的。

状态可以理解为客户端和服务器在某次会话中产生的数据,那无状态的就以为这些数据不会被保留。会话中产生的数据又是我们需要保存的,也就是说要“保持状态”。因此Cookie就是在这样一个场景下诞生。

 

Cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务器提取有用信息。

 

cookie的工作原理是:由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上Cookie,这样服务器就能通过Cookie的内容来判断这个是“谁”了。

 

 

 

 

 

二: cookie方法

2.1 设置cookie

2.1.1 设置普通的cookie

HttpResponse对象.set_cookie(key=' ',value=' ')

属性

  • key, 键
  • value='', 值
  • max_age=None, 超时时间 7天  7*24*60*60  单位为秒
  • expires=None, 超时时间(IE requires expires, so set it if hasn't been already.) 针对IE浏览器
  • path='/', Cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问
  • domain=None, Cookie生效的域名
  • secure=False, https传输
  • httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)

2.1.2  设置签名cookie

HttpResponse对象.set_signed_cookie(self, key, value, salt='', **kwargs)

属性

  • key   cookie的key
  • value  cookie的value
  • salt  cookie签名的盐

2.2 获取cookie

2.2.1 获取普通的cookie

request.COOKIES.get('key',默认值)

 

 

2.2.2 获取签名的cookie

 request.get_signed_cookie(self, key, default=RAISE_ERROR, salt='', max_age=None)

 

2.3 删除cookie

方式:delete_cookie(self, key, path='/', domain=None)

 

  

三: 范例

3.1 普通cookie

def login(request):
    if request.method == 'POST':

        name = request.POST.get('user')
        pwd = request.POST.get('pwd')
        if name == 'wangys' and pwd == '123':
            ret = redirect('/cs/home/')
            ret.set_cookiOe(key='is_login',value=True)
            return ret

    return render(request,'login.html')


def home(request):
    ret = request.COOKIES.get('is_login')
    print(ret)
    return JsonResponse({'page': 'home'})

  

3.2 签名cookie

def login(request):
    if request.method == 'POST':

        name = request.POST.get('user')
        pwd = request.POST.get('pwd')
        if name == 'wangys' and pwd == '123':
            ret = redirect('/cs/home/')
            ret.set_signed_cookie('is_access',True,salt='wangys')
            return ret

    return render(request,'login.html')


def home(request):
    ret = request.get_signed_cookie(key='is_access',default=False,salt='wangys')
    if ret:
        return JsonResponse({'page': 'home'})
    else:
        redirect('/cs/login')

  

3.3  登出

def logout(request):
    rep = redirect('/cs/login/')
    rep.delete_cookie('is_access')
    return rep

 

3.4 装饰器cookie校验

from django.shortcuts import render,redirect
from django.http import JsonResponse,HttpResponse
from functools import wraps
# Create your views here.


def check_login(func):
    @wraps(func)
    def inner(request,*args,**kwargs):
        is_access = request.get_signed_cookie(key='is_access', default=False, salt='wangys')
        if is_access:
            ret = func(request,*args,**kwargs)
            return ret
        else:
            next_url = request.path_info
            return redirect('/cs/login/?next={}'.format(next_url))
    return inner



def login(request,*args,**kwargs):
    if request.method == 'POST':

        name = request.POST.get('user')
        pwd = request.POST.get('pwd')
        next_url = request.GET.get('next')
        print(next_url)
        if name == 'wangys' and pwd == '123':
            if next_url:
                ret = redirect('{}'.format(next_url))
            else:
                ret = redirect('/cs/home/')
            ret.set_signed_cookie('is_access',True,salt='wangys')
            return ret

    return render(request,'login.html')

@check_login
def home(request):
    return render(request,'home.html')

@check_login
def index(request):
    return render(request,'index.html')



def logout(request):
    rep = redirect('/cs/login/')
    rep.delete_cookie('is_access')
    return rep

  

 

 

 

 

 

 

 

 

 

 

  

 

posted @ 2019-09-13 17:06  择一事,终一生  阅读(106)  评论(0)    收藏  举报