合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
## session [django1.8.2 session官方中文文档][1] session 是一个抽象概念,开发者为了实现中断和继续等操作,将 user agent 和 server 之间一对一的交互,抽象为“会话”,进而衍生出“会话状态”,也就是 session 的概念。 ### 定义 在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。 需要注意:**新开的浏览器窗口会生成新的Session**,但子窗口除外。子窗口会共用父窗口的Session。例如,在链接上右击,在弹出的快捷菜单中选择"在新窗口中打开"时,子窗口便可以访问父窗口的Session。 由于HTTP协议是`无状态`的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识具体的用户,这个机制就是Session。典型的场景比如购物车。当你点击下单按钮时,由于HTTP协议无状态,所以并不知道是哪个用户操作的,所以服务端要为特定的用户创建了特定的Session,用用于标识这个用户,并且跟踪用户,这样才知道购物车里面有几本书。这个Session是保存在服务端的,有一个唯一标识。在服务端保存Session的方法很多,内存、数据库、文件都有。集群的时候也要考虑Session的转移,在大型的网站,一般会有专门的Session服务器集群,用来保存用户会话,这个时候 Session 信息都是放在内存的,使用一些缓存服务比如Memcached之类的来放 Session。 ### 用途 Session可以记录用户的`登录与行为数据`,即记录下用户目前访问服务器上的那些内容,状态是什么,而考虑到这些数据用户修改的随意性很大,并没有必要直接存储在数据库中。 在用户执行刷新操作时,即再次访问服务器时,可以直接根据Session,打开用户上次访问时网页的状态(如用户输入的表单内容等等),为用户带来更优的体验,提供个性化服务。 用户的session信息非常关键,它记录了用户在进入页面、查看结果、点击结果以及后继的操作(比如翻页、加购物车等)。只有通过session信息才能把用户的行为联系起来,构建出完整的模型,因此从海量数据中把每一个用户所有session的操作都完整地挖掘出来非常重要。 简单通俗的讲session就是象一个临时的容器 来存放这些临时的东西 从你登陆开始就保存在session里 当然你可以自己设置它的有效时间和页面。举个简单的例子 我们做一个购书的JSP网站 顾客买书的时候会挑选出一些书 但是在付钱之前还可以修改,所以不能存到数据库 就可以先保存在session里 等到确认了以后再放入数据库 ### session实现方式 cookie实现会话管理 一般只将session的id存储在cookie中 URL重写实现会话管理 URL重写就是将需要记录的信息附加在请求的链接背后,以链接参数的形式发送给服务器识别。具体实现的过程会在后文结合cookie详解。 ### session和cookie的有效时长 session和cookie的有效时长session的有效时长服务器会把长时间没有活动的Session从服务器内存中清除,此时Session便失效。具体根据服务器设置,一般在二三十分钟左右。 cookie的有效时长cookie的内容主要包括:名字,值,过期时间,路径和域。路径与域一起构成cookie的作用范围。通过过期时间可以设置cookie的有效时长若不设置过期时间: 表示这个cookie的生命周期为浏览器回话期间,关闭访问服务器的浏览器窗口,cookie就消失了。一般称为回话cookie,保存在内存中若设置了过期时间:则cookie会存储在硬盘上,直到超过有效时间。 ## 配置和用法 Django中默认支持Session,其内部提供了5种类型的Session供开发者使用: * 数据库(默认) * 缓存 * 文件 * 缓存+数据库 * 加密cookie ### 配置 缓存的设置 http://python.usyiyi.cn/translate/django_182/topics/cache.html 在settings.py中 #### 公共部分-默认值 ~~~ SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串 SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径 SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名 SESSION_COOKIE_SECURE = False # 是否Https传输cookie SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输 SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期 SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存 ~~~ #### 不同部分 ~~~ # 数据库引擎(默认) SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 缓存Session引擎 SESSION_ENGINE = 'django.contrib.sessions.backends.cache' SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置 # 缓存+数据库Session 引擎 SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 文件Session引擎 SESSION_ENGINE = 'django.contrib.sessions.backends.file' SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() # 加密cookie Session引擎 SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' ~~~ ### 用法 ~~~ ## 对单个键值对操作 # 获取Session中指定key的值 request.session['key'] request.session.get('key',None) # 设置或者更新key的值 request.session['key'] = 123 # 设置key的值,存在则不设置,相当于设置默认值 request.session.setdefault('key',123) # 删除指定key的值 del request.session['key'] # 删除当前用户的所有Session数据 request.session.delete("session_key") # 清除用户的sesseion数据,用户logout request.session.clear() # 获取用户session的随机字符串 request.session.session_key # 将所有Session失效日期小于当前日期的数据删除 request.session.clear_expired() # 检查 用户session的随机字符串 在数据库中是否 request.session.exists("session_key") ## 对所有键值对操作 request.session.keys() request.session.values() request.session.items() request.session.iterkeys() request.session.itervalues() request.session.iteritems() request.session.set_expiry(value) * 如果value是个整数,session会在些秒数后失效。 * 如果value是个datatime或timedelta,session就会在这个时间后失效。 * 如果value是0,用户关闭浏览器session就会失效。 * 如果value是None,session会依赖全局session失效策略。 ~~~ [1]:http://python.usyiyi.cn/translate/django_182/topics/http/sessions.html