本章我们来解说cookie和session ,这两个东西相信大家一定不陌生,概念就不多讲了,我们直接来看其使用方法,首先是cookie,我们在view中加入三个视图,一个是显示cookie的,一个是设置cookie的,例如以下:

  1. def show_cookie(request):
  2. if "MyTestCookie" in request.COOKIES:
  3. return HttpResponse("Cookie[MyTestCookie]的内容是: %s" % request.COOKIES["MyTestCookie"])
  4. else:
  5. return HttpResponse("Cookie[MyTestCookie]的内容是空")
  6.  
  7. def set_cookie(request,mytestcookie):
  8. response = HttpResponse("Cookie[MyTestCookie]的内容被设置成: %s" % mytestcookie)
  9. response.set_cookie("MyTestCookie",
  10. mytestcookie)
  11. return response
  12.  
  13. def del_cookie(request):
  14. response = HttpResponse("Cookie[MyTestCookie]已被删除.")
  15. del request.COOKIES["MyTestCookie"]
  16. return response

配置urls.py。输入testCookie/show/显示cookie的值。输入testCookie/set/XXX/则是把cookie的值改动成为XXX。urls.py例如以下:

  1. from django.conf.urls import patterns, include, url
  2.  
  3. # Uncomment the next two lines to enable the admin:
  4. # from django.contrib import admin
  5. # admin.autodiscover()
  6.  
  7. urlpatterns = patterns('',
  8. # Examples:
  9. # url(r'^$', 'Bidding.views.home', name='home'),
  10. # url(r'^Bidding/', include('Bidding.foo.urls')),
  11.  
  12. # Uncomment the admin/doc line below to enable admin documentation:
  13. # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
  14.  
  15. # Uncomment the next line to enable the admin:
  16. # url(r'^admin/', include(admin.site.urls)),
  17. url(r'^hello/$', 'Bidding.views.hello'),
  18. url(r'^time/$', 'Bidding.views.current_datetime'),
  19. url(r'^time/plus/(\d{1,2})/$', 'Bidding.views.hours_ahead'),
  20. url(r'^hello_base/$', 'Bidding.views.hello_base'),
  21. url(r'^request_test/$', 'Bidding.views.request_test'),
  22. url(r'^UsersSearch/$', 'Bidding.Users.views.search_form'),
  23. url(r'^search/$', 'Bidding.Users.views.search'),
  24. url(r'^ClassRoom/add/$', 'person.views.ClassroonAdd'),
  25. url(r'^ClassRoom/list/$', 'person.views.ClassroonList'),
  26. url(r'^ClassRoom/modify/(\d+)/$', 'person.views.ClassroonModify'),
  27. url(r'^ClassRoom/delete/(\d+)/$', 'person.views.ClassroonDelete'),
  28. url(r'^testPIC/$', 'Bidding.views.my_image'),
  29. url(r'^testPDF/$', 'Bidding.views.hello_pdf'),
  30. url(r'^testCookie/show/$', 'Bidding.views.show_cookie'),
  31. url(r'^testCookie/set/(\w+)/$', 'Bidding.views.set_cookie'),
  32. url(r'^testCookie/del/$', 'Bidding.views.del_cookie'),
  33. )

假设这时你执行testCookie/show/,会显示:

假设执行testCookie/set/hemeng80/则会出错:

这时由于编码格式不对,须要做下面处理在view.py的头部加上:

  1. import sys
  2. default_encoding = 'utf-8'
  3. if sys.getdefaultencoding() != default_encoding:
  4. reload(sys)
  5. sys.setdefaultencoding(default_encoding)

这时在执行testCookie/set/hemeng80/

这样就对了。在运行一遍testCookie/show/,就会看到结果了:

cookie的存储是自愿的。一个client不一定要去接受或存储cookie。

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

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

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

因此不能在cookies中存储可能会被篡改的敏感数据。在cookies中存储 IsLoggedIn=1 ,以标识用户已经登录。

犯这类错误的站点数量多的令人难以置信。绕过这些站点的安全系统也是易如反掌。

因为存在的限制与安全漏洞,cookies和持续性会话已经成为Web开发中令人头疼的典范。 好消息是,Django的目标正是高效的“头疼杀手”,它自带的session框架会帮你搞定这些问题。

