Python+Django+SAE系列教程16-----cookie&session

本章我们来讲解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

Python+Django+SAE系列教程16-----cookie&session,布布扣,bubuko.com

时间: 2024-08-06 03:21:57

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

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

通过session,我们可以在多次浏览器请求中保持数据,接下来的部分就是用session来处理用户登录了. 当然,不能仅凭用户的一面之词,我们就相信,所以我们需要认证. 当然了,Django 也提供了工具来处理这样的常见任务(就像其他常见任务一样). Django 用户认证系统处理用户帐号,组,权限以及基于cookie的用户会话.这个系统一般被称为 auth/auth (认证与授权)系统. 这个系统的名称同时也表明了用户常见的两步处理. 我们需要: 1.     验证 (认证) 用户是否是他所宣

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

还记得我们上一章提到过的添加页面吗? 添加完以后我们注意一下地址栏: 表单里的数据赤裸裸的显示在了地址栏中,这时候如果我们修改一下内容 刷新,这样数据库里面就会又加入了一条数据,也就是说用户如果知道表单的结果页的连接,就可以不通过我们的表单,任意添加数据了,这样当然不是我们想要的结果. 这样的结果是因为我们在表单中使用了get的方式来传递数据,这时我们应该想到采用post的方法,post比get更加安全,我们来修改一下模板页面,注意这里: 下面是表单模板Classroom_Add.html的代码

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

表单request,post,get 首先我们来看看Request对象,在这个对象中包含了一些有用的信息,学过B/S开发的人来说这并不陌生,我们来看看在Django中是如何实现的: 属性/方法 说明 举例 request.path 除域名以外的请求路径,以正斜杠开头 "/hello/" request.get_host() 主机名(比如,通常所说的域名) "127.0.0.1:8000" or"www.example.com" request.g

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

因为SAE上支持的是Mysql,首先我们要在本地配置一个Mysql的环境 ,我在网上找到MySQL-python-1.2.4b4.win32-py2.7.exe,并双击 安装 选择典型安装 安装结束后,会弹出配置数据库的界面 : 然后输数据管理员密码: 最后是运行服务. 这个过程并不复杂,安装完成Mysql以后,系统会启动数据库服务,由于Mysql是用命令行控制的,想我这样懒的 人还是需要借助一个可视化 工具来管理,我选择MySQL-Front. 在网上找到MySQL_Front_Setup.1

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

建立了数据库后,我们就来做一个简单的表(person_classroom)的添加.删除.修改的操作. 首先我们建立一个添加的页面的模板Classroom_Add.html(添加的表单)并把它放在Bidding\templates\person中: Classroom_Add.html: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html> <head> <title>数据库操作

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

一个Django视图函数 必须 接受一个HttpRequest 实例作为它的第一个參数 返回一个HttpResponse 实例 从一个视图返回一个非HTML 内容的关键是在构造一个 HttpResponse类时,须要指定 mimetype參数. 通过改变 MIME 类型.我们能够通知浏览器将要返回的数据是还有一种类型.以下我们以返回一张PNG图片的视图为例. 为了使事情能尽可能的简单.我们仅仅是读入一张存储在磁盘上的图片: 首先放入一个图片到Bidding\images\testPIC.png中

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

在本章中,我们开始模板,在前面的章节,您可能已经注意到,我们回到文本的方式有点特别的示例视图. 那.HTML直接在硬编码 Python 其中代码. 这的确是一个小BT. def current_datetime(request): now = datetime.datetime.now() html = "<html><body>It is now %s.</body></html>" % now return HttpResponse(

Python+Django+SAE系列教程7-----在Sae上配置Django

本章的開始首先我们来注冊一个sae账号,首先登录http://sae.sina.com.cn/.进入登录页面,这里须要一个新浪微博账号进行注冊.假设没有赶快去注冊一个吧. 登录平台后.会提示一个授权信息.点击授权就OK了. 这里须要注意的是,每个手机号码仅仅能注冊一个sae账号.看看这个注冊页就能够知道: 填写完毕以后还须要手机验证一下就能够完毕注冊了. 注冊完毕以后会出现一下界面,立即点击"创建应用": 接下来是选择应用的语言和类型.我们选择python的web应用: 这里面让输入的

Python爬虫学习系列教程

Python爬虫学习系列教程 大家好哈,我呢最近在学习Python爬虫,感觉非常有意思,真的让生活可以方便很多.学习过程中我把一些学习的笔记总结下来,还记录了一些自己实际写的一些小爬虫,在这里跟大家一同分享,希望对Python爬虫感兴趣的童鞋有帮助,如果有机会期待与大家的交流. Python版本:2.7 一.爬虫入门 1. Python爬虫入门一之综述 2. Python爬虫入门二之爬虫基础了解 3. Python爬虫入门三之Urllib库的基本使用 4. Python爬虫入门四之Urllib库