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 ...
随机推荐
- vue 保留两位小数
前言 有时候我们需要对各种数值进行保留位数,以便于更好的展示. Html部分 template中这样使用,需要处理的字段名,再加上过滤器方法 <div class="text prim ...
- Cython二进制逆向系列(三)运算符
Cython二进制逆向系列(三)运算符 在开始前,先给出本文用到的py源代码 def test1(x, y): # 数学运算符 a = x + y b = x - y c = x * y d = x ...
- Audio DSP 链接脚本文件解析
上篇文章(智能手表音乐播放功耗的优化)讲了怎么优化音乐场景下的功耗,其中第二点是优化memory的布局.那么在哪里优化memory的布局呢?就是在本文要讲的链接脚本(ld)文件里.作为audio DS ...
- 【Docker】常用服务镜像安装
Docker常用安装 总体步骤 搜索镜像:docker search xxx 拉取镜像:docker pull xxx 查看镜像:docker images 启动镜像:docker run xxx 停 ...
- 超简单电脑本地部署deepseek,另附”一键使用脚本“撰写与联网使用方法
在电脑上部署deepseek,总共分三步 1.打开ollama官网点击Download按钮 2.在ollama官网搜索deepseek-r1模型,选择对应规模,并复制ollama命令,比如这里,我的o ...
- Devops工程师需要具备的10项技能
Facebook.Amazon和Microsoft等公司正在大量使用DevOps技术来确保软件的一致交付,DevOps的的工作机会和所需要的技能集也是越来越多. 在这里,我们将讨论Devops工程师需 ...
- 基于大模型的 RAG 核心开发——详细介绍 DeepSeek R1 本地化部署流程
前言 自从 DeepSeek 发布后,对 AI 行业产生了巨大的影响,以 OpenAI.Google 为首的国际科技集团为之震惊,它的出现标志着全球AI竞争进入新阶段.从以往单纯的技术比拼转向效率.生 ...
- redis那些数据类型?分别在那些场景使用
(1)string 这是最基本的类型了,没啥可说的,就是普通的set和get,做简单的kv缓存 例子:常规计数:微博数,粉丝数等 (2)hash 这个是类似map的一种结构,这个一般就是可以将结构化的 ...
- 🎀杜伽Durgod K610W蓝牙连接问题解决
简介 杜伽Durgod K610W键盘支持三模连接,在配对成功蓝牙后切换连接通道后,再次连接蓝牙通道时无法正常自动连接已配对的蓝牙,需取消配对再重新配对后才能正常连接.这种问题可以通过升级键盘固件解决 ...
- TGCTF2025 部分题目WP
TGCTF 2025 Web AAA偷渡阴平 ?tgctf2025=eval(end(current(get_defined_vars())));&b=system('cat /flag'); ...