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的时候,就会发现在前端是无法通过document.cookie获取到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来实现

django处理cookie的机制的更多相关文章

  1. Redis+Django(Session,Cookie)的用户系统

    一.Django authentication django authentication提供了一个便利的user api接口,无论在py中 request.user,参见Request and re ...

  2. 第十九章 Django的ORM映射机制

    第十九章 Django的ORM映射机制 第一课 Django获取多个数据以及文件上传 1.获取多选的结果(checkbox,select/option)时: req.POST.getlist('fav ...

  3. Redis+Django(Session,Cookie、Cache)的用户系统

    转自 http://www.cnblogs.com/BeginMan/p/3890761.html 一.Django authentication django authentication 提供了一 ...

  4. [py][mx]django的cookie和session操作-7天免登录

    浏览器同源策略(same-origin policy) csrf攻击防御核心点总结 django的cookie和session操作-7天免登录 flask操作cookie&django的see ...

  5. 12 Django之Cookie和Session

    一.什么是Cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接 ...

  6. web框架开发-Django组件cookie与session

    http协议的每一次都是无保存状态的请求,这会带来很多的不方便,比如,一刷新网页,或者进入该网页的其他页面,无法保存之前的登录状态.为了解决类似这样的问题,引入了会话跟踪 会话跟踪技术 1 什么是会话 ...

  7. 【转】Cookie/Session机制详解

    Cookie/Session机制详解   会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息 ...

  8. Django之Cookie、Session、CSRF、Admin

    Django之Cookie.Session.CSRF.Admin   Cookie 1.获取Cookie: 1 2 3 4 5 6 request.COOKIES['key'] request.get ...

  9. python 全栈开发,Day76(Django组件-cookie,session)

    昨日内容回顾 1 json 轻量级的数据交换格式 在python 序列化方法:json.dumps() 反序列化方法:json.loads() 在JS中: 序列化方法:JSON.stringfy() ...

随机推荐

  1. 分享一下我进入IT行业的经历

    今天突然根想写博客,就注册了一个,分享一下我的成长经历. 我第一次接触编程的时候是在上大学的时候,我学的专业是工程测量接触的第一个语言是vb,我记得很清楚,我当时写出第一个小Demo是的心情,感觉到了 ...

  2. telnet命令使用详解

    telnet命令用于登录远程主机,对远程主机进行管理.telnet因为采用明文传送报文,安全性不好,很多Linux服务器都不开放telnet服务,而改用更安全的ssh方式了.但仍然有很多别的系统可能采 ...

  3. mongo分布式集群搭建手记

    一.架构简介 目标 单机搭建mongodb分布式集群(副本集 + 分片集群),演示mongodb分布式集群的安装部署.简单操作. 说明 在同一个vm启动由两个分片组成的分布式集群,每个分片都是一个PS ...

  4. Java interview questions(No1)

    1.什么是构造和析构方法?功能是? 答: 构造方法: 每个类至少有一个构造方法,类初始化时调用的方法 1.方法名和类名相同 2.无返回值类型 格式:访问权限 类名(参数列表) {}; 1.自己定义构造 ...

  5. Node.js 部署免费/自动续订 HTTPS

    随着互联网快速发展,互联网信息安全越来越受到大家重视,HTTPS 应该是近两年各大厂商都在尽力普及的技术之一.国内大厂基本上已经全面普及了 HTTPS. 本文首发于我的个人网站:听说 - https: ...

  6. elfinder源码浏览-Volume文件系统操作类(1)

    今天看了一个文件管理的java后台源码,elfinder 发现这个东东比我写的代码效率告到不知道哪去了,苦思冥想后还是抽点时间看看吧.. 它实现了我们电脑上的所以关于文件操作的动作,并生成了api开放 ...

  7. 设计模式——原型模式(C++实现)

    #include <iostream> #include <string> using namespace std; class CPrototype { public: CP ...

  8. python 全栈开发,Day3(正式)

    一.基础数据类型 基础数据类型,有7种类型,存在即合理. 1.int 整数 主要是做运算的 .比如加减乘除,幂,取余  + - * / ** %...2.bool 布尔值 判断真假以及作为条件变量3. ...

  9. python 全栈开发,Day4(正式)

    一.列表 列表是python中的基础数据类型之一,它是以[]括起来,每个元素以逗号隔开,而且他里面可以存放各种数据类型比如: li = ['alex',123,Ture,(1,2,3,'wusir') ...

  10. python初识(一)

    python语言的发展 python语言诞生于1990年,由Guido van Rossum设计并领导开发. 1989年12月,Guido为打发圣诞节时间而开发的项目. python名字的由来,由于当 ...