django会话
django会话
可以把会话理解为客户端与服务器之间的一次会晤,在一次会话过程中有多次请求和响应,但是由于HTTP协议的特性-->无状态,每次浏览器的请求都是无状态的,无法保存状态信息,也就是说后台服务器不知道当前请求是否和上一次的请求是来自同一个用户的,试想一下,淘宝京东,无法识别用户并保存用户的状态是致命的。
一、cookie的原理
为了保持连接状态,便有了cookie的由来,cookie是存储在本地服务器上的一个key-value结构的数据,类似于python中的字典,通过cookie除了可以保存连接状态,还可以保存用户信息等数据。
客户端发起请求,服务端生成cookie响应浏览器,这时客户端会将cookie保存起来,当下一次访问服务器的时候会将cookie一起发送给服务器,服务器通过cookie判断是谁的访问
注:如果服务端发送重复的cookie,会覆盖原有的cookie
二、django中操作cookie
1.启用会话
Django通过一个内置中间件来实现会话功能
编辑settings.py中的MIDDLEWARE设置
django.contrib.sessions.middleware.SessionMiddlewar
2.配置会话引擎
1. 数据库Session
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认)
然后运行 manage.py migrate 在数据库内创建sessions表
2. 缓存Session
SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎
SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
3. 文件Session
SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎
SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()
4. 缓存+数据库
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎
5. 加密Cookie Session
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎
其他公用设置项:
SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径(默认)
SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默认)
SESSION_COOKIE_SECURE = False # 是否Https传输cookie(默认)
SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认)
SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认)
SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认)
3.在视图中操作cookie
3.1设置cookie
def set_cookie(request):
obj = HttpResponse('ok') #obj=render(request,...)
obj.set_cookie('name', 'ABC')
# obj.set_signed_cookie(key,value,salt='加密盐')
obj.set_signed_cookie('name','lqz',salt='123')#加盐,123是个密码,解cookie的时候需要它,
return obj
参数:
- key--->键
- value--->值
- max_age=None--->超时时间,cookie延续的时间,以秒为单位,
- 超时时间expires,传一个datatime对象
- path='/',可以设置路径,设置路径之后,path='/index/',只有访问index的时候,才会携带cookie过来
- domain 设置域名下有效domain='map.baidu.com'
- secure=False, (默认是false,设置成True浏览器将通过HTTPS来回传cookie)
- httponly=True 只能https协议传输,阻止javascript对会话数据的访问,提高安全性。(不是绝对,底层抓包可以获取到也可以被覆盖)
3.2获取cookie
def get_cookie(request):
print(type(request.COOKIES))
# 取cookie的值
print(request.COOKIES)
name=request.COOKIES.get('name')
#加盐,123是个密码,解cookie的时候需要它,
# request.get_signed_cookie(key, default=RAISE_ERROR, salt='123', max_age=None)
obj = HttpResponse('get_cookie')
return obj
3.3删除cookie
def logout(request):
rep = redirect("/login/")
rep.delete_cookie("user") # 删除用户浏览器上之前设置的usercookie值
return rep
三、session
cookie本身保存在客户端,可能被拦截或窃取,所以网站设计通常将Cookie用来保存一些不重要的内容,实际的用户数据和状态还是以Session会话的方式保存在服务器端。
Session就是在服务器端的‘Cookie’,Session依赖Cookie!
给每个客户端的Cookie分配一个唯一的id,这样用户在访问时,通过Cookie,服务器就知道来的人是“谁”。然后我们再根据不同的Cookie的id,在服务器上保存一段时间的私密资料,如“账号密码”等等。
1.设置session
def set_session(request):
# 写session,干了三件事(每个浏览器会生成一个随机字符串)
# 随机字符串是跟浏览器相关的,数据是跟账号相关的
request.session['name']='ABC'
request.session['age']='18'
request.session['sex']='男'
'''
非django的步骤(django已经封装了下面的操作)
1 生成随机字符串:dfasfasdfa
2 去数据库存储
随机字符串 值 (字典形式) 超时时间
dfasfasdfa {'name':'ABC','age':18,'sex':'男'} 超时时间
3 写入set_cookie(set_cookie('sessionid','dfasfasdfa')) 发送给客户端
'''
return HttpResponse('ok')
2.获取session
def get_session(request):
# 取session 取name这个字段对应的值
name=request.session['name']
# 正常流程 非django的步骤(django已经封装了下面的操作)
# 去cookie中取出随机字符串
# 去session那个表去查询,取出session_data的数据,解密成字典,然后取name的值返回
# print(name)
3.删除session
# 删除当前会话的所有Session数据(只删数据库)
request.session.delete()
# 删除当前的会话数据并删除会话的Cookie(数据库和cookie都删)。
request.session.flush()
这用于确保前面的会话数据不可以再次被用户的浏览器访问
例如,django.contrib.auth.logout() 函数中就会调用它。
四、session的相关方法
# 所有 键、值、键值对
request.session.keys()
request.session.values()
request.session.items()
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems()
# 会话session的key
request.session.session_key
# 将所有Session失效日期小于当前日期的数据删除
request.session.clear_expired()
# 检查会话session的key在数据库中是否存在
request.session.exists("session_key")
# 设置会话Session和Cookie的超时时间
request.session.set_expiry(value)
* 如果value是个整数,session会在些秒数后失效。
* 如果value是个datatime或timedelta,session就会在这个时间后失效。
* 如果value是0,用户关闭浏览器session就会失效。
* 如果value是None,session会依赖全局session失效策略。
序列化会话
Django默认使用JSON序列化会话数据。你可以在SESSION_SERIALIZER
设置中自定义序列化格式,甚至写入警告说明。但是强烈建议你还是使用JSON,尤其是以cookie的方式进行会话时。
django会话的更多相关文章
- 第二十二章 Django会话与表单验证
第二十二章 Django会话与表单验证 第一课 模板回顾 1.基本操作 def func(req): return render(req,'index.html',{'val':[1,2,3...]} ...
- django——会话追踪技术
1.引言 1.1什么是会话追踪技术 会话是指一个终端用户(服务器)与交互系统(客户端)进行通讯的过程. 1.2 什么是会话跟踪 对同一个用户对服务器的连续的请求和接受响应的监视.(将用户与同一用户发出 ...
- django会话session
因为因特网HTTP协议的特性,每一次来自于用户浏览器的请求(request)都是无状态的.独立的.通俗地说,就是无法保存用户状态,后台服务器根本就不知道当前请求和以前及以后请求是否来自同一用户.对于静 ...
- django会话跟踪技术
目录 django中的会话跟踪技术 什么是会话跟踪技术 HTTP无状态协议 Cookie概述 什么是cookie cookie源码 cookie超长时间 cookie超长时间 cookie生效路径 删 ...
- Django会话,用户和注册之用户认证
通过session,我们可以在多次浏览器请求中保持数据, 接下来的部分就是用session来处理用户登录了. 当然,不能仅凭用户的一面之词,我们就相信,所以我们需要认证. 当然了,Django 也提供 ...
- Django会话,用户和注册之session
鉴于cookie的不安全,django自带的session框架会帮我们搞定这些问题 你可以用session 框架来存取每个访问者任意数据, 这些数据在服务器端存储,并对cookie的收发进行了抽象. ...
- Django会话,用户和注册之cookie
HTTP状态和TCP不一样,HTTP是无状态的,也就是这一次请求和下一次请求之间没有任何状态保持,我们无法根据请求例如IP来识别是否在同一人的连续性请求.就像我们在访问网站的时候,输入了用户名和密码, ...
- django 学习-16 Django会话Cookie
1.django.admin.py startproject cs3 cd cs3 django.admin.py startapp blog 2. vim urls.py url ...
- Django会话cookie&session
任务描述:实现登录和退出 1.项目结构 2.源代码 urls.py from django.conf.urls import url from django.contrib import admin ...
随机推荐
- asp.net获取当前请求的url
asp.net获取当前请求的url 设当前页完整地址是:http://www.dgshop.com/Home/Manager?id=2¶=ASFDG [1]获取 完整url 代码如下: ...
- MySQL数据库8.0.15 安装教程
第一步:安装MySQL服务 这里下载完成的是一个压缩文件,直接将里面的‘mysql-8.0.15-winx64'文件夹解压到你想要安装的路径即可,我是直接安装在C盘的. 解压完后的文件路径如下图: 在 ...
- think
https://github.com/crossoverJie/Java-Interview Java-Interview https://github.com/aalansehaiyang/tech ...
- spring cloud配置注册中心显示服务的ip地址和端口
1.在springcloud中服务的 Instance ID 默认值是: ${spring.cloud.client.hostname}:${spring.application.name}:${sp ...
- Power BI For Competition
It's traditional report design, I'm insufficient for designing that if had a designer to help me wil ...
- python 多线程 ping
python 多线程 ping 多线程操作可按如下例子实现 #!/usr/bin/env python #encoding: utf8 import subprocess from threading ...
- luogu4166 最大土地面积 (旋转卡壳)
首先这样的点一定在凸包上 然后旋转卡壳就可以 具体来说,枚举对角线的一个端点,另一个端点在凸包上转,剩下两个点就是一个叉积最大一个最小,而这两个点也是跟着转的 所以是$O(N^2)$ #include ...
- [CQOI2014]危桥
题目描述 Alice和Bob居住在一个由N座岛屿组成的国家,岛屿被编号为0到N-1.某些岛屿之间有桥相连,桥上的道路是双 向的,但一次只能供一人通行.其中一些桥由于年久失修成为危桥,最多只能通行两次. ...
- hdu 4542 "小明系列故事——未知剩余系" (反素数+DFS剪枝)
传送门 参考资料: [1]:https://blog.csdn.net/acdreamers/article/details/25049767 题意: 输入两个数 type , k: ①type = ...
- JS学习笔记Day24
一.闭包和函数 (一)什么是闭包函数 概念:简单说就是函数中嵌套函数,嵌套在这里面的函数叫做闭包函数,外面的函数叫做闭包环境 作用:通过闭包函数,可以访问到闭包函数所在局部作用域中的变量及参数 特点: ...