Django中的会话技术(Cookie,Session,Token)
一、Cookie
客户端技术,将数据信息存储到浏览器中,存储的结构是字典结构,即key-value.
Cookie是服务端创建,但保存于客户端,客户端每次发送请求时都会将Cookie信息发送到服务器(因为Cookie是请求头信息的一部分)
Cookie不支持中文,不能跨浏览器,不能跨域名
1、设置cookie
HttpResponse.set_cookie()
response.set_signed_cookie("Cookie名称","Cookie值",salt="盐")
属性:key
value
max-age 有效时长,单位为秒,指定为0,表示关闭浏览器失效(默认)指定为有效数值100表示100秒后自动失效,设置为None永不过期
expires 支持一个datetime或timedelta,可以指定一个具体的日期,expires=timedelta(days=10)表示十天后过期
max-age和xepires两个指定一个
# 普通设置,以明文的方式显示
def setcookie(request):
response = HttpResponse('设置COOKIE成功')
response.set_cookie('name','egon')
return response
#加盐设置,以加密的形式显示
def do_login(request): uname = request.POST.get('uname') response = HttpResponseRedirect(reverse('app:mine')) # response.set_cookie('uname', uname, max_age=60)
response.set_signed_cookie('content', uname, "Rock") return response
2、获取
HttpRequest.COOKIES.get(key)
request.get_signed_cookie("cookie名称",salt="盐")
def getcookie(request):
return HttpResponse(request.COOKIES.get('name'))
def mine(request):
# uname = request.COOKIES.get("content")
try:
uname = request.get_signed_cookie("content", salt="Rock")
if uname:
# return HttpResponse(uname)
return render(request, 'mine.html', context={"uname": uname})
except Exception as e:
print("获取失败")
return redirect(reverse('app:login'))
3、删除
response.delete_cookie(key)
def logout(request):
response = redirect(reverse("app:login"))
response.delete_cookie("content")
return response
二、Session
Session是用来表示一个用户与服务端的一次“会话”。使用客户端发送的sessionid(存在与Cookie中)与服务端的sessionid匹配,找到客户端请求所属的“会话”,经常用于登录验证。
Session一般保存在内存中,在Django中,Session默认使用数据库保存,若想变更Session的保存方式,需要添加SESSION_ENGINE配置信息,可以将session保存到redis中。
1、存储数据
HttpRequest.session[key] = value,数据进行了base64编码
2、读取数据
request.session.session_key 获取session_id
HttpRequest.session.get(key)
3、删除session
del request.session["key"]
request.session.flush() 同时清除cookie和session
request.session.clear() 清除所有session
def login(request):
if request.method == "GET":
return render(request, 'two_login.html')
elif request.method == "POST":
username = request.POST.get("username")
request.session["username"] = username
return HttpResponse("登录成功") def mine(request):
username = request.session.get("username")
print(request.session.session_key)
return render(request, 'two_mine.html', context=locals()) def logout(request):
response = redirect(reverse('myapp:mine'))
# del request.session['username']
# response.delete_cookie('sessionid')
# session cookie一起干掉
request.session.flush()
return response
4、session重要配置
①、SESSION_EXPIRE_AT_BROWSER_CLOSE = True
当浏览器关闭时,清除本地Cookie
②、 SESSION_COOKIE_AGE = 60
设置session保存的秒数
5、扩展:将session保存到redis
①安装django-redis-sessions库
pip install django-redis-sessions
②在settings.py中配置
SESSION_ENGINE = 'redis_sessions.session'
SESSION_REDIS = {
'host':'127.0.0.1',
'port':6379,
'db':0,
'password':'Redis密码',
'prefix':"key前缀",
'socket_timeout':5
}
三、Token
Token是为了弥补服务端会话技术的缺点(占用服务器资源)而产生的,Token验证的思想是“以时间换空间”.
当第一次验证成功(用户名和密码正确),服务端对用户数据进行签名生成一个token,并将该token发送到客户端,当客户端发送请求时,会携带该token到服务器端,服务端对该token进行解密验证,当验证成功,则说明用户验证通过,否则验证失败.
1、基本算法
①MD5摘要算法
用来验证数据完整性 ,单向不可逆,防爆破性高,统一输出,默认输出128位的二进制,32位的16进制使用hexdigest()
import hashlib md5 = hashlib.md5()
md5.update('xxx'.encode())
crypto_str = md5.hexdigest()
②应用
基本时间+随机数生成MD5的32位字符串
import hashlib
import random
import time
m = hashlib.md5()
m.update(str(time.time()+ random.random()).encode())
a = m.hexdigest()
2、使用方式
①使用在移动端或客户端开发中,通常以Json形式传输,需要移动端自己存储Token,需要获取Token关联数据的时候,主动传递Token
def login(request):
if request.method == "GET":
return render(request, 'two_login.html')
elif request.method == "POST":
username = request.POST.get("username")
m = hashlib.md5()
m.update(str(time.time()+ random.random()).encode())
token = m.hexdigest()
data = {
'status': 200,
'username': username,
'token': token # 设置token
}
return JsonResponse(data)
def mine(request): # 客户端访问时候需要带上token # http://127.0.0.1:8000/myapp/mine/?token=e912be747de3c51f11e9e9bea72b49bf
token = request.GET.get('token')
if token:
return JsonResponse({
'status': 'OK'
})
②在web开发中,Token和session类似,携带在cookie中。
def login(request):
if request.method == 'GET':
return render(request, 'login.html')
else:
name = request.POST.get('name')
pwd = request.POST.get('pwd')
users = User.objects.filter(name=name,pwd=pwd)
if users:
user = users.first()
token = str(time.time())
user.token = token
user.save()
response = HttpResponse('<h3 style="color:green">登录成功</h3>')
response.set_cookie('token',token) # 将token也保存于响应对象,发送给客户端
return response else:
return HttpResponse('用户名或密码错误') def mine(request):
token = request.COOKIES.get("token")
if token:
user = User.Objects.get(token=token)
return HttpResponse('登录成功')
四、三者对比
Cookie使用更简洁,服务器压力更小,数据不是很安全
Session服务器要维护Session,相对安全
Token拥有Session的所有优点,自己维护略微麻烦,支持更多的终端
Django中的会话技术(Cookie,Session,Token)的更多相关文章
- Django2.2 会话技术cookie session token的区别以及实例介绍
一.区别: 本人见解:使用自定义数据项进行加密,作为唯一身份识别,登陆时写入cookie(session基于这个).在显示相关数据 1.cookie 属于客户端会话技术(数据存储在客户端) 默认的Co ...
- java ->会话技术Cookie&Session
会话技术Cookie&Session 会话技术简介 存储客户端的状态 由一个问题引出今天的内容,例如网站的购物系统,用户将购买的商品信息存储到哪里?因为Http协议是无状态的,也就是说每个客户 ...
- Web核心之会话技术Cookie&Session
什么是会话技术? http协议是无状态协议.为了满足在多次请求之间数据进行交互,推出了会话技术. 会话概念:一次会话,指的是从客户端和服务器建立起连接开始,到客户端或服务器断开连接为止.中间可能进行多 ...
- django基础之day10,cookie session token
https://www.cnblogs.com/Dominic-Ji/p/10886902.html cookie session token
- JavaWeb学习笔记五 会话技术Cookie&Session
什么是会话技术? 例如网站的购物系统,用户将购买的商品信息存储到哪里?因为Http协议是无状态的,也就是说每个客户访问服务器端资源时,服务器并不知道该客户端是谁,所以需要会话技术识别客户端的状态.会话 ...
- JavaEE之会话技术Cookie&Session
会话技术简介 存储客户端的状态 由一个问题引出今天的内容,例如网站的购物系统,用户将购买的商品信息存储到哪 里?因为Http协议是无状态的,也就是说每个客户访问服务器端资源时,服务器并 ...
- 会话技术Cookie&Session
1.会话技术概述 从打开浏览器访问某个站点,到关闭这个浏览器的整个过程,称为一次会话.会话技术用于记录本次会话中客户端的状态与数据. 会话技术分为Cookie和Session: Cookie:数据存储 ...
- 03012_会话技术Cookie&Session
1.会话技术简介 (1)存储客户端的技术 网站的购物系统,用户将购买的商品信息存储到哪里?因为Http协议是无状态的,也就是说每个客户访问服务器端资源时,服务器并不知道该客户端是谁,所以需要会话技术识 ...
- 会话技术 Cookie+Session
会话:这种在多次HTTP连接间维护用户与同一用户发出的不同请求之间关联的情况称为维护一个会话(session) 一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开: 功能:在一次会话 ...
- Servlet 会话技术cookie和session
会话技术 Cookie技术:会话数据保存在浏览器客户端. Session技术:会话数据保存在服务器端. 一.Cooke技术 1. 特点 Cookie技术:会话数据保存在浏览器客户端. 2 .Cooki ...
随机推荐
- Jupyter Notebook的所有文件ipynb保存下来
前言 如果你想要保存整个 Jupyter Notebook 工作目录,包括所有笔记本和其他相关文件,最直接的方法是将整个文件夹压缩为一个 ZIP 或 TAR 文件. 下载单个文件 压缩文件夹下载 在 ...
- 想查看某些网站源码,结果发现网站F12被禁用,怎么解决?
当我们访问某些网站的时候,发现网站是禁用了F12和右键功能的.比如想保存网页上的一些文字或图片等, 新手不知道怎么破除. 下面分享给大家几种方法:1.打开网页后,鼠标点进浏览器地址栏,再按F12键,就 ...
- Pydantic模型继承解析:从字段继承到多态模型
title: Pydantic模型继承解析:从字段继承到多态模型 date: 2025/3/19 updated: 2025/3/19 author: cmdragon excerpt: 涵盖字段继承 ...
- CISCN&CCB半决赛_2025_PWN_WP
CISCN&CCB半决赛_2025_PWN_WP 前言: 记录一下第一次打半决赛国赛,总结来说还是自己太菜了,还有check脚本是真的很shi,正规军白给了... typo break edi ...
- 使用Win32控制台实现命名管道通信
接收端: //server //命名管道采用基于连接的可靠传输方式,只能一对一传输 #include <windows.h> #include <iostream> #defi ...
- Linux下对LVM逻辑卷分区大小调整 [针对xfs和ext4文件系统]
当我们在安装系统的时候,由于没有合理分配分区空间,在后续维护过程中,发现有些分区空间不够使用,而有的分区空间却有很多剩余空间.如果这些分区在装系统的时候使用了lvm(前提是这些分区要是lvm逻辑卷分区 ...
- 如何让tcxGrid左边显示序号
第一步: 设置cxgrid的属性, OptionsView.Indicator = True 第二步: 写OnCustomDrawIndicatorCell方法 procedure TForm1.cx ...
- iis 固定回收问题
项目背景:站点有一个计算业务场景,耗时较久. 偶发性发生:进度条过程中,发生卡死.日志没有然后记录. 查看windows 事件,问题时间 有was 自动回收 当前站点 ,如下图 后设置 ...
- 关于ASCII码的一些信息(转载自https://blog.csdn.net/na_tion/article/details/50148883)
ASCII码分基本表(128个字符,从00000000到01111111).扩展表(256个字符,从00000000到11111111)和压缩表(64个字符),我们经常用的是128个的基本表,而在一些 ...
- DAY2--IMU测量单元&emmc内存
打智能车比赛天天碰到imu这个东西,今天给他弄清楚去 1.IMU介绍 惯性测量单元(Inertial measurement unit,简称 IMU),是测量物体三轴姿态角及加速度的装置.一般IMU包 ...