Django(34)Django操作session(超详细)
前言
session: session和cookie的作用有点类似,都是为了存储用户相关的信息。不同的是,cookie是存储在本地浏览器,session是一个思路、一个概念、一个服务器存储授权信息的解决方案,不同的服务器,不同的框架,不同的语言有不同的实现。虽然实现不一样,但是他们的目的都是服务器为了方便存储数据的。session的出现,是为了解决cookie存储数据不安全的问题的。
cookie和session的使用
web开发发展至今,cookie和session的使用已经出现了一些非常成熟的方案。在如今的市场或者企业里,一般有两种存储方式:
- 存储在服务端:通过
cookie存储一个sessionid,然后具体的数据则是保存在session中。如果用户已经登录,则服务器会在cookie中保存一个sessionid,下次再次请求的时候,会把该sessionid携带上来,服务器根据sessionid在session库中获取用户的session数据。就能知道该用户到底是谁,以及之前保存的一些状态信息。这种专业术语叫做server side session。Django把session信息默认存储到数据库中,当然也可以存储到其他地方,比如缓存中,文件系统中等。存储在服务器的数据会更加的安全,不容易被窃取。但存储在服务器也有一定的弊端,就是会占用服务器的资源,但现在服务器已经发展至今,一些session信息还是绰绰有余的。 - 将
session数据加密,然后存储在cookie中。这种专业术语叫做client side session。flask框架默认采用的就是这种方式,但是也可以替换成其他形式。
django中应用session
1.启用session
要应用session,必须开启session中间层,在settings中:
MIDDLEWARE = [
# 启用 Session 中间层
'django.contrib.sessions.middleware.SessionMiddleware',
]
2.session的5种存储机制
默认情况下,session数据是存储到数据库中的。我们如何得知呢?可以从Django的默认配置中查看到,Django的默认配置路径是from django.conf import global_settings,我们可以打开然后查看到默认配置,代码如下:
# Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
SESSION_COOKIE_NAME = 'sessionid'
# Session的cookie失效日期(2周)(默认)
SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2
# Session的cookie保存的域名(默认)
SESSION_COOKIE_DOMAIN = None
# 是否Https传输cookie(默认)
SESSION_COOKIE_SECURE = False
# Session的cookie保存的路径(默认)
SESSION_COOKIE_PATH = '/'
# 是否Session的cookie只支持http传输(默认)
SESSION_COOKIE_HTTPONLY = True
# 是否每次请求都保存Session,默认修改之后才保存(默认)
SESSION_SAVE_EVERY_REQUEST = False
# 是否关闭浏览器使得Session过期(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False
# 存储session数据默认使用的模块
SESSION_ENGINE = 'django.contrib.sessions.backends.db'
# session数据的序列化类
SESSION_SERIALIZER = 'django.contrib.sessions.serializers.JSONSerializer'
这里我们可以看到SESSION_ENGINE = 'django.contrib.sessions.backends.db'django默认使用的是存储到数据库中,这只是存储机制中的其中一种,下面我们逐一介绍
1.数据库方式
使用数据库。默认就是这种方案。
# 数据库方式(默认):
SESSION_ENGINE = 'django.contrib.sessions.backends.db'
# 数据库类型的session引擎需要开启此应用,启用 sessions 应用
INSTALLED_APPS = [
'django.contrib.sessions',
]
2.缓存
使用缓存来存储session。想要将数据存储到缓存中,前提是你必须要在settings.py中配置好CACHES,并且是需要使用Memcached,而不能使用纯内存作为缓存。
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
3.缓存+数据库
在存储数据的时候,会将数据先存到缓存中,再存到数据库中。这样就可以保证万一缓存系统出现问题,session数据也不会丢失。在获取数据的时候,会先从缓存中获取,如果缓存中没有,那么就会从数据库中获取。
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'
4.文件
使用文件来存储session。
SESSION_ENGINE = 'django.contrib.sessions.backends.file'
# 设置文件位置, 默认是 tempfile.gettempdir(),
# linux下是:/tmp
# windows下是: C:\Users\51508\AppData\Local\Temp
SESSION_FILE_PATH = 'd:\session_dir'
5.加密cookie
基于cookie的session,所有数据都保存在cookie中,一般情况下不建议使用这种方式
- cookie有长度限制,4096个字节
- cookie不会因为服务端的注销而无效,那么可能造成攻击者使用已经登出的cookie模仿用户继续访问网站
- SECRET_KEY这个配置项绝对不能泄露,否则会让攻击者可以远程执行任意代码
- cookie过大,会影响用户访问速度
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'
3.操作session
- get:用来从session中获取指定值。
- pop:从session中删除一个值。
- keys:从session中获取所有的键。
- items:从session中获取所有的值。
- clear:清除当前这个用户的session数据。
- flush:删除session并且删除在浏览器中存储的
session_id,一般在注销的时候用得比较多。 - set_expiry(value):设置过期时间。
- 整形:代表秒数,表示多少秒后过期。
- 0:代表只要浏览器关闭,
session就会过期。 - None:会使用全局的session配置。在settings.py中可以设置
SESSION_COOKIE_AGE来配置全局的过期时间。默认是1209600秒,也就是2周的时间。
- clear_expired:清除过期的
session。Django并不会清除过期的session,需要定期手动的清理,或者是在终端,使用命令行python manage.py clearsessions来清除过期的session。
实战案例
session其实本质也是基于cookie使用的,使用起来跟session差不多,先创建3个路由地址
urlpatterns = [
path('set_session/', views.set_session, name='set_session'),
path('get_session/', views.get_session, name='get_session'),
path('clear_session/', views.clear_session, name='clear_session')
]
然后编写对应的视图
def set_session(request):
"""设置session"""
request.session["username"] = "jkc"
return HttpResponse("session_view")
def get_session(request):
"""获取session"""
username = request.session.get("username")
return HttpResponse(f"session的值为{username}")
def clear_session(request):
"""清除session"""
request.session.clear()
return HttpResponse("清除session成功")
接着我们在浏览器上先打开F12,然后输入url地址http://127.0.0.1:8000/session/set_session/,我们可以看到响应头中有后台返回的set-cookie里面有个sessionid,这个sessionid就是前端传给后台,后台经过一系列加密操作后返回给前端浏览器的key

