@



介绍


Cookie虽然在一定程度上解决了"保持状态"的需求,但是由于Cookie本身最大支持4096字节,以及Cookie本身保存在客户端,可能被拦截或窃取,因此就需要有一种新的东西,它能支持更多的字节,并且它保存在服务器,有较高的安全性。这就是Session.

问题来了,基于HTTP协议的无状态特征,服务器根本就不知道访问者是"谁",因此上述的Coolie就起到了桥接的作用.

我们可以给每个客户端的Cookie分配一个唯一的id,这样用户在访问时,通过Cookie,服务器就知道来的人是"谁"了。然后我们再根据不同的Cookie的id,在服务器上保存一段时间的私密资料,如"账号密码"等等.

总结而言:Cookie弥补了HTTP无状态的不足,让服务器知道来的人是"谁",但是Cookie以文本的形式保存在本地,自身安全性较差。所以我们就通过Cookie识别不同的用户,对应的Session里保存私密的信息以及超过4096的文本.

上述所说的Cookie与Session,是共通性的"东西",不限于语言和框架.



Django中操作Session


获取、设置、删除Session中的数据:

  1. def test(request):
  2. """设置键值对"""
  3. request.session['user'] = 'zyk' # 设置键值对{'user': 'zyk'}
  4. request.session.setdefault('pwd', '123') # 设置键值对{'pwd': '123'}, 如果存在则不设置
  5. """获取键值对"""
  6. user = request.session['user'] # 获取'user'的值
  7. pwd = request.session.get('pwd', None) # 获取'pwd'的值, 如果不存在则返回None
  8. """删除键值对"""
  9. del request.session['user', 'pwd'] # 删除指定的键值对cookie
  10. # request.session.delete() # 删除该用户的所有session, 不删除cookie
  11. # request.session.flush() # 删除该用户的所有session, 删除cookie
  12. return HttpResponse('is ok')

获取所有键、值、键值对:

  1. def test(request):
  2. """设置键值对"""
  3. request.session['user'] = 'zyk' # 设置键值对{'user': 'zyk'}
  4. request.session.setdefault('pwd', '123') # 设置键值对{'pwd': '123'}, 如果存在则不设置
  5. """获取所有键、值、键值对"""
  6. keys = request.session.keys() # dict_keys(['user', 'pwd'])
  7. values = request.session.values() # dict_values(['zyk', '123'])
  8. items = request.session.items() # dict_items([('user', 'zyk'), ('pwd', '123')])
  9. return HttpResponse('is ok')

操作会话的session:

  1. def test(request):
  2. """设置键值对"""
  3. request.session['user'] = 'zyk' # 设置键值对{'user': 'zyk'}
  4. request.session.setdefault('pwd', '123') # 设置键值对{'pwd': '123'}, 如果存在则不设置
  5. """会话session的key"""
  6. session_key = request.session.session_key # liucwhvkrccdsgkcibvyu4ar5c56ssw1, 如果不存在则返回None
  7. """检查会话session的key在数据库中是否存在"""
  8. ret = request.session.exists(session_key) # 存在返回True, 否则False
  9. """将所有Session失效日期小于当前日期的数据删除"""
  10. request.session.clear_expired()
  11. """删除当前会话的所有Session数据(不会删除键值对)"""
  12. request.session.delete()
  13. """删除当前会话数据并删除会话的Cookie(会删除键值对)"""
  14. request.session.flush()
  15. # 这用于确保前面的会话数据不可以再次被用户的浏览器访问.
  16. # 例如, django,contrib.auth.logout()函数中就会调用它.
  17. return HttpResponse('is ok')

设置会话session与Cookie的超时时间:

  1. def test(request):
  2. """设置键值对"""
  3. request.session['user'] = 'zyk' # 设置键值对{'user': 'zyk'}
  4. request.session.setdefault('pwd', '123') # 设置键值对{'pwd': '123'}, 如果存在则不设置
  5. """设置会话Session和Cookie的超时时间"""
  6. value = 0
  7. request.session.set_expiry(0)
  8. # 如果value是个整数, session会在value秒后失效;
  9. # 如果value是个datatime或timedelta, session会在这个时间后失效;
  10. # 如果value是0, 用户关闭浏览器后session就会失效;
  11. # 如果Value是None, session会依赖全局session失效策略.
  12. # 默认超时时间为两周: SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2
  13. # 设置超时时间后(非None), 可通过获取键值对获得失效时间('_session_expiry', 1):
  14. items = request.session.items() # dict_items([('user', 'zyk'), ('pwd', '123'), ('_session_expiry', 1)])
  15. return HttpResponse('is ok')

Session流程解析:


Session版登陆验证:

  1. # 装饰器函数
  2. def login_request(fn):
  3. """如果未登陆,将返回login页面"""
  4. def inner(request, *args, **kwargs):
  5. if request.session.get('is_login') != '1':
  6. # 获取当前url路径
  7. next = request.path_info
  8. return redirect('/login/?next=%s' % next)
  9. ret = fn(request, *args, **kwargs)
  10. return ret
  11. return inner
  12. # 登陆功能
  13. def login(request):
  14. if request.method == 'POST':
  15. user, pwd = request.POST.get('user'), request.POST.get('pwd')
  16. if models.Userinfo.objects.filter(name=user, pwd=pwd):
  17. # 设置session
  18. request.session['is_login'] = '1'
  19. # 设置session超时时间,0:关闭浏览器时失效
  20. request.session.set_expiry(0)
  21. next = request.GET.get('next')
  22. ret = redirect(next) if next else redirect('/index/')
  23. return ret
  24. return render(request, 'login.html')
  25. @login_request
  26. def home(request):
  27. return HttpResponse("我是home页面")
  28. # @login_request
  29. def index(request):
  30. # 获取session的key
  31. # session_key = request.session.session_key
  32. return render(request, 'index.html')
  33. @login_request
  34. def logout(request):
  35. # 删除当前会话数据并删除会话的Cookie
  36. request.session.flush()
  37. return redirect('/login/')

Django中Session配置:

Django中默认支持Session,其内部提供了5种类型的Session供开发者使用.

Django中Session相关配置:

  1. 1. 数据库Session
  2. SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认)
  3. 2. 缓存Session
  4. SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎
  5. SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
  6. 3. 文件Session
  7. SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎
  8. SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()
  9. 4. 缓存+数据库
  10. SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎
  11. 5. 加密Cookie Session
  12. SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎
  13. 其他公用设置项:
  14. SESSION_COOKIE_NAME "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
  15. SESSION_COOKIE_PATH "/" # Session的cookie保存的路径(默认)
  16. SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默认)
  17. SESSION_COOKIE_SECURE = False # 是否Https传输cookie(默认)
  18. SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认)
  19. SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认)
  20. SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认)
  21. SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认)

【Django】Session的更多相关文章

  1. 【Django】 初步学习

    这个系列(或者成不了一个系列..)预计会全程参考Vamei様的Django系列,膜一发.说句题外话,其实更加崇拜像Vamei那样的能够玩转生活.各个领域都能取得不小成就的人. [Django] ■ 概 ...

  2. 【Django】ORM操作#2

    目录 必知必会的13条查询方法 单表查询之神奇的双下划线 一对多 ForeignKey 多对多 ManyToManyField 在Python脚本中调用Django环境 Django终端打印SQL语句 ...

  3. 【Django】ORM操作#1

    目录 一.介绍 概念 由来 优势 劣势 总结 二.Django中的ORM Django项目使用MySQL Model 快速入门 1. AutoField 2. IntegerField 3. Char ...

  4. Python学习笔记整理总结【Django】:模板语言、分页、Cookie、Session

    一.模板语言  1.在前段展示:对象/字典/元组 class Business(models.Model): # id #用默认的自增id列 即:Business中有3列数据(id, caption, ...

  5. 【Django】优化小技巧之清除过期session

    事情是这样的,大概也就几万注册用户的站点(使用django1.6), session 存储在关系型数据库,这次上线之后发现session表几十万数据了,过期session没有被自动删除 思考 官网 s ...

  6. 【Django】 rest-framework和RestfulAPI的设计

    [rest-framework] 这是一个基于django才能发挥作用的组件,专门用于构造API的. 说到API,之前在其他项目中我也做过一些小API,不过那些都是玩票性质,结构十分简单而且要求的设计 ...

  7. 【Django】【二】模板

    1. Django-bootstrap3 guest>python -m pip install django-bootstrap3 [代码] settings.py ""& ...

  8. 【Django】--Form组件

    Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 例子: 1.创建Form类 from djan ...

  9. 【Django】--Model字段

    参考地址:http://www.cnblogs.com/wupeiqi/articles/6216618.html 所有字段 AutoField(Field) --int自增列,必须填入参数prima ...

随机推荐

  1. Qt之字典划词

    简述 相信大家都用过词典吧!因为英语不太好...O(∩_∩)O~,所以经常进行划词翻译! 简述 实现 效果 源码 更多参考 实现 原理:鼠标移至某单词之上,获取鼠标位置,然后在对应位置进行取词,翻译! ...

  2. 搭建基于qemu + eclipse的kernel调试环境(by quqi99)

    作者:张华  发表于:2016-02-06版权声明:能够随意转载.转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 ( http://blog.csdn.net/quqi99 ) 使用q ...

  3. Linux 文件描写叙述符设置为非堵塞的方法

    通过fcntl设置文件描写叙述符属性 fcntl即F_SETFL,F_GETFL的使用,设置文件的flags,堵塞设置成非堵塞,非堵塞设置成堵塞(这连个在server开发中能够封装为基本函数) 1.获 ...

  4. ASMlib操作系统包安装与配置asm disk磁盘

    1.加入6块硬盘,每块100g.不管是热加还是冷加.不管是加硬盘,用san存储划lun,或者再加上多路径,都是能够这么做的. 在操作系统层,能识别这种lun.以下的sdb就是一个刚划分的300g的lu ...

  5. centos7 安装swftools Apache_OpenOffice

    centos7 yum -y install wget wget http://www.swftools.org/swftools-0.9.2.tar.gz tar -xf swftools-.tar ...

  6. Frame Stacking ZOJ 1083,poj 1128

    Frame Stacking Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4034   Accepted: 1352 De ...

  7. 3.bind与仿函数以及普通函数

    #include <iostream> #include <string> #include <vector> #include <algorithm> ...

  8. BZOJ 2049 LCT

    思路:LCT的基本操作 //By SiriusRen #include <cstdio> #include <cstring> #include <algorithm&g ...

  9. java必会的英语单词

    Java开发常用英语单词表   第一章:public['pʌblik] 公共的,公用的static['stætik] 静的;静态的;静止的void:[vɔid] 空的main:[mein] 主要的 重 ...

  10. codeforces 400 D Dima and Bacteria【并查集 Floyd】

    题意:给出n个点,分别属于k个集合,判断每个集合里面的点的距离都为0,为0的话输出yes,并输出任意两个集合之间的最短路 这道题目有两个地方不会处理, 先是n个点,分别属于k个集合,该怎么记录下来这里 ...