目录
会话控制
网络中网页之间进行内容传输使用的协议是http协议
http协议是一种无状态,所有请求必有回应的超文本传输协议,HTTP 为了提高效率,一经完成请求和响应的过程后,就会自动关闭连接。所谓无状态意指:基于http协议提供服务的服务端,无法清晰前后多此请求过程中,是不是同一个客户端发送的还是多个客户端发送的。
web开发的应用往往只是一个网页或者是一个功能,那么怎么这么多页面不同的请求,识别用户之前的状态和行为?
为了能在多次请求的过程中,识别客户端是否是同一个客户端,所以就出现了会话跟踪技术,就需要使用会话控制技术,也叫会话保持或者会话跟踪技术
会话控制术,主要作用是为了识别和记录用户在web应用中的身份行为和操作历史。
一、会话Session
所谓一次会话其实就是客户端和服务端之间进行通信的一次完整过程
在web开发领域:
客户端和服务端之间产生的会话开始于:在用户第一次输入url访问网站的时候
客户端和服务端之间的会话结束于:关闭浏览器(如果服务器宕机了也属于会话结束,只要是两者断开联系都属于会话的结束)
注意:如果移动端下面,则必须是关闭当前app应用才算结束会话,如果只是后台运行,会话并没有结束
所以,会话跟踪技术就是在一次完整的会话中,能让服务端识别客户端在整个过程中的身份行为和操作历史的一项技术
1.1 实现会话的几种方式
实现会话控制的几种技术类型:
- url地址栏记录用户身份的参数(少见,很古老的技术)
- cookie:在浏览器中由浏览器自动读写保存用户信息的一种小文件,能够存储的数据有限,10M左右(已过时,谷歌在2021年正在逐步关闭cookie技术)
- session:在服务端中保存用户信息的一种小文件,能够存储的数据有限,根据服务端配置而定
- token令牌:就是一段可以记录和识别用户身份的字符串,通过客户端语言(js/Android/IOS)保存在客户端中的一项技术
二、Cookie
cookie是保存在浏览器中的小文本,由浏览器自动管理和收发,所以cookie中不要保存用户的敏感信息,例如:密码之类的,而且cookie在浏览器中,用户是可以关闭cookie功能的,如果关闭了cookie功能,一般服务器能做的只有两件事了:1.提示用户开启cookie功能,2.不要使用cookie了
2.1 cookie实现会话控制的原理
2.2 设置cookie
在子应用user下创建视图并建立路由映射关系,并在主应用下的urls.py下进行引入
其中,视图函数如下:
from django.http.response import HttpResponse
def setcookie(request):
""" 设置cookie """
response = HttpResponse('ok')
response.set_cookie(key='name', value='Abo', max_age=30)
return response
- response.set_cookie:就是设置cookie
- 参数说明:
- key:cookie的名称
- value:cookie的值(其实只是众多值的一部分,)
- max_age:有效时间,单位秒
- expires:过期的时间戳(与max_age都是设置cookie的生命周期)
- 参数说明:
2.3 获取cookie
视图函数:
def getcookie(request):
""" 获取cookie """
"""
因为cookie是由浏览器自动保管的,所以一旦客户端浏览器存在当前域名的cookie,
在每次客户端发起请求的时候,浏览器都会自动的把cookie附加在请求头里面
"""
print(request.COOKIES)
return HttpResponse('ok')
2.4 删除cookie
视图函数
def delcookie(request):
""" 删除cookie """
"""
因为cookie是保存在客户端中的数据,因此在服务端并没有直接删除cookie的方法,
所以一般的删除cookie操作都是通过设置当前变量的值为任意值,同时设置当前变量的有效期为0
这样浏览器接收到响应信息之后,就会自动删除了
"""
response = HttpResponse('ok')
response.set_cookie('sid', '', max_age=0)
return response
如果需要批量删除:
def delcookie(request):
""" 删除cookie """
"""
因为cookie是保存在客户端中的数据,因此在服务端并没有直接删除cookie的方法,
所以一般的删除cookie操作都是通过设置当前变量的值为任意值,同时设置当前变量的有效期为0
这样浏览器接收到响应信息之后,就会自动删除了
"""
response = HttpResponse('ok')
for cookie in request.COOKIES:
response.set_cookie(cookie, max_age=0)
return response
三、Session
这里的Session就是会话控制技术的一种,session主要保存在服务器的文件中
在没有进行设置的情况下,session以文件编码格式保存,一般保存的目录是系统的缓存文件存储目录
例如:windows的C:/windows/temp
目录,Linux/Mac OS 的/tmp目录
因为session是在服务端中保存数据,相比较而言比cookie更加安全,但是因为用户的数据都是保存到服务器中,当用户基数大了,则服务器的存储压力就来了,所以一般不会考虑把session数据保存在文件,而是采取保存到第三方存储session的方案,例如保存到redis中或者mysql之类的数据库里面
3.1 session原理
3.2 Django中session说明
Django2.0以后的版本默认采用了数据库保存session,这主要是为了适应当前市场上大部分公司开发项目时采用分布式服务器集群
而调整的,但是我们目前还没有介绍django数据库操作,所以我们可以先根据官网说明,把session保存到文件中
settings.py配置:
"""
Session 配置项:
django.contrib.sessions.backends.file:保存到文件
django.contrib.sessions.backends.db:保存到数据库
django.contrib.sessions.backends.cache:保存到缓存
"""
SESSION_ENGINE = 'django.contrib.sessions.backends.file'
"""
session存储目录(如果不设置,则默认保存到系统的缓存目录)
3.0之后:
SESSION_FILE_PATH = BASE_DIR / "session_path" # 路径拼接
"""
# # 目录需要提前手动创建
SESSION_FILE_PATH = BASE_DIR / "session_path"
3.3 设置Session
def set_session(request):
""" 设置session """
print(request.session)
request.session['uname'] = 'root'
request.session['uid'] = 10001
return HttpResponse('ok')
3.4 获取Session
def get_session(request):
""" 获取session """
print(request.session.items()) # 获取全部
print(request.session.get('uid')) # 获取单个
return HttpResponse('ok')
3.5 删除Session
def del_session(request):
""" 删除session """
try:
request.session.pop('uid') # 删除单个,如果没有会报错
except Exception as e:
print(e)
request.session.clear() # 删除全部session
return HttpResponse('ok')
四、Base64编码工具函数
Base64是网络上最常见的用于传输8bit字节码的编码方式之一
Base64就是一种基于64个可打印字符来表示二进制数据的方法。
64个可打印编码字符就是小写字母a-z、大写字母A-Z、数字0-9、符号’+’、’/’(再加上作为垫字的’=’,实际上是65个字符)
base64的使用一般无非就是编码和解码:
- 编码是指从二进制到编码字符的过程,可用在HTTP环境下传递较长的标识信息,例如:图片内容
- 解码就是从编码字符到二进制的过程
在Python中,base64是内置常用的标准库,我们可以直接通过import导入base64模块直接使用
五、拓展
除了base64这个python内置库之外还有其他一些内置库或是第三方库用于转存数据,如:pickle、struct、ujson、orjson等,虽然python内置库json库有对json数据处理相关操作,但是效率并不高,ujson效率会高很多,而orjson效率会更高除此之外还有像itdangerous对字符串进行编码、解码等相关操作,这里不再进行扩展,可自行了解。