你能够用session 框架来存取每一个訪问者随意数据。这些数据在server端存储。并对cookie的收发进行了抽象。 Cookies仅仅存储数据的哈希会话ID,而不是数据本身,从而避免了大部分的常见cookie问题。

以下我们来看看怎样打开session功能,并在视图中使用它。

首先打开Sessions功能

确保在settings.py文件里:

1.    编辑 MIDDLEWARE_CLASSES 配置,确保 MIDDLEWARE_CLASSES 中包括'django.contrib.sessions.middleware.SessionMiddleware'。

2.    确认 INSTALLED_APPS 中有 'django.contrib.sessions' (假设你是刚打开这个应用,别忘了执行manage.py syncdb )

这些事实上默认的就有。不用操心了。SessionMiddleware 激活后。每一个传给视图(view)函数的第一个參数``HttpRequest``
对象都有一个 session 属性,这是一个字典型的对象。 你能够象用普通字典一样来用它。

代码编写过程非常想cookie,这里直接把代码贴出来了,不再解释.

改动我们的view:

  1. def show_session(request):
  2. if "MyTestSession" in request.session:
  3. return HttpResponse("Session[MyTestSession]的内容是: %s" % request.session["MyTestSession"])
  4. else:
  5. return HttpResponse("Session[MyTestSession]的内容是空")
  6.  
  7. def set_session(request,sessionvalue):
  8. response = HttpResponse("Session[MyTestSession]的内容被设置成: %s" % sessionvalue)
  9. request.session["MyTestSession"] = sessionvalue
  10. return response
  11.  
  12. def del_session(request):
  13. response = HttpResponse("Cookie[MyTestSession]已被删除.")
  14. del request.COOKIES["MyTestSession"]
  15. return response

改动一下urls.py

  1. from django.conf.urls import patterns, include, url
  2.  
  3. # Uncomment the next two lines to enable the admin:
  4. # from django.contrib import admin
  5. # admin.autodiscover()
  6.  
  7. urlpatterns = patterns('',
  8. # Examples:
  9. # url(r'^$', 'Bidding.views.home', name='home'),
  10. # url(r'^Bidding/', include('Bidding.foo.urls')),
  11.  
  12. # Uncomment the admin/doc line below to enable admin documentation:
  13. # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
  14.  
  15. # Uncomment the next line to enable the admin:
  16. # url(r'^admin/', include(admin.site.urls)),
  17. url(r'^hello/$', 'Bidding.views.hello'),
  18. url(r'^time/$', 'Bidding.views.current_datetime'),
  19. url(r'^time/plus/(\d{1,2})/$', 'Bidding.views.hours_ahead'),
  20. url(r'^hello_base/$', 'Bidding.views.hello_base'),
  21. url(r'^request_test/$', 'Bidding.views.request_test'),
  22. url(r'^UsersSearch/$', 'Bidding.Users.views.search_form'),
  23. url(r'^search/$', 'Bidding.Users.views.search'),
  24. url(r'^ClassRoom/add/$', 'person.views.ClassroonAdd'),
  25. url(r'^ClassRoom/list/$', 'person.views.ClassroonList'),
  26. url(r'^ClassRoom/modify/(\d+)/$', 'person.views.ClassroonModify'),
  27. url(r'^ClassRoom/delete/(\d+)/$', 'person.views.ClassroonDelete'),
  28. url(r'^testPIC/$', 'Bidding.views.my_image'),
  29. url(r'^testPDF/$', 'Bidding.views.hello_pdf'),
  30. url(r'^testCookie/show/$', 'Bidding.views.show_cookie'),
  31. url(r'^testCookie/set/(\w+)/$', 'Bidding.views.set_cookie'),
  32. url(r'^testCookie/del/$', 'Bidding.views.del_cookie'),
  33. url(r'^testSession/show/$', 'Bidding.views.show_session'),
  34. url(r'^testSession/set/(\w+)/$', 'Bidding.views.set_session'),
  35. url(r'^testSession/del/$', 'Bidding.views.del_session'),
  36.  
  37. )

执行结果如图:

假设这时候你执行set的视图时。就会看到例如以下内容。

原因是由于你没有建立session等表格,在命令行状态输入:manage.py syncdb,例如以下图所看到的:

这时在执行这个程序就会发现:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGVtZW5nMTk4MA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

事实上我们运行了manage.py syncdb
以后,实际上是自己主动创建了一下几个表在数据库中。假设我们要把这些代码上传到sae中,显然还是会出现上述错误,由于sae中也并没有session相关的表格。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGVtZW5nMTk4MA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

这时候我们就必须在sae中也创建对应的表格。

首先进入Mysql-Front,选购中新添加的9个表格:

右键。输出sql文件:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGVtZW5nMTk4MA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

点击下一步。完毕。进入sae的数据库管理界面:

把刚才的代码贴近来,运行,创建表格

这个原因是由于sae的InnoDB没有启用,改动SQL语句中的引擎InnoDB为MyISAM,一般MyISAM都是启用的。在运行:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGVtZW5nMTk4MA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

这时在执行一下网上的代码:

大功告成。

PS:

浏览器关闭即失效会话 vs 持久会话

你可能注意到了。Google给我们发送的cookie中有 expires=Sun, 17-Jan-2038 19:14:07 GMT; cookie能够有过期时间。这样浏览器就知道什么时候能够删除cookie了。
假设cookie没有设置过期时间,当用户关闭浏览器的时候,cookie就自己主动过期了。 你能够改变 SESSION_EXPIRE_AT_BROWSER_CLOSE 的设置来控制session框架的这一行为。

缺省情况下, SESSION_EXPIRE_AT_BROWSER_CLOSE 设置为 False ,这样。会话cookie能够在用户浏览器中保持有效达 SESSION_COOKIE_AGE 秒(缺省设置是两周。即1,209,600 秒)。假设你不想用户每次打开浏览器都必须又一次登陆的话。用这个參数来帮你。

假设 SESSION_EXPIRE_AT_BROWSER_CLOSE 设置为 True ,当浏览器关闭时,Django会使cookie失效。

假设想得到session生命周期和浏览器生命周期同样方法:

在setting.py文件加入:

SESSION_EXPIRE_AT_BROWSER_CLOSE = True

其它的Session设置

除了上面提到的设置。另一些其它的设置能够影响Django session框架怎样使用cookie,详见表 14-2.

表 14-2. 影响cookie行为的设置

设置

描写叙述

缺省

SESSION_COOKIE_DOMAIN

使用会话cookie(session cookies)的网站。 将它设成一个字符串,就好象`` “.example.com”`` 以用于跨网站(cross-domain)的cookie。或`` None`` 以用于单个网站。

None

SESSION_COOKIE_NAME

会话中使用的cookie的名字。 它能够是随意的字符串。

"sessionid"

SESSION_COOKIE_SECURE

是否在session中使用安全cookie。 假设设置 True , cookie就会标记为安全, 这意味着cookie仅仅会通过HTTPS来传输。

False

Python+Django+SAE系列教程16-----cookie&session的更多相关文章

  1. Python+Django+SAE系列教程17-----authauth (认证与授权)系统1

    通过session,我们能够在多次浏览器请求中保持数据,接下来的部分就是用session来处理用户登录了. 当然,不能仅凭用户的一面之词,我们就相信,所以我们须要认证. 当然了,Django 也提供了 ...

  2. Python+Django+SAE系列教程15-----输出非HTML内容(图片/PDF)

    一个Django视图函数 必须 接受一个HttpRequest 实例作为它的第一个參数 返回一个HttpResponse 实例 从一个视图返回一个非HTML 内容的关键是在构造一个 HttpRespo ...

  3. Python+Django+SAE系列教程9-----Django的视图和URL

    第三.四.五章介绍的就是Django中MVC的视图.模板.模型了. 首先来看视图(view),在用Django生成的站点目录中,创建一个view.py文件,这个文件開始是空的.然后我们输入下面内容: ...

  4. Python+Django+SAE系列教程11-----request/pose/get/表单

    表单request,post,get 首先我们来看看Request对象,在这个对象中包括了一些实用的信息,学过B/S开发的人来说这并不陌生,我们来看看在Django中是怎样实现的: 属性/方法 说明 ...

  5. Python+Django+SAE系列教程12-----配置MySQL数据库

    由于SAE上支持的是Mysql,首先我们要在本地配置一个Mysql的环境 ,我在网上找到MySQL-python-1.2.4b4.win32-py2.7.exe,并双击 安装 选择典型安装 安装结束后 ...

  6. Python+Django+SAE系列教程10-----Django模板

    在本章中,我们开始模板,在前面的章节,您可能已经注意到,我们回到文本的方式有点特别的示例视图. 那.HTML直接在硬编码 Python 其中代码. 这的确是一个小BT. def current_dat ...

  7. Python+Django+SAE系列教程6-----本地配置Django

    前五章.我们介绍了Python的语法,本章開始介绍Django. Python的Web框架有非常多,有Django.web2py.tornado.web.py等.我们这里选 则Django.至于这些框 ...

  8. Python+Django+SAE系列教程13-----MySQL记录的添\删\改

    建立了数据库后,我们就来做一个简单的表(person_classroom)的加入.删除.改动的操作. 首先我们建立一个加入的页面的模板Classroom_Add.html(加入的表单)并把它放在Bid ...

  9. Python+Django+SAE系列教程14-----使表单更安全

    还记得我们上一章提到过的加入页面吗? watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGVtZW5nMTk4MA==/font/5a6L5L2T/fonts ...

随机推荐

  1. 如何将本地代码上传到Github

    这些内容只是Git知识的冰山一角 更多知识请 阅读 Pro git.Pro git 所有内容均根据知识共享署名非商业性共享3.0版许可证授权,各位可以免费下载阅读,有pdf.mobi.qpub格式可以 ...

  2. NSLayoutConstraint的使用

    *一切皆代码*- -- #继承关系框架|类|类:-:|:-:|:-:UIKit|NSLayoutConstraint|--|-|- #应用场景UI界面的搭建一般会占用项目开发相当一部分的时间.涉及到控 ...

  3. seo在前端网页制作的应用

    学习了慕客网上的“SEO在网页制作中的应用‘’,下面来进行小小的学习总结,顺便梳理下知识.所谓学而不思则罔思而不学则殆.下面开始正文. 一.搜索引擎的工作原理 搜索引擎的基本工作原理包括如下三个过程: ...

  4. 第一天:java与mysql的连接工具类

    第一天:java与mysql的连接工具类 java最新版马上就要收费,这无疑是这门语言的衰败起始,毕竟在中国收费便难发展,例如c#,但是毕业设计已经选好用java来写一个动态网站, 这已经是一个事实, ...

  5. (转)50 个 jQuery 小技巧

    1. 如何修改jQuery默认编码(例如默认UTF-8改成改GB2312): $.ajaxSetup({ajaxSettings:{ contentType:"application/x-w ...

  6. Spring学习笔记之依赖的注解(2)

    Spring学习笔记之依赖的注解(2) 1.0 注解,不能单独存在,是Java中的一种类型 1.1 写注解 1.2 注解反射 2.0 spring的注解 spring的 @Controller@Com ...

  7. [原创]C++中一些重要概念

    1.虚函数 虚函数的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数.当把基类的某个成员函数声明为虚函数后,允许在其派生类中对该函数重新定义,赋予 ...

  8. MySQL 5.6 Reference Manual-14.1 Introduction to InnoDB

    14.1 Introduction to InnoDB 14.1.1 InnoDB as the Default MySQL Storage Engine 14.1.2 Checking InnoDB ...

  9. java 抽象工厂模式简单实例

    抽象工厂模式:提供一个创建一系列的相关的或者依赖的对象的接口,无需指定它们的具体实现类,具体的时间分别在子类工厂中产生. 类似于工厂模式:隔离了具体类的生产实现,使得替换具体的工厂实现类很容易.包含有 ...

  10. React 学习笔记:1-react 入门

    接下来的项目里有用到react,最近一段时间主要关注于react 的学习.大部门都是网上的资料,学习整理并记录,加深记忆. React 是Facebook推出的用来构建用户界面的JavaScript库 ...