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_COOKIE_AGE

Default: 1209600 (2 周, 以秒为单位)

SESSION_COOKIE_DOMAIN

Default: None

例如".lawrence.com" (注意不要忘了点号)

SESSION_COOKIE_HTTPONLY

Default: True

SESSION_COOKIE_NAME

Default: 'sessionid'

SESSION_COOKIE_PATH

Default: '/'

SESSION_COOKIE_SECURE

Default: False

如果为真,cookie只有在https下传输

SESSION_EXPIRE_AT_BROWSER_CLOSE

Default: False

SESSION_SAVE_EVERY_REQUEST

Default: False

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

p

8:django sessions(会话)的更多相关文章

  1. Django - session 会话跟踪技术

    1.session简介 |session 英 /'seʃ(ə)n/ 美 /'sɛʃən/ 基于cookies开发,将值存到服务端 写session 读session Session是服务器端技术,利用 ...

  2. Django - cookies 会话跟踪技术

    一.HTTP协议的无状态保存 两次请求之间没有关联 会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应 2.会话路径技术使用Cookie或session完成 我们知道HTTP ...

  3. Django之会话机制cookie、session使用

    login视图函数: def login(request): if request.method == 'POST': username = request.POST.get('username') ...

  4. Python后台开发Django(会话控制)

    页面跳转 页面跳转的url中必须在最后会自动添加[\],所以在urls.py的路由表中需要对应添加[\] from django.shortcuts import redirect #导入 retur ...

  5. Django 1.10 中文文档------3.3.8 会话sessions

    django支持匿名会话.它将数据存放在服务器端,并抽象cookies的发送和接收过程.cookie包含一个会话ID而不是数据本身(除非你使用的是基于后端的cookie). 3.3.8.1 启用会话 ...

  6. django会话session

    因为因特网HTTP协议的特性,每一次来自于用户浏览器的请求(request)都是无状态的.独立的.通俗地说,就是无法保存用户状态,后台服务器根本就不知道当前请求和以前及以后请求是否来自同一用户.对于静 ...

  7. 第六章:Django 综合篇 - 6:会话session

    因为因特网HTTP协议的特性,每一次来自于用户浏览器的请求(request)都是无状态的.独立的.通俗地说,就是无法保存用户状态,后台服务器根本就不知道当前请求和以前及以后请求是否来自同一用户.对于静 ...

  8. 利用django创建一个投票网站(一)

    这是教程的原始链接:http://django-intro-zh.readthedocs.io/zh_CN/latest/part1/ 创建你的第一个 Django 项目, 第一部分 来跟着实际项目学 ...

  9. Django框架使用一 基本介绍,安装和建项篇

    Django概述 Django 是在快节奏的编辑环境中开发的,设计使得常见 Web 开发任务快速且容易;它可以编写一个数据驱动的Web应用程序,简单的说就是不需要开发者操作数据库. 设计数据模型 尽管 ...

随机推荐

  1. Android ListView 中加入CheckBox/RadioButton 选择状态保持、全选、反选实现

    最近在一个项目中,需要在ListView的item中加入CheckBox,但是遇到的一个问题是上下滑动的时候如果有选择了的CheckBox,就会出现选择项错误的问题,下面将个人的解决方法总结如下;先说 ...

  2. ContestHunter暑假欢乐赛 SRM 15

    菜菜给题解,良心出题人!但我还是照常写SRM一句话题解吧... T1经典题正解好像是贪心...我比较蠢写了个DP,不过还跑的挺快的 f[i]=min( f[j-a[j]-1] )+1  { j+a[j ...

  3. mysql的主从复制原理与实现

    关于mysql的主从复制,之前一直在听说这个话题,一直没有实现,昨天学习了下,原来是这么回事: 既然是主从复制,那么肯定有主有从,也就说一个主数据库(一般为写库),一个从数据库(读库).主数据库更新了 ...

  4. lightoj 1245

    lightoj 1245 Harmonic Number (II) 题意:给定一个 n ,求 n/1 + n/2 + …… + n/n 的值(这里的 "/" 是计算机的整数除法,向 ...

  5. Sublime Text 3 一些简单使用

    1.注释 选中需要注释的代码,“Ctrl+/”单行注释,“Ctrl+Shift+/”多行注释.同样操作,可以取消注释. 2.查找 “Ctrl+F”,在底部会出现快速搜索框,在搜索框中输入需要搜索的变量 ...

  6. [LA3523/uva10195]圆桌骑士 tarjan点双连通分量+奇环定理+二分图判定

    1.一个环上的各点必定在同一个点双连通分量内: 2.如果一个点双连通分量是二分图,就不可能有奇环: 最基本的二分图中的一个环: #include<cstdio> #include<c ...

  7. 【bzo1579】拆点+dijkstra优先队列优化+其他优化

    题意: n个点,m条边,问从1走到n的最短路,其中有K次机会可以让一条路的权值变成0.1≤N≤10000;1≤M≤500000;1≤K≤20 题解: 拆点,一个点拆成K个,分别表示到了这个点时还有多少 ...

  8. 【NOI】2004 郁闷的出纳员

    [算法]平衡树(treap) [题解] treap知识见数据结构. 解法,具体细节见程序. #include<cstdio> #include<algorithm> #incl ...

  9. MySQL数据库运行环境的搭建

    第一步:安装wampserver2.5-Apache-2.4.9-Mysql-5.6.17-php5.5.12-64b文件,安装过程中可能会遇到问题,把遇到的问题代码复制粘贴到360人工服务,查找方案 ...

  10. 基于 Docker 的 Zabbix 微服务系统

    zabbix 官网提供一个镜像 [ zabbix-appliance ], 可以直接拉起一个 zabbix-server. 但是数据库无法分离出来. 本实践使用 zabbix 官方提供的 Docker ...