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



浏览器的开发人员在非常早的时候就已经意识到。 HTTP's 的无状态会对Web开发人员带来非常大的问题,于是(cookies)应运而生。 cookies 是浏览器为 Web server存储的一小段信息。 每次浏览器从某个server请求页面时,它向server回送之前收到的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。能够用它在页面上显示你的username。 Google会(以及眼下)使用它在网页上显示你账号的username。



存取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的样例:

--edit http://www.aichengxu.com/view/61768 --
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的行为,參考: http://www.aichengxu.com/view/61768 



好坏參半的Cookies




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



cookie的存储是自愿的,一个client不一定要去接受或存储cookie。 其实,全部的浏览器都让用户自己控制 是否接受cookies。 假设你想知道cookies对于Web应用有多重要,你能够试着打开这个浏览器的 选项:



虽然cookies广为使用,但仍被觉得是不可靠的的。 这意味着。开发人员使用cookies之前必须 检查用户能否够接收cookie。



Cookie(特别是那些没通过HTTPS传输的)是很不安全的。 由于HTTP数据是以明文发送的。所以 特别easy受到嗅探攻击。 也就是说,嗅探攻击者能够在网络中拦截并读取cookies。因此你要 绝对避免在cookies中存储敏感信息。

这就意味着您不应该使用cookie来在存储不论什么敏感信息。



另一种被称为”中间人”的攻击更阴险,攻击者拦截一个cookie并将其用于另一个用户。

第19章将深入讨论这样的攻击的本质以及怎样避免。

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



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

Python的Django框架中的Cookie相关处理的更多相关文章

  1. Python的Django框架中forms表单类的使用方法详解

    用户表单是Web端的一项基本功能,大而全的Django框架中自然带有现成的基础form对象,本文就Python的Django框架中forms表单类的使用方法详解. Form表单的功能 自动生成HTML ...

  2. Python的Django框架中的Context使用

    Python的Django框架中的Context使用 近期整理些Python方面的知识,一旦你创建一个 Template 对象,你能够用 context 来传递数据给它. 一个context是一系列变 ...

  3. Python的Django框架中的URL配置与松耦合

    Python的Django框架中的URL配置与松耦合 用 python 处理一个文本时,想要删除其中中某一行,常规的思路是先把文件读入内存,在内存中修改后再写入源文件. 但如果要处理一个很大的文本,比 ...

  4. Python的Django框架中if标签的相关使用

    {% if today_is_weekend%} {% end if %} 系统会显示在这之间的内容 {% else %}标签是可选的 在python和django模板系统中,以下对象相当于布尔值的F ...

  5. django框架中的cookie与session

    cookie因为http是一个无状态协议,无法记录用户上一步的操作,所以需要状态保持.cookie和session的区别:1.cookie是保存在浏览器本地的,所以相对不安全.cookie是4k的大小 ...

  6. Django框架中的Cookie和Session

    学习内容: (1)cookie (2)session Web是基于请求/响应模式,HTTP协议是无状态的,但是基于 Internet的各种服务系统应运而生,建立商业站点或者功能比较完善的个人站点,常常 ...

  7. Python中的Django框架中prefetch_related()函数对数据库查询的优化

    实例的背景说明 假定一个个人信息系统,需要记录系统中各个人的故乡.居住地.以及到过的城市.数据库设计如下: Models.py 内容如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 1 ...

  8. Django框架中的Context使用

    Django框架中的Context使用 2017年11月09日 20:01:09 aweilark 阅读数:1113   转载自:http://www.aichengxu.com/python/606 ...

  9. 分布式队列celery 异步----Django框架中的使用

    仅仅是个人学习的过程,发现有问题欢迎留言 一.celery 介绍 celery是一种功能完备的即插即用的任务对列 celery适用异步处理问题,比如上传邮件.上传文件.图像处理等比较耗时的事情 异步执 ...

随机推荐

  1. 【原创】Linux环境下的图形系统和AMD R600显卡编程(6)——AMD显卡GPU命令格式

    前面一篇blog里面描述了命令环缓冲区机制,在命令环机制下,驱动写入PM4(不知道为何会取这样一个名字)包格式的命令对显卡进行配置.这一篇blog将详细介绍命令包的格式. 当前定义了4中命令包,分别是 ...

  2. nginx+lua_module安装

    1.LuaJit安装 # cd /usr/local/src # git clone http://luajit.org/git/luajit-2.0.git # cd luajit-2.0 # ma ...

  3. 日志三剑客ELK

    新的服务器需要搭建ELK三剑客,就是日志分析的工具,整理下步骤,供以后复习用. 说明下,我这里使用的是logstash从redis里获取日志信息的.所以还需要redis,这里就不做redis的介绍了. ...

  4. (1)php开篇常识

    一.php PHP由zend公司开发维护,目前最高版本PHP7.1,官网地址http://php.net/ PHP从5.5开始不支持XP,没有PHP6这个版本 PHP是嵌入到HTML的脚本代码,格式: ...

  5. hadoop之深入浅出

    分布式文件系统与HDFS lHDFS体系结构与基本概念*** l数据量越来越多,在一个操作系统管辖的范围存不下了,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,因此迫切需要一种系统来管 ...

  6. ELK之收集日志到mysql数据库

    写入数据库的目的是持久化保存重要数据,比如状态码.客户端浏览器版本等,用于后期按月做数据统计等. 环境准备 linux-elk1:10.0.0.22,Kibana ES Logstash Nginx ...

  7. linux coreseek-4.1安装

    1.假设已经有coreseek-4.1-beta.tar.gz源文件 [root@qp232 ~]# cd /usr/local [root@qp232 local]# tar -zxvf /yd/l ...

  8. iOS 7.1 arm64 编辑报错 警告解决办法

    昨天把我的4S更新到iOS7.1,今天发下需要更新Xcode到5.1,发现打包项目Archive的时候,多了一堆警告和错误,很是郁闷. 郁闷没有用,作为一个合格的程序员,要学会淡定!看看警告和错误的大 ...

  9. Ubuntu 16.04安装Shell管理工具PAC Manager

    下载: (链接: https://pan.baidu.com/s/1nvqrVgH 密码: 45wz) 安装: sudo dpkg -i pac-4.5.5.7-all.deb

  10. C++多重继承时调用相应的父类函数

    C++中没有super或parent关键字,想要调父类方法,只能使用明确的[父类名称::方法名] 假如要求A和B是C的父类的前提下,要使如下代码能够分别输出A和B的相关信息(虽然这个要求很少遇到... ...