django会话javascript
django提供对匿名会话全方位的支持,会话框架能够存储和检索每一个站点访问者的任意数据。会话数据是存储在服务器端的,而且简要了发送和接受cookie的过程,cookies只包含一个session ID而不是数据自己,除非你是使用了基于cookie备份的会话。html
下面咱们来看看该如何使用会话框架吧java
会话是经过一个中间件实现的。因此要想启用会话功能,只须要在MIDDLEWARE_CLASSES 加入django.contrib.sessions.middleware.SessionMiddleware就ok了python
若是使用django-admin.py startproject建立的项目默认是启用了这个功能的,因此,若是你不想使用sessions功能的话,记得在MIDDLEWARE_CLASS中移除对应的项,数据库
而且,记得在installed_apps里面移除sessions,这会为你节省一点点数据库空间django
默认django会在你的数据库中存储会话(使用django.contrib.sessions.models.Session模型)后端
尽管这很方便,但有些时候把会话存储在其余地方会使访问的更快,下面咱们来看一下各类配置会话引擎的方法吧浏览器
默认使用的方法,须要把django.contrib.sessions添加到INSTALLED_APPS设置里面缓存
而后运行manage.py syncdb在数据库中生成对应的表服务器
若是想要的你的系统表现的更好,你能够考虑使用基于缓存的后端处理,不过要是缓存的话,你首先要配置你的缓存
一旦配置好缓存,你有两个如何在缓存中存储数据的选择
这两种选择都很快,第一种cache相比cached_db更快由于没有数据库交互;但在通常状况下,cached_db已经够快的了,若是须要更快,能够考虑cache
注意,cached_db也是要用到数据库的,记得参考上面的 使用数据库支持的会话
要使用基于文件的会话,记得把SESSION_ENGIN设为django.contrib.sessions.backends.file,另外你可能还要设置SESSION_FILE_PATH去控制django存储会话的地方,前提记得确认django服务器有权限读写那个位置
要使用基于cookie的会话,只须要把SESSION_ENGIN设置为django.contrib.sessions.backends.signed_cookies,那些会话数据会使用django的加密签名工具和SECRET_KEY去存储数据
提示:建议把SESSION_COOKIE_HTTPONLY=True,这样能够防止访问到javascript存储的数据
提醒:
一旦会话中间件被启用,每个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对象指南
简单使用:设置并使用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的行为
Default: django.contrib.sessions.backends.db
可选项:
Default: /tmp/
Default: False
Default: False
是否每次请求都保存session数据
p