django处理cookie的机制


title: django处理cookie的机制
tags: djaogo, cookie, session
grammar_cjkRuby: true
---

cookie的意义

在多数日常使用的网站中,都需要用到cookie的机制。
凡是需要登录后按用户身份进行功能使用的网站,大多数使用了cookie机制。

==那么,cookie是什么呢?==

cookie是用来标示用户身份的,可以标示特定的用户
每个用户都有自己特定的cookie

我们可以通过cookie拿到用户标示,识别用户,进而达到给每个用户提供不一样的页面的可能性。

通过一个例子看下cookie的使用场景。
在之前的博客中,我们讲述了一个简单的登陆的例子。

其中就有使用cookies的功能

            
def index(request):
     msg = ""
     username = request.get_cookie("username"):
     if username:
          return render(request, 'index.html', {'username': username})
     else:
         return render(request, 'login.html')

可以看到 ,后端通过request.get_cookie方法得到了之前的程序段放到cookie中的username
这样,就通过cookie把用户名读出来了

==有关cookie的一些API参数设置==

HttpResponse.set_cookie(key, value='', max_age=None, expires=None,
path='/', domain=None, secure=None, httponly=False)
设置一个cookie。参数与Python 标准库中的Morsel Cookie 对象相同。
max_age 以秒为单位,如果Cookie只应该持续客户端浏览器的会话时长则应该为None(默认值)
如果没有指定expires,则会通过计算得到。
expires 应该是一个 UTC "Wdy, DD-Mon-YY HH:MM:SS GMT"
格式的字符串,或者一个datetime.datetime 对象。如果expires 是一个datetime 对象,则max_age 会通过计算得到。
如果你想设置一个跨域的Cookie,请使用domain 参数。例如,domain=".lawrence.com"
将设置一个www.lawrence.com blogs.lawrence.com 和calendars.lawrence.com
都可读的Cookie。否则,Cookie 将只能被设置它的域读取。
如果你想阻止客服端的JavaScript 访问Cookie,可以设置httponly=True。
HTTPOnly 是包含在HTTP 响应头部Set-Cookie 中的一个标记。它不是RFC 2109 中Cookie
的标准,也并没有被所有的浏览器支持。但是,如果使用,它是一种降低客户端脚本访问受保护的Cookie 数据风险的有用的方法

警告

RFC 2109 和RFC 6265 都声明客户端至少应该支持4096个字节的Cookie。对于许多浏览器,这也是最大的大小。如果视图存储大于4096 个字节的Cookie,Django
不会引发异常,但是浏览器将不能正确设置Cookie。

我们做点简单的实验,看看这些参数的意义是怎样的

首先,我们给cookies设置过期时间
max_age 的单位是秒

我们把上面的程序段改写如下:

#coding:utf-8
from django.shortcuts import render
from django.shortcuts import redirect
from app01 import models

def login(request):
    # models.Administrator.objects.create(username = "root", password =
    # "123123")
    msg = ''
    if request.method == 'POST':
        print 'start...'
        print request.method
        username = request.POST.get('username')
        password = request.POST.get('password')
        c = models.Administrator.objects.filter(username = username,
                password = password).count()
        if c:
            rep = redirect('/index.html')
            rep.set_cookie('username', username, max_age = 20)
            rep.set_cookie('email', "aaabbb")
            return rep
        else:
            msg = "用户名密码有错误"
            return render(request, "login.html", {'msg': msg})
    return render(request, 'login.html', {'msg': msg})

我们通过设置max_age可以看到,设置20秒的过期时间,当登陆之后,页面在20秒后会退回到登陆页

domain参数用于设置作用域,防止跨域问题,设置了作用域之后,则该cookie只能在该域名下生效,其他域名是读取不到这个cookie的

httponly选项则是限定是否只能通过正常的http访问的方式得到cookie的值
如果不设置这个值或者设置为False的话
那么是可以在浏览器的调试模式通过documen.cookie方法得到cookie的值的

httponly未设置或者设置为False时,可以在前端读取cookie

当我们设置httponly为False的时候,就会发现在前端是无法通过document.cookie获取到cookie的值的

httponly设置为True时,对应的cookie不可以通过前端读取到

即使使用了httponly = True的方式或者是set_sign_cookie的方式,还是不够安全,因为可以通过抓包等方式获取cookie的内容

还有种cookie叫做signed_cookie
其实就是对cookie进行了编码,实现了一定程度上的cookie加密功能

  request.set_signed_cookie(k, v, salt = "XXXXX")

参数简要说明:
k,v 是键值对
salt是加密盐

那么,怎么达到既保证安全又能让用户有个性化的服务呢?
答案是把敏感信息放到数据库中保存
非敏感信息可以放到cookie里面去

cookie和session有什么区别

cookie是客户端的
session是服务端的
但是session的目的也是为了标记客户端,所以session也需要借助cookie来实现

转载于:https://www.cnblogs.com/haozike/p/python_django_cookie.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值