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 ...
随机推荐
- 常用损失函数 LossFunction
文章结构 损失函数在神经网络中的位置 常用的损失函数(结构:解释,公式,缺点,适用于,pytorch 函数) MAE/L1 Loss MSE/L2 Loss Huber Loss 对信息量.熵的解释 ...
- Caddy web服务器
caddy 中文文档:https://caddy2.dengxiaolong.com/docs/ 常用命令 命令 描述 caddy run 启动Caddy服务器 caddy reload 重载Cadd ...
- Git工作流介绍
前言 工作流其实不是一个初级主题,背后的本质问题其实是有效的项目流程管理和高效的开发协同约定,不仅是Git或SVN等SCM工具的使用. 集中式工作流 如果你的开发团队成员已经很熟悉Subversion ...
- nginx同时使用(http)80和(https)443端口详解
server { listen 443 ssl; #监听https 443时需加ssl server_name ; #你的域名 ssl on; ssl_certificate ; #证书路径 ssl_ ...
- Windows 延缓写入失败及解决方法
场景重现 某天系统弹出警告:某盘符延缓写入失败 解决办法 [Win + R]或手搓打开cmd.exe,键入chkdsk: 然后等待校检完成. 完成之后到警告提示对应的盘符下进行查错并修复 然后等待检查 ...
- Code First 初始化数据时发生异常
问题重现 用Entity Framework的Code First默认生成的数据库文件被我直接删除了, 然后不管怎么重新编译等等, 运行后总是会报错如下: 解决方案同下 Cannot attach t ...
- Anonymous打靶学习笔记(5)
参考视频https://www.bilibili.com/video/BV1XufaYAEKc/?spm_id_from=333.1387.search.video_card.click 常见的100 ...
- nodejs集群
nodejs集群 单个 Node.js 实例运行在单个线程中. 为了充分利用多核系统,有时需要启用一组 Node.js 进程去处理负载任务. 集群中的Master 现在让我们详细了解Master的职责 ...
- Greenplum常用命令、函数
Greenplum常用查询命令 #查看test_bd事务(即数据库)下的所有表名包含 user 的 表信息 SELECT UPPER(A.SCHEMANAME) AS SCHEMANAME, UPPE ...
- Text Bg ContentSizeFitter的另类控制
using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; [RequireComponent(typeof(Co ...