详解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和Perl绘制中国北京跑步地图的方法
Mar 03 Python
python实现稀疏矩阵示例代码
Jun 09 Python
Python 多进程并发操作中进程池Pool的实例
Nov 01 Python
Python 脚本获取ES 存储容量的实例
Dec 27 Python
解决Pandas的DataFrame输出截断和省略的问题
Feb 08 Python
PyCharm搭建Spark开发环境实现第一个pyspark程序
Jun 13 Python
python向字符串中添加元素的实例方法
Jun 28 Python
10个Python面试常问的问题(小结)
Nov 20 Python
python 画函数曲线示例
Dec 04 Python
python 成功引入包但无法正常调用的解决
Mar 09 Python
pytorch加载自己的图像数据集实例
Jul 07 Python
python em算法的实现
Oct 03 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读取超大文件的实例代码
2012/04/01 PHP
php+mysqli实现批量执行插入、更新及删除数据的方法
2015/01/29 PHP
php实现的简单中文验证码功能示例
2017/01/03 PHP
PHP 计算两个时间段之间交集的天数示例
2019/10/24 PHP
js直接编辑当前cookie的脚本
2008/09/14 Javascript
使用jQuery UI的tooltip函数修饰title属性的气泡悬浮框
2013/06/24 Javascript
javascript数组随机排序实例分析
2015/07/22 Javascript
学习使用grunt来打包JavaScript和CSS程序的教程
2016/01/04 Javascript
Javascript的无new构建实例详解
2016/05/15 Javascript
浅谈html转义及防止javascript注入攻击的方法
2016/12/04 Javascript
JavaScript基于扩展String实现替换字符串中index处字符的方法
2017/06/13 Javascript
Vue 2.0入门基础知识之内部指令详解
2017/10/15 Javascript
详解vue.js之props传递参数
2017/12/12 Javascript
js传递数组参数到后台controller的方法
2018/03/29 Javascript
vue2.0 + ele的循环表单及验证字段方法
2018/09/18 Javascript
三分钟教你用Node做一个微信哄女友(基友)神器(面向小白)
2019/06/21 Javascript
[59:42]Secret vs Alliacne 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
python实现12306抢票及自动邮件发送提醒付款功能
2018/03/08 Python
Python实现按中文排序的方法示例
2018/04/25 Python
查看python下OpenCV版本的方法
2018/08/03 Python
Python中logging.NullHandler 的使用教程
2018/11/29 Python
PyQt5实现类似别踩白块游戏
2019/01/24 Python
Python使用lambda表达式对字典排序操作示例
2019/07/25 Python
python requests模拟登陆github的实现方法
2019/12/26 Python
如何使用Python破解ZIP或RAR压缩文件密码
2020/01/09 Python
Tensorflow实现多GPU并行方式
2020/02/03 Python
Python GUI编程学习笔记之tkinter事件绑定操作详解
2020/03/30 Python
利用4行Python代码监测每一行程序的运行时间和空间消耗
2020/04/22 Python
HTML5教程之html 5 本地数据库(Web Sql Database)
2014/04/03 HTML / CSS
瑜伽国际:Yoga International
2018/04/18 全球购物
吉列剃须刀美国官网:Gillette美国
2018/07/13 全球购物
Solaris操作系统的线程机制
2015/07/28 面试题
公益活动策划方案
2014/01/09 职场文书
晚会邀请函范文
2014/01/24 职场文书
优秀共产党员先进事迹材料
2014/05/06 职场文书
python高温预警数据获取实例
2022/07/23 Python