一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Python框架Django如何处理Cookie教程

时间:2015-07-24 编辑:简简单单 来源:一聚教程网

先我们来看看cookie是怎么工作的。 当你打开浏览器并访问 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的例子:


    --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的存储是自愿的,一个客户端不一定要去接受或存储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 ,以标识用户已经登录。 犯这类错误的站点数量多的令人难以置信; 绕过这些网站的安全系统也是易如反掌。


django处理cookies和session

至于什么cookie和session我相信大家都懂,所以不说鸟。直接开记录在djano框架下面如何操作cookie和session。

存取cookies

读取cookies很简单,因为读取cookies可以使用HttpResquest,每一个HttpResquest对象都有一个COOKIES对象,可以用它读取任何浏览器发送给视图的cookies。

因为每个视图函数的第一个参数都是request,其实它就是一个HtppResquest对象,所以直接使用request.COOKIES读取cookies就好。

写COOKIES就使用HttpResquest对象的set_cookie()方法,set_cookie有一些可选参数来指定一些特殊操作。

session操作

开启session(他是通过一个中间件和一个模型来实现的)。

1.编辑MIDDLEWARE_CLASSES,确保里面已经包含了django.contrib.sessions.middleware.SessionMiddleware。

2.确认INSTALLED_APPS,确保里面已经含有一个叫django.contrib.sessions的鬼畜。

其实这两项,一般默认就有了,前提是你的项目是用python manage.py startproject mysite来创建的。

视图中使用session

SessionMiddleware被激活以后,每个视图函数的第一个参数request(也就是HttpResquest对象)都有一个session属性,它和cookie一样,也是个字典型的对象,可以像使用普通字典那样使用。

在操作session时候的一些忌讳:

1.使用正常的的字符串来访问字典,而不是整数,对象,或者其他什么很讨厌的东西。

2.key值最好不要使用下划线来命名,因为有些是保留的,但是一般也用不到。

3.不要用一个新对象来替代request.session。

4.不要向request.session中存属性。

测试COOKIE

当然鸟,有些贱人就是喜欢关闭cookie,所以作为蛋疼的web开发者们,想在人家机器上存储一个cookie都得先test一下。

可以使用request.session.set_test_cookie()来测试,让后在其他的视图中使用request.session.test_cookie_worked(),两次测试是不在同一个视图函数中的,为什么要这样,跟cookie的工作原理有关。

delete_test_cookie可以用来删除用于测试而设置的cookie。

在视图之外使用session

我们可以使用django的数据库API来存取session,我们使用get_decoded来读取实际的session数据。

有效期

如果SESSION_EXPIRE_AT_BROWSER_CLOSE设置为false,那么cookie在浏览器中保存周期是SESSION_COOKIE_AGE秒。如果设置为true,那么关闭浏览器时候,就会失效。

热门栏目