zoukankan      html  css  js  c++  java
  • 8:django sessions(会话)

     django会话

    django提供对匿名会话全方位的支持,会话框架可以存储和检索每个站点访问者的任意数据。会话数据是存储在服务器端的,并且简要了发送和接受cookie的过程,cookies只包含一个session ID而不是数据本身,除非你是使用了基于cookie备份的会话。

    下面我们来看看该如何使用会话框架吧

    启用会话

    会话是通过一个中间件实现的。所以要想启用会话功能,只需要在MIDDLEWARE_CLASSES 加入django.contrib.sessions.middleware.SessionMiddleware就ok了

    如果使用django-admin.py startproject创建的项目默认是启用了这个功能的,所以,如果你不想使用sessions功能的话,记得在MIDDLEWARE_CLASS中移除对应的项,

    并且,记得在installed_apps里面移除sessions,这会为你节省一点点数据库空间

     配置会话引擎

    默认django会在你的数据库中存储会话(使用django.contrib.sessions.models.Session模型)

    尽管这很方便,但有些时候把会话存储在其他地方会使访问的更快,下面我们来看一下各种配置会话引擎的方法吧

    使用数据库支持的会话

     默认使用的方法,需要把django.contrib.sessions添加到INSTALLED_APPS设置里面

    然后运行manage.py syncdb在数据库中生成对应的表

     使用缓存的会话

    如果想要的你的系统表现的更好,你可以考虑使用基于缓存的后端处理,不过要是缓存的话,你首先要配置你的缓存

     一旦配置好缓存,你有两个如何在缓存中存储数据的选择

    • 使用django.contrib.sessions.backens.cache配置SESSION_ENGIN,会话被直接存储在缓存中,一旦缓存满或者缓存服务器重启,所有的数据将丢失
    • 使用django.contrib.sessions.backends.cached_db配置SESSION_ENGIN,这是一种直写式的缓存,每次写入缓存的数据同样的会被写到数据库里面,仅当会话不在缓存中时才会访问数据库

     这两种选择都很快,第一种cache相比cached_db更快因为没有数据库交互;但在一般情况下,cached_db已经够快的了,如果需要更快,可以考虑cache

     注意,cached_db也是要用到数据库的,记得参考上面的 使用数据库支持的会话

    使用基于文件的会话

    要使用基于文件的会话,记得把SESSION_ENGIN设为django.contrib.sessions.backends.file,另外你可能还要设置SESSION_FILE_PATH去控制django存储会话的地方,前提记得确认django服务器有权限读写那个位置

    使用基于cookie的会话

    要使用基于cookie的会话,只需要把SESSION_ENGIN设置为django.contrib.sessions.backends.signed_cookies,那些会话数据会使用django的加密签名工具和SECRET_KEY去存储数据

    提示:建议把SESSION_COOKIE_HTTPONLY=True,这样可以防止访问到javascript存储的数据

    提醒:

    • 会话数据进行了签名但没有加密:客户端可以读取甚至更改这些数据,或者cookie的大小超出了浏览器默认的长度而被丢弃一部分,这些都会使得会话数据变得无效
    • 不保证新鲜度:MAC(消息验证码)能保证数据的真实性和完整性,但却无法保证消息的新鲜性,这可能会导致“重放攻击”,cookie仅当早于SESSION_COOKIE_AGE才会被认为是“过时”的
    • 运行表现:cookie的大小对你的网站的访问速度有影响

     在视图函数中使用会话

     一旦会话中间件被启用,每一个HttpRequest对象-每一个django视图函数的第一个参数-将有一个session属性,这是一个类似字典的对象,你可以在你的视图函数里面的任何地方使用request.session,可以使用多次

    下面的伪代码展示了session的标准字典方法

    class backends.base.SessionBase
    #这是所有会话对象的基类,下面是一些标准的字典方法
    
    __getitem__(key)
    #Example: fav_color = request.session['fav_color']
    
    __setitem__(key, value)
    #Example: request.session['fav_color'] = 'blue'
    
    __delitem__(key)
    #Example: del request.session['fav_color']. 如果key不存在,和标准的字典一样,将抛出一个keyError的错误
    
    __contains__(key)
    #Example: 'fav_color' in request.session,返回一个bool值
    
    get(key, default=None)
    #Example: fav_color = request.session.get('fav_color', 'red'),如果get不到名为fav_color的session,fav_color=red
    
    pop(key)
    #Example: fav_color = request.session.pop('fav_color')
    #常用的字典方法
    keys()
    items()
    setdefault()
    clear()
    #还有以下这些方法
    
    flush()
    #从会话中删除已经发送给用户的cookie(会话)的值,并重新生成该会话的key,这样可以确保之前的会话数据不会被再次访问到,比如django.contrib.auth.logout() 这个函数会调用这个方法。
    
    set_test_cookie()
    #设置一个测试的cookie,与下面的test_cookie_worked协同
    
    test_cookie_worked()
    #先要调用set_test_cookie(),返回一个bool变量
    
    delete_test_cookie()
    #删除测试的cookie
    
    set_expiry(value)
    #设置会话的过期时间
    #如果value是整数,则是代表秒数,调用request.session.set_expiry(300) 
    #如果是datetime或者timedelta对象,则是对应的时间日期
    #如果是None,则使用全局到期政策
    get_expiry_age()
    #返回会话过期剩余的秒数
    get_expiry_date()
    #返回会话过期的日期
    get_expire_at_browser_close()
    #返回当浏览器关闭的时候cookie时候被删除,是一个bool变量cookie will expire when the user’s Web browser is closed.

    session对象指南

    • 使用request.session时,像python字符串那样使用他们
    • 下划线开始的keys是django内部保留使用的,请不要使用下划线开头的变量名
    • 不要覆盖request.session,就像使用一个python字典类型数据一样去使用他

     使用例子

     简单使用:设置并使用session

    def post_comment(request, new_comment):
        if request.session.get('has_commented', False):
            return HttpResponse("You've already commented.")
        c = comments.Comment(comment=new_comment)
        c.save()
        request.session['has_commented'] = True
        return HttpResponse('Thanks for your comment!')

    设置测试cookie

    def login(request):
        if request.method == 'POST':
            if request.session.test_cookie_worked():
                request.session.delete_test_cookie()
                return HttpResponse("You're logged in.")
            else:
                return HttpResponse("Please enable cookies and try again.")
        request.session.set_test_cookie()
        return render_to_response('foo/login_form.html')

    清理会话表

    django不会自动删除已经过期的会话数据,记得运行django-admin.py cleanup删除数据库中会话表中已经过期的session

    配置汇总

    一些django的配置可以让你控制session的行为

    SESSION_ENGINE

    Default: django.contrib.sessions.backends.db

    可选项:

    • 'django.contrib.sessions.backends.db'
    • 'django.contrib.sessions.backends.file'
    • 'django.contrib.sessions.backends.cache'
    • 'django.contrib.sessions.backends.cached_db'
    • 'django.contrib.sessions.backends.signed_cookies'

    SESSION_FILE_PATH

    Default: /tmp/

    SESSION_EXPIRE_AT_BROWSER_CLOSE

    Default: False

    SESSION_SAVE_EVERY_REQUEST

    Default: False

    是否每次请求都保存session数据

    p

  • 相关阅读:
    《构建之法》第8、9、10章 读后感
    [团队项目]SCRUM项目6.0 7.0 (新)
    [团队项目]SCRUM项目5.0
    [团队项目]SCRUM项目4.0
    [团队项目] Scrum 项目 3.0 SCRUM 流程的步骤2: Spring 计划
    [操作系统]实验三 进程调度模拟程序
    [团队项目] Scrum 项目 2.0 产品BACKLOG
    复利计算的总结
    复利/单利计算程序进度0321更新
    0312 复利计算器2.0 运行与介绍
  • 原文地址:https://www.cnblogs.com/qwj-sysu/p/4192109.html
Copyright © 2011-2022 走看看