本章我们来讲解cookie和session ,这两个东西相信大家一定不陌生,概念就不多讲了,我们直接来看其用法,首先是cookie,我们在view中添加三个视图,一个是显示cookie的,一个是设置cookie的,如下:
def show_cookie(request): if "MyTestCookie" in request.COOKIES: return HttpResponse("Cookie[MyTestCookie]的内容是: %s" % request.COOKIES["MyTestCookie"]) else: return HttpResponse("Cookie[MyTestCookie]的内容是空") def set_cookie(request,mytestcookie): response = HttpResponse("Cookie[MyTestCookie]的内容被设置成: %s" % mytestcookie) response.set_cookie("MyTestCookie", mytestcookie) return response def del_cookie(request): response = HttpResponse("Cookie[MyTestCookie]已被删除.") del request.COOKIES["MyTestCookie"] return response
配置urls.py,输入testCookie/show/显示cookie的值,输入testCookie/set/XXX/则是把cookie的值修改成为XXX,urls.py如下:
from django.conf.urls import patterns, include, url # Uncomment the next two lines to enable the admin: # from django.contrib import admin # admin.autodiscover() urlpatterns = patterns('', # Examples: # url(r'^$', 'Bidding.views.home', name='home'), # url(r'^Bidding/', include('Bidding.foo.urls')), # Uncomment the admin/doc line below to enable admin documentation: # url(r'^admin/doc/', include('django.contrib.admindocs.urls')), # Uncomment the next line to enable the admin: # url(r'^admin/', include(admin.site.urls)), url(r'^hello/$', 'Bidding.views.hello'), url(r'^time/$', 'Bidding.views.current_datetime'), url(r'^time/plus/(\d{1,2})/$', 'Bidding.views.hours_ahead'), url(r'^hello_base/$', 'Bidding.views.hello_base'), url(r'^request_test/$', 'Bidding.views.request_test'), url(r'^UsersSearch/$', 'Bidding.Users.views.search_form'), url(r'^search/$', 'Bidding.Users.views.search'), url(r'^ClassRoom/add/$', 'person.views.ClassroonAdd'), url(r'^ClassRoom/list/$', 'person.views.ClassroonList'), url(r'^ClassRoom/modify/(\d+)/$', 'person.views.ClassroonModify'), url(r'^ClassRoom/delete/(\d+)/$', 'person.views.ClassroonDelete'), url(r'^testPIC/$', 'Bidding.views.my_image'), url(r'^testPDF/$', 'Bidding.views.hello_pdf'), url(r'^testCookie/show/$', 'Bidding.views.show_cookie'), url(r'^testCookie/set/(\w+)/$', 'Bidding.views.set_cookie'), url(r'^testCookie/del/$', 'Bidding.views.del_cookie'), )
如果这时你运行testCookie/show/,会显示:
如果运行testCookie/set/hemeng80/则会出错:
这时因为编码格式不正确,需要做以下处理在view.py的头部加上:
import sys default_encoding = 'utf-8' if sys.getdefaultencoding() != default_encoding: reload(sys) sys.setdefaultencoding(default_encoding)
这时在运行testCookie/set/hemeng80/
这样就对了,在执行一遍testCookie/show/,就会看到结果了:
cookie的存储是自愿的,一个客户端不一定要去接受或存储cookie。事实上,所有的浏览器都让用户自己控制是否接受cookies。如果你想知道cookies对于Web应用有多重要,你可以试着打开这个浏览器的选项:
尽管cookies广为使用,但仍被认为是不可靠的的。这意味着,开发者使用cookies之前必须检查用户是否可以接收cookie。
Cookie(特别是那些没通过HTTPS传输的)是非常不安全的。因为HTTP数据是以明文发送的,所以特别容易受到嗅探攻击。也就是说,嗅探攻击者可以在网络中拦截并读取cookies,因此你要绝对避免在cookies中存储敏感信息。这就意味着您不应该使用cookie来在存储任何敏感信息。
因此不能在cookies中存储可能会被篡改的敏感数据。在cookies中存储 IsLoggedIn=1 ,以标识用户已经登录。犯这类错误的站点数量多的令人难以置信;绕过这些网站的安全系统也是易如反掌。
由于存在的限制与安全漏洞,cookies和持续性会话已经成为Web开发中令人头疼的典范。 好消息是,Django的目标正是高效的“头疼杀手”,它自带的session框架会帮你搞定这些问题。
你可以用session 框架来存取每个访问者任意数据,这些数据在服务器端存储,并对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:
def show_session(request): if "MyTestSession" in request.session: return HttpResponse("Session[MyTestSession]的内容是: %s" % request.session["MyTestSession"]) else: return HttpResponse("Session[MyTestSession]的内容是空") def set_session(request,sessionvalue): response = HttpResponse("Session[MyTestSession]的内容被设置成: %s" % sessionvalue) request.session["MyTestSession"] = sessionvalue return response def del_session(request): response = HttpResponse("Cookie[MyTestSession]已被删除.") del request.COOKIES["MyTestSession"] return response
修改一下urls.py
from django.conf.urls import patterns, include, url # Uncomment the next two lines to enable the admin: # from django.contrib import admin # admin.autodiscover() urlpatterns = patterns('', # Examples: # url(r'^$', 'Bidding.views.home', name='home'), # url(r'^Bidding/', include('Bidding.foo.urls')), # Uncomment the admin/doc line below to enable admin documentation: # url(r'^admin/doc/', include('django.contrib.admindocs.urls')), # Uncomment the next line to enable the admin: # url(r'^admin/', include(admin.site.urls)), url(r'^hello/$', 'Bidding.views.hello'), url(r'^time/$', 'Bidding.views.current_datetime'), url(r'^time/plus/(\d{1,2})/$', 'Bidding.views.hours_ahead'), url(r'^hello_base/$', 'Bidding.views.hello_base'), url(r'^request_test/$', 'Bidding.views.request_test'), url(r'^UsersSearch/$', 'Bidding.Users.views.search_form'), url(r'^search/$', 'Bidding.Users.views.search'), url(r'^ClassRoom/add/$', 'person.views.ClassroonAdd'), url(r'^ClassRoom/list/$', 'person.views.ClassroonList'), url(r'^ClassRoom/modify/(\d+)/$', 'person.views.ClassroonModify'), url(r'^ClassRoom/delete/(\d+)/$', 'person.views.ClassroonDelete'), url(r'^testPIC/$', 'Bidding.views.my_image'), url(r'^testPDF/$', 'Bidding.views.hello_pdf'), url(r'^testCookie/show/$', 'Bidding.views.show_cookie'), url(r'^testCookie/set/(\w+)/$', 'Bidding.views.set_cookie'), url(r'^testCookie/del/$', 'Bidding.views.del_cookie'), url(r'^testSession/show/$', 'Bidding.views.show_session'), url(r'^testSession/set/(\w+)/$', 'Bidding.views.set_session'), url(r'^testSession/del/$', 'Bidding.views.del_session'), )
运行结果如图:
如果这时候你运行set的视图时,就会看到如下内容。
原因是因为你没有建立session等表格,在命令行状态输入:manage.py syncdb
,如下图所示:
这时在运行这个程序就会发现:
其实我们执行了manage.py syncdb
以后,实际上是自动创建了一下几个表在数据库中。如果我们要把这些代码上传到sae
中,显然还是会出现上述错误,因为sae
中也并没有session
相关的表格。
这时候我们就必须在sae中也创建相应的表格。
首先进入Mysql-Front,选购中新增加的9个表格:
右键,输出sql文件:
点击下一步,完成。进入sae的数据库管理界面:
把刚才的代码贴近来,执行,创建表格
这个原因是因为sae的InnoDB没有启用,修改SQL语句中的引擎InnoDB为MyISAM,一般MyISAM都是启用的。在执行:
这时在运行一下网上的代码:
大功告成。
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 |