• 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的存储是自愿的。一个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

    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






  • 相关阅读:
    本地电脑视频播放器推荐PotPlayer、KMPlayer
    使用metaWebBlog接口实现博客文章同步
    水淼·文件批量处理器
    vm虚机转parallels
    linux 查找大文件、日志文件并且删除,解决磁盘爆满的问题
    dockercompose 安装
    Centos7 中tcpreplay安装使用
    K8S入门详细教程
    C#.NET WinForm 多个子Task嵌套 Task.WaitAll 阻塞UI线程
    EF EntityFramework 强制从数据库中取数据,而不是上下文
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/6963948.html
Copyright © 2020-2023  润新知