Django与Cookie

Cookie

Cookie的由来

​ 大家都知道HTTP协议是无状态的。无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后面的请求响应情况。也就是说,对服务器来说,每次的请求都是全新的。

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

什么是Cookie

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

Cookie的原理

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

Cookie的应用

  • 登录
  • 投票
  • 记录网页的浏览习惯

Django中设置Cookie

在response响应上再加一层cookie头

rep = HttpResponse(...)
rep = render(request, ...)

rep.set_cookie(key,value,...)  # 设置普通cookie
rep.set_signed_cookie(key,value,salt='加密盐',...)  # 设置加密cookie

【参数说明】

  • key ,设置键
  • value='', 设置值
  • max_age=None, 设置超时时间,超时后cookie失效,默认是关闭浏览器失效
  • expires=None, 超时时间(IE requires expires, so set it if hasn't been already.)
  • path='/', Cookie生效的路径,/ 表示根路径,默认情况下是根路径,特殊的:根路径的cookie可以被任何url的页面访问;如果设定好路径,就只能去到该路径了
  • domain=None, Cookie生效的域名
  • secure=False, https传输
  • httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)

【示例】

def login(request):

    if request.method == "POST":
        user = request.POST.get('user')
        pwd = request.POST.get("pwd")
        if user == 'gailun' and pwd == '12345':
            # 校验成功,设置登陆状态
            ret = redirect("/home/")
            ret.set_cookie('status','1')  # 1 表示登陆成功
            return ret
        else:
            error = '用户名或密码错误'
            return render(request,'login.html',{"error":error})
    return render(request,'login.html')

chrome浏览器打开开发者工具,在network选项卡下可以查看cookies

Django中获取Cookie

request.COOKIES.get(‘key’,none)
或者根据键值对的特点用key找value
request.COOKIES['key']   

request.get_signed_cookie('key', default=RAISE_ERROR, salt='', max_age=None)  #default也可以改为'',获取不到值的时候就不会报错了

【get_signed_cookie方法的参数说明】

  • default: 默认值
  • salt: 加密盐
  • max_age: 后台控制过期时间

Django中删除Cookie

rep = render(request, ...)
rep.delete_cookie('key')

【案例】

def check(func):  # 装饰器,登陆验证
    # 读取cookie
    def inner(request,*args,**kwargs):
        # status = request.COOKIES.get("status")
        status = request.get_signed_cookie('status',default='Error',salt='jjzz')
        if status != '1':
            return redirect(f"/login/?returnurl={request.path_info}")   # request.path_info当前访问的地址
        else:
            ret = func(request,*args,**kwargs)
            return ret
    return inner

def login(request):

    if request.method == "POST":
        user = request.POST.get('user')
        pwd = request.POST.get("pwd")

        if user == 'gailun' and pwd == '12345':
            info = request.GET.get("returnurl")
            # 校验成功,设置登陆状态
            if info:
                ret = redirect(f"{info}")  # request.path_info获取的地址是含有//的
            else:
                ret = redirect("/home/")

            # ret.set_cookie('status','1')  # 1表示登陆成功
            ret.set_signed_cookie('status','1','jjzz')
            return ret
        else:
            error = '用户名或密码错误'
            return render(request,'login.html',{"error":error})
    return render(request,'login.html')

@check
def home(request):
    return  HttpResponse("welcome to home page")

@check
def index(request):
    return  HttpResponse("welcome to index page")

@check
def logout(request):
    ret = redirect("/login/")
    ret.delete_cookie('status')
    return ret
posted @ 2019-09-26 12:52  Aries-X  阅读(162)  评论(0编辑  收藏  举报