详解Python的Django框架中的Cookie相关处理


Posted in Python onJuly 22, 2015

浏览器的开发者在很早的时候就已经意识到, HTTP's 的无状态会对Web开发者带来很大的问题,于是(cookies)应运而生。 cookies 是浏览器为 Web 服务器存储的一小段信息。 每次浏览器从某个服务器请求页面时,它向服务器回送之前收到的cookies

来看看它是怎么工作的。 当你打开浏览器并访问 google.com ,你的浏览器会给Google发送一个HTTP请求,起始部分就象这样:

GET / HTTP/1.1
Host: google.com
...

当 Google响应时,HTTP的响应是这样的:

HTTP/1.1 200 OK
Content-Type: text/html
Set-Cookie: PREF=ID=5b14f22bdaf1e81c:TM=1167000671:LM=1167000671;
      expires=Sun, 17-Jan-2038 19:14:07 GMT;
      path=/; domain=.google.com
Server: GWS/2.1
...

注意 Set-Cookie 的头部。 你的浏览器会存储cookie值( PREF=ID=5b14f22bdaf1e81c:TM=1167000671:LM=1167000671 ) ,而且每次访问google 站点都会回送这个cookie值。 因此当你下次访问Google时,你的浏览器会发送像这样的请求:

GET / HTTP/1.1
Host: google.com
Cookie: PREF=ID=5b14f22bdaf1e81c:TM=1167000671:LM=1167000671
...

于是 Cookies 的值会告诉Google,你就是早些时候访问过Google网站的人。 这个值可能是数据库中存储用户信息的key,可以用它在页面上显示你的用户名。 Google会(以及目前)使用它在网页上显示你账号的用户名。
存取Cookies

在Django中处理持久化,大部分时候你会更愿意用高层些的session 和/或 后面要讨论的user 框架。 但在此之前,我们需要停下来在底层看看如何读写cookies。 这会帮助你理解本章节后面要讨论的工具是如何工作的,而且如果你需要自己操作cookies,这也会有所帮助。

读取已经设置好的cookies极其简单。 每一个`` HttpRequest`` 对象都有一个`` COOKIES`` 对象,该对象的行为类似一个字典,你可以使用它读取任何浏览器发送给视图(view)的cookies。

def show_color(request):
  if "favorite_color" in request.COOKIES:
    return HttpResponse("Your favorite color is %s" %       request.COOKIES["favorite_color"])
  else:
    return HttpResponse("You don't have a favorite color.")

写cookies稍微复杂点。 你需要使用 HttpResponse对象的 set_cookie()方法。 这儿有个基于 GET 参数来设置 favorite_color

    cookie的例子:

def set_color(request):
  if "favorite_color" in request.GET:

    # Create an HttpResponse object...
    response = HttpResponse("Your favorite color is now %s" %       request.GET["favorite_color"])

    # ... and set a cookie on the response
    response.set_cookie("favorite_color",
              request.GET["favorite_color"])

    return response

  else:
    return HttpResponse("You didn't give a favorite color.")

你可以给 response.set_cookie() 传递一些可选的参数来控制cookie的行为

好坏参半的Cookies

也许你已经注意到了,cookies的工作方式可能导致的问题。 让我们看一下其中一些比较重要的问题:

    cookie的存储是自愿的,一个客户端不一定要去接受或存储cookie。 事实上,所有的浏览器都让用户自己控制 是否接受cookies。 如果你想知道cookies对于Web应用有多重要,你可以试着打开这个浏览器的 选项:

    尽管cookies广为使用,但仍被认为是不可靠的的。 这意味着,开发者使用cookies之前必须 检查用户是否可以接收cookie。

    Cookie(特别是那些没通过HTTPS传输的)是非常不安全的。 因为HTTP数据是以明文发送的,所以 特别容易受到嗅探攻击。 也就是说,嗅探攻击者可以在网络中拦截并读取cookies,因此你要 绝对避免在cookies中存储敏感信息。 这就意味着您不应该使用cookie来在存储任何敏感信息。

    还有一种被称为”中间人”的攻击更阴险,攻击者拦截一个cookie并将其用于另一个用户。 第19章将深入讨论这种攻击的本质以及如何避免。

    即使从预想中的接收者返回的cookie也是不安全的。 在大多数浏览器中您可以非常容易地修改cookies中的信息。有经验的用户甚至可以通过像mechanize(http://wwwsearch.sourceforge.net/mechanize/) 这样的工具手工构造一个HTTP请求。

    因此不能在cookies中存储可能会被篡改的敏感数据。 在cookies中存储 IsLoggedIn=1 ,以标识用户已经登录。 犯这类错误的站点数量多的令人难以置信; 绕过这些网站的安全系统也是易如反掌。

Python 相关文章推荐
Python中不同进制互相转换(二进制、八进制、十进制和十六进制)
Apr 05 Python
用于统计项目中代码总行数的Python脚本分享
Apr 21 Python
python实现批量监控网站
Sep 09 Python
python字符串中的单双引
Feb 16 Python
Python中利用aiohttp制作异步爬虫及简单应用
Nov 29 Python
Python实现图片添加文字
Nov 26 Python
深入理解Tensorflow中的masking和padding
Feb 24 Python
python GUI库图形界面开发之PyQt5开发环境配置与基础使用
Feb 25 Python
Python模拟登入的N种方式(建议收藏)
May 31 Python
python实现测试工具(二)——简单的ui测试工具
Oct 19 Python
python 中关于pycharm选择运行环境的问题
Oct 31 Python
python单例模式的应用场景实例讲解
Feb 24 Python
在Django中使用Sitemap的方法讲解
Jul 22 #Python
用Python的Django框架来制作一个RSS阅读器
Jul 22 #Python
利用Python的Django框架生成PDF文件的教程
Jul 22 #Python
在Python的Django框架中生成CSV文件的方法
Jul 22 #Python
在主机商的共享服务器上部署Django站点的方法
Jul 22 #Python
在Lighttpd服务器中运行Django应用的方法
Jul 22 #Python
简单的Apache+FastCGI+Django配置指南
Jul 22 #Python
You might like
php获取用户IPv4或IPv6地址的代码
2012/11/15 PHP
php使用curl访问https示例分享
2014/01/17 PHP
PHP输出缓存ob系列函数详解
2014/03/11 PHP
php实现的通用图片处理类
2015/03/24 PHP
一个tab标签切换效果代码
2009/03/27 Javascript
关于IE、Firefox、Opera页面呈现异同 写脚本很痛苦
2009/08/28 Javascript
Javascript 网页水印(非图片水印)实现代码
2010/03/01 Javascript
利用JS来控制键盘的上下左右键(示例代码)
2013/12/14 Javascript
深入理解JavaScript 函数
2016/06/06 Javascript
基于vue.js实现图片轮播效果
2016/12/01 Javascript
[原创]JS基于FileSaver.js插件实现文件保存功能示例
2016/12/08 Javascript
原生js验证简洁注册登录页面
2016/12/17 Javascript
基于JavaScript实现拖动滑块效果
2017/02/16 Javascript
基于JS实现仿京东搜索栏随滑动透明度渐变效果
2017/07/10 Javascript
JS实现元素上下左右移动效果
2017/10/18 Javascript
Vue批量图片显示时遇到的路径被解析问题
2019/03/28 Javascript
jquery html添加元素/删除元素操作实例详解
2020/05/20 jQuery
[46:00]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#4EG VS Fnatic第一局
2016/03/03 DOTA
Python脚本实时处理log文件的方法
2016/11/21 Python
python读取二进制mnist实例详解
2017/05/31 Python
详解Tensorflow数据读取有三种方式(next_batch)
2018/02/01 Python
Python基于Logistic回归建模计算某银行在降低贷款拖欠率的数据示例
2019/01/23 Python
django数据关系一对多、多对多模型、自关联的建立
2019/07/24 Python
将python包发布到PyPI和制作whl文件方式
2019/12/25 Python
如何基于Python + requests实现发送HTTP请求
2020/01/13 Python
使用jTopo给Html5 Canva中绘制的元素添加鼠标事件
2014/05/15 HTML / CSS
伯克斯奥特莱斯:Burkes Outlet
2019/03/30 全球购物
世界上最大的铁人三项商店:Tri UK
2020/11/04 全球购物
大唐面试试题(CPU,UNIX等等)
2012/01/11 面试题
计算机系毕业生推荐信
2013/11/06 职场文书
旅游管理毕业生自荐信范文
2014/03/19 职场文书
欢迎词范文
2015/01/27 职场文书
病假条格式范文
2015/08/17 职场文书
分析MySQL抛出异常的几种常见解决方式
2021/05/18 MySQL
python 如何执行控制台命令与操作剪切板
2021/05/20 Python
详解Vue router路由
2021/11/20 Vue.js