1.状态保持

  • http协议是无状态的:每次请求都是一次新的请求,不会记得之前通信的状态
  • 客户端与服务器端的一次通信,就是一次会话
  • 实现状态保持的方式:在客户端或服务器端存储与会话有关的数据
  • 存储方式包括cookie、session,会话一般指session对象
  • 使用cookie,所有数据存储在客户端,注意不要存储敏感信息
  • 推荐使用sesison方式,所有数据存储在服务器端,在客户端cookie中存储session_id
  • 状态保持的目的是在一段时间内跟踪请求者的状态,可以实现跨页面访问当前请求者的数据
  • 注意:不同的请求者之间不会共享这个数据,与请求者一一对应

2.session

启用session

  • 使用django-admin startproject创建的项目默认启用
  • 在settings.py文件中
项INSTALLED_APPS列表中添加:
'django.contrib.sessions',


项MIDDLEWARE_CLASSES列表中添加:
'django.contrib.sessions.middleware.SessionMiddleware',

  • 禁用会话:删除上面指定的两个值,禁用会话将节省一些性能消耗

使用session

  • 启用会话后,每个HttpRequest对象将具有一个session属性,它是一个类字典对象
  • get(key, default=None):根据键获取会话的值
  • clear():清除所有会话
  • flush():删除当前的会话数据并删除会话的Cookie
  • del request.session['member_id']:删除会话

3 .用户登录示例

  • 在views.py文件中创建视图
from django.shortcuts import render, redirect
from django.core.urlresolvers import reversedef index(request):uname = request.session.get('uname')return render(request, 'booktest/index.html', {'uname': uname})def login(request):return render(request, 'booktest/login.html')def login_handle(request):request.session['uname'] = request.POST['uname']return redirect(reverse('main:index'))def logout(request):# request.session['uname'] = None# del request.session['uname']# request.session.clear()request.session.flush()return redirect(reverse('main:index'))

  • 配置url
主url:
from django.conf.urls import include, url
urlpatterns = [url(r'^', include('booktest.urls', namespace='main'))
]

应用url:
from django.conf.urls import url
from . import views
urlpatterns = [url(r'^$', views.index, name='index'),url(r'login/$', views.login, name='login'),url(r'login_handle/$', views.login_handle, name='login_handle'),url(r'logout/$', views.logout, name='logout')
]

  • 创建模板index.html
<!DOCTYPE html>
<html>
<head><title>首页</title>
</head>
<body>
你好:{{uname}}
<hr/>
<a href="{%url 'main:login'%}">登录</a>
<hr/>
<a href="{%url 'main:logout'%}">退出</a>
</body>
</html>

  • 创建模板login.html
<!DOCTYPE html>
<html>
<head><title>登录</title>
</head>
<body>
<form method="post" action="/login_handle/"><input type="text" name="uname"/><input type="submit" value="登录"/>
</form>
</body>
</html>

# 通过用户登陆练习
# session练习def session1(request):uname = request.session.get('myname', '未登录')context = {'uname': uname}return render(request, 'booktest/session1.html', context)def session2(request):context = {}return render(request, 'booktest/session2.html', context)def session2_handle(request):uname = request.POST['uname']request.session['myname'] = unamereturn redirect('/booktest/session1')def session3(request):# 删除session# request.session.flush()del request.session['myname']return redirect('/booktest/session1')

View

4.会话过期时间

  • set_expiry(value):设置会话的超时时间
  • 如果没有指定,则两个星期后过期
  • 如果value是一个整数,会话将在values秒没有活动后过期
  • 若果value是一个imedelta对象,会话将在当前时间加上这个指定的日期/时间过期
  • 如果value为0,那么用户会话的Cookie将在用户的浏览器关闭时过期
  • 如果value为None,那么会话永不过期
  • 修改视图中login_handle函数,查看效果
def login_handle(request):request.session['uname'] = request.POST['uname']# request.session.set_expiry(10)# request.session.set_expiry(timedelta(days=5))# request.session.set_expiry(0)# request.session.set_expiry(None)return redirect(reverse('main:index'))

5

5. 存储session

  • 使用存储会话的方式,可以使用settings.py的SESSION_ENGINE项指定
  • 基于数据库的会话:这是django默认的会话存储方式,需要添加django.contrib.sessions到的INSTALLED_APPS设置中,运行manage.py migrate在数据库中安装会话表,可显示指定为
SESSION_ENGINE='django.contrib.sessions.backends.db'

  • 基于缓存的会话:只存在本地内在中,如果丢失则不能找回,比数据库的方式读写更快
SESSION_ENGINE='django.contrib.sessions.backends.cache'

  • 可以将缓存和数据库同时使用:优先从本地缓存中获取,如果没有则从数据库中获取
SESSION_ENGINE='django.contrib.sessions.backends.cached_db'

  • session存放位置

6.使用Redis缓存session

  • 会话还支持文件、纯cookie、Memcached、Redis等方式存储,下面演示使用redis存储
  • 安装包
pip install django-redis-sessions

  • 修改settings中的配置,增加如下项
SESSION_ENGINE = 'redis_sessions.session'
SESSION_REDIS_HOST = 'localhost'
SESSION_REDIS_PORT = 6379
SESSION_REDIS_DB = 0
SESSION_REDIS_PASSWORD = ''
SESSION_REDIS_PREFIX = 'session'

  • 管理redis的命令
启动:sudo redis-server /etc/redis/redis.conf
停止:sudo redis-server stop
重启:sudo redis-server restart
redis-cli:使用客户端连接服务器
keys *:查看所有的键
get name:获取指定键的值
del name:删除指定名称的键

session依赖于cookies

7.session总结

转载于:https://www.cnblogs.com/venicid/p/8289114.html

3 View - 状态保持 session相关推荐

  1. http相关知识 - (2)状态管理 - session

    http相关知识 - (2)状态管理 - session 1. Session原理 (1)Session用于存储特定的用户会话所需的信息.Session对象的引入是为了弥补无状态HTTP协议的不足. ...

  2. 登录状态保持Session/Cookie

    登录成功: 1.Session保存User对象. 2.Cookie保存唯一值UserID(或者usercode)和加密Sign(生成规则自己定义,MD5用户名,用户ID,私有串等),并设置过期时间. ...

  3. Nhibernate中session的状态与session.connection.state状态的差别的解释

    在项目中用到了nhibernate,但是需要判断数据连接的状态,在NHIbernate的文档中找了半天,英文的中文的都看了一遍,都没找到相关的说明 .后来在Hibernate的论坛上才找到了一些说明. ...

  4. 2021-06-04 Java对象在Hibernate下的4种状态和Session相关方法以及对象识别

    注:集成开发环境软件:MyEclipse(2017破解版)和mySQL(MySQL Server 8.0) 一.Query(查询) (1)Query(查询)接口允许你在数据库上执行查询并控制查询如何执 ...

  5. oracle日期减5s,Oracle SNIPED状态的session 多长时间自动清理释放连接?

    本帖最后由 yixiuquan 于 2015-9-24 17:44 编辑 bfc99 发表于 2015-9-23 16:00 要用两台机器测,一个做数据库服务器,一个模拟客户端. 测试方法: 1.在服 ...

  6. Android-一只手指滑动View,另一只手指按Home键,重新进入后View状态无法更新的问题...

    上午测试报了一个bug:说是一只手指拖动虚拟摇杆上的View滑块不松,另一只手指点击Home键将App压后台,重新进入的时候,View滑块卡死了. 刚开始看到这个问题感觉很奇怪,因为正常情况下,手指离 ...

  7. JSP装状态管理 session cookie

    使用URL字符串编码与解码的工具类,这个工具类在java.net包里面 在编码之前加入request.setCharacterEncoding("utf-8"); //使用URLE ...

  8. session 中对象实例在不同事务中的状态

    不同事务中执行hibernate query,则查询出来的对象会在不同session中,或一个在托管态,一个在session中管理,所以是不同实例. 如果在同一事务中的话,则多次query出来的对象实 ...

  9. SpringCloud 配置安全验证、服务消费端处理、无状态 Session 配置、定义公共安全配置程序类

    所有的 Rest 服务最终都是暴露在公网上的,也就是说如果你的 Rest 服务属于一些你自己公司的私人业务,这样的结果会直接 导致你信息的泄漏,所以对于 Rest 访问,安全性是首要的因素. 2.1. ...

最新文章

  1. awk 控制语句(if for do while)
  2. 子组件跟随父组件re-render
  3. 工业交换机的单模和多模能否互相替代?
  4. 阿里云AHAS Chaos:应用及业务高可用提升工具平台之故障演练
  5. 快毕业才发现自己找不到工作,为什么实习经历如此重要?
  6. 初中数学抽象教学的案例_初中八年级数学上册教学视频汇总
  7. ExtAspNet发展规划
  8. 关于CoreData的使用
  9. 留存光明延续大爱 80后父母捐病儿角膜感动冰城
  10. oracle数据库,使用plsql导出表数据缺少空表
  11. React 预览图片 视频 音频_HDMI录制盒斗鱼虎牙高清视频游戏直播器1080监控switch/ps4采集卡...
  12. Vue 使用vue-json-excel 实现导出Excel
  13. matplotlib绘制正弦曲线
  14. 很强悍的在线科学计算器
  15. 多重集合的排列与组合
  16. matlab 还原内部函数,matlab内部函数
  17. Windows Server搭建SAN存储服务(iSCSI)
  18. c语言数据结构课程设计停车场管理系统,数据结构课程设计报告停车场管理系统...
  19. 时间转换 秒(s)转 ()天 ()小时() 分钟 ()秒
  20. MAC上QuickTime截取音乐片段/iphone换铃声

热门文章

  1. Linux C 数据结构---线性表
  2. Linux C 指针练习
  3. Host SMBus controller not enabled的解决方法
  4. 深入了解crc32算法
  5. TCP重组数据包分析
  6. React开发(256):react项目理解 ant design 注意报错提示
  7. 前端学习(2954):vue文件的三大组成部分
  8. [css] 你了解CSS Houdini吗?说说它的运用场景有哪些?
  9. [css] 用css实现一个等腰三角形的小图标
  10. 工作315:uni-修改添加时间的逻辑