因为我们django默认存储session的机制是数据库,所以数据库中的django_session表中也会有同样key的一条数据

接着我们在浏览器上访问http://127.0.0.1:8000/session/get_session/,浏览器页面上会返回session的值为jkc,说明我们的session的key是正确的,且没有过期。
最后再访问http://127.0.0.1:8000/session/clear_session/,浏览器页面返回清除session成功,如何证明呢?我们可以再次访问http://127.0.0.1:8000/session/get_session/,我们会发现这次返回的是session的值为None,值为None说明session已经被清空
Django(34)Django操作session(超详细)的更多相关文章
- Django(35)Django请求生命周期分析(超详细)
Django请求生命周期分析 1.客户端发送请求 在浏览器输入url地址,例如www.baidu.com,浏览器会自动补全协议(http),变为http://www.baidu.com,现在部分网站都 ...
- VS2010程序打包操作(超详细的)
1. 在vs2010 选择“新建项目”----“其他项目类型”----“Visual Studio Installerà“安装项目”: 命名为:Setup1 . 这是在VS2010中将有三个文件夹, ...
- VS2010程序打包操作(超详细的)转
1. 在vs2010 选择“新建项目”----“其他项目类型”----“Visual Studio Installerà“安装项目”: 命名为:Setup1 . 这是在VS2010中将有三个文件夹, ...
- {Django基础八之cookie和session}一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session
Django基础八之cookie和session 本节目录 一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session 六 xxx 七 ...
- Django操作session
session是存放在服务端的,在django中使用session必须要先在数据库中创建django_session表,session相关信息都要依赖此表 获取session request.sess ...
- [py][mx]django的cookie和session操作-7天免登录
浏览器同源策略(same-origin policy) csrf攻击防御核心点总结 django的cookie和session操作-7天免登录 flask操作cookie&django的see ...
- Django中cookie和session的操作
一.cookie和session cookie:在网站中,http请求是无状态的.也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户.cookie的出现就是 ...
- django 2 ORM操作 ORM进阶 cookie和session 中间件
ORM操作 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述 ...
- Django中Cookie和Session配置和操作
Cookie Cookie以键值对Key-Value形势进行信息的存储. Cookie基于域名安全,不同域名的Cookie是不能互相访问的 Cookie是存储在浏览器中的一段纯文本信息,建议不要存储敏 ...
随机推荐
- SqlServer触发器的创建与使用
前言 上期我们介绍了SqlServer的视图和存储过程创建与使用,这期我们介绍一下触发器. 有需要回顾的可以电梯直达看一下: SqlServer视图的创建与使用 SqlServer存储过程的创建与使用 ...
- [题解] T'ill It's Over
前言 线段树+网络最大流的建模题. 博客园食用更佳 题目大意 最初时有 \(n\) 个 \(1\) .给定 \(op\) . \(l\) ,其中, \(l\) 为操作次数上限.你有四个操作: 若 \( ...
- SpringBoot-13 Dubbo实战
SpringBoot-13 Dubbo实战 前提: 已经准备好Dubbo-admin和Zookeeper 前置准备 1.创建项目 显示创建一个Empty Project,创建两个Module---&g ...
- JS基础学习第四天
对象(Object) 对象是JS中的引用数据类型对象是一种复合数据类型,在对象中可以保存多个不同数据类型的属性使用typeof检查一个对象时,会返回object 对象的分类: 1.内建对象- 由ES标 ...
- Python是啥?为什么这么多职业人和学生就算报班也要学它?!
嗨,大家好 这里是汐仔 首先我们先来考究一下近几年的头条和新闻. 1.早在2018年python就已经被纳入高考之一了 2.Python加入全国计算机等级考试,从2018年九月起新增为大学计算机二级考 ...
- 说一下的dubbo的工作原理?注册中心挂了可以继续通信吗?
(1)dubbo工作原理 第一层:service层,接口层,给服务提供者和消费者来实现的 第二层:config层,配置层,主要是对dubbo进行各种配置的 第三层:proxy层,服务代理层,透明生成客 ...
- .netcore 写快递100的快递物流信息查询接口
快递100的物流信息查询接口,官方提供了一些demo;还好官方提供的代码是.netcore版本写的,不过写的有点low;根据官方提供的代码,我按照.netcore 的风格重构了代码:核心代码如下: / ...
- 【Azure Redis 缓存 Azure Cache For Redis】Redis连接池
问题描述 Redis根据定价层说明,不同级别支持的连接数最多可达4万(同时),但是当短时间又大量连接请求建立的时候,Redis服务的服务压力非常大,到达100%.严重影响了高响应的要求.最严重时,经常 ...
- Vue 批量注册局部组件及应用
博客地址:https://ainyi.com/105 批量注册路由的有个博客说到:https://ainyi.com/77 实际工作中,可能会遇到一个大页面里面有很多个模块,这些模块一般是需要拆分到单 ...
- 033- while循环语句
语法 初始化语句; while(boolean表达式) { 循环体语句; 控制条件语句; } 执行过程: 只要boolean表达式里面的结果是true,就会执行while大括号里面的语句,直到bool ...