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. urb数据结构【转】

    转自:http://blog.csdn.net/myarrow/article/details/7025065 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 一 transf ...

  2. 12.OpenStack镜像和存储服务配置

    配置镜像服务 编辑 /etc/glance/glance-api.conf与/etc/glance/glance-registry.conf添加以下内容 [DEFAULT] notification_ ...

  3. Java工厂模式浅析理解

    由于本人缺乏工作经验,本篇文章作为随笔,只是对工厂模式有一个简单的认识 工厂模式分为以下三种: 1:简单工厂(Simple Factory).2:工厂方法(Factory Method).3:抽象工厂 ...

  4. 1.tornado基础

    import tornado.web ''' tornado基础web框架模块 ''' import tornado.ioloop ''' tornado的核心循环IO模块,封装了linux的epol ...

  5. python描述符的应用

    使用描述符为python实现类型检测 class Typed: def __get__(self, instance, owner): print(instance) print(owner) def ...

  6. hdu 5062(水题)

    Beautiful Palindrome Number Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K (J ...

  7. Android (Notification)消息推送机制

    从网上查询资料学习Android消息推送机制,效果图如下: 1.首先是布局文件代码 activity_main.xml <?xml version="1.0" encodin ...

  8. UVA 1395 Slim Span 最小生成树

    题意: 给你一个图,让你求这个图中所有生成树中满足题目条件的,这个条件是生成树中最长边与最短边的差值最小. 思路: 根据最小瓶颈生成树的定义:在一个有权值的无向图中,求一个生成树最大边的权值尽量小.首 ...

  9. (转)代码中实现button

    链接地址:http://www.cnblogs.com/hukezhu/p/4500206.html 随着iOS开发发展至今,在UI制作上逐渐分化为了三种主要流派:使用代码手写UI及布局:使用单个xi ...

  10. bzoj 5020: [THUWC 2017]在美妙的数学王国中畅游【泰勒展开+LCT】

    参考:https://www.cnblogs.com/CQzhangyu/p/7500328.html --其实理解了泰勒展开之后就是水题呢可是我还是用了两天时间来搞懂啊 泰勒展开是到正无穷的,但是因 ...