产生背景:
一次会话(Session)或连接从浏览器的一个Request开始, 到服务器返回Response结束。
多个页面需要传递部分数据: 将想要传递的数据存储到一个指定的位置,其他的页面去该位置获取数据。
Django的Session数据默认存储在django_session表中。 但Session依赖于Cookie技术。
客户端禁用了Cookie, 则Session也会失效。
一、 Cookie
1.1 概述
Cookie是客户端技术,将数据信息存储在浏览器中。存储结构是字典(key=value)。
HttpResponse.set_cookie()
- max-age: 有效时长,单位为秒。 Django 1.11 默认的Cookie最长时间是2周。
- 指定为0,表示关闭浏览器失效(默认); 指定为100,100秒后自动失效; 未指定, 表示永久有效
- expires: 指定时间截点,使用datetime.datetime; 如3天有效datetime.now()+timedelta(days=3)
HttpRequest.COOKIES.get('username')
HttpResponse.delete_cookie('username')
cookie不支持中文
不能跨浏览器,不能跨域名: 跨域请求的同源:协议相同、域相同、端口相同; CORS跨域请求方案
1.2 配置Cookie
1.2.1 新增Cookie
1 2 3 4 | from datetime import datetime, timedelta token = uuid.uuid4(). hex resp3 = JsonResponse(json_data) resp3.set_cookie( 'token' , token, expires = datetime.now() + timedelta(minutes = 2 )) |
1.2.2 删除Cookie
1 2 3 4 5 6 7 8 9 | def del_cookie(request): resp = HttpResponse( '删除Cookie: token 成功!' ) # 删除单个cookie resp.delete_cookie( 'token' ) # 删除所有cookie for k in request.COOKIES: resp.delete_cookie(k) return resp |
删除报错: 在请求完成前session被删除
二、 Session
2.1 概要介绍
session的启动: 在settings.py配置
- INSTALLED_APPS: django.contrib.sessions
- MIDDLEWARE中添加session中间件: django.contrib.sessions.middleware.SessionMiddleware
存储数据: key-value类型; 数据使用base64编码; HttpRequest.session[key] = value
读取数据: request.session.session_key; HttpRequest.session.get(key)
删除数据: del request.session[key]; request.session.flush();
request.session.clear() 清除所有的session
2.2 验证码 - 登录 - 查询 - 退出流程验证Session数据
2.2.1 配置路由
1 2 3 4 | path( 'code/' , views.do_new_code), path( 'login/' , views.login), path( 'logout/' , views.logout), path( 'list/' , views.index_list), |
2.2.2 生成验证码
1 2 3 4 5 6 | def do_new_code(request): code_txt = 'Xab3' phone = request.GET.get( 'phone' ) request.session[ 'code' ] = code_txt request.session[ 'phone' ] = phone return HttpResponse( '已向' + phone + '发送了验证码' ) |
访问 http://127.0.0.1:8000/user/code/?phone=179, 将phone和code数据保存到session中
在 django_session表中也有一条记录
2.2.3 登录
从请求中获取手机号和验证码;与session中的进行比对,相同则登录成功
访问 http://127.0.0.1:8000/user/login/?phone=13800009999&code=Xab3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | def login(request): phone = request.GET.get( 'phone' ) code = request.GET.get( 'code' ) print ( "phone:" , phone, request.session.get( 'phone' )) print ( "code:" , code, request.session.get( 'code' )) if any ((phone is None , code is None )): # None==None return HttpResponse( '登录失败,请确认phone和code不为空!' ) if all (( phone = = request.session.get( 'phone' ), code = = request.session.get( 'code' ) )): resp = HttpResponse( '登录成功' ) token = uuid.uuid4(). hex resp.set_cookie( 'token' , token) return resp return HttpResponse( '登录失败,phone和code不匹配!' ) |
2.2.4 查看数据
1 2 3 4 | def index_list(request): if request.COOKIES.get( 'token' ): return HttpResponse( '已登录, 正在跳转到主页' ) return HttpResponse( '请先登录' ) |
2.2.5 退出登录
1 2 3 4 5 6 | def logout(request):<br> # 删除所有的session中的信息和cookie信息 request.session.clear() request.session.flush() # 删除SESSION_ID resp = HttpResponse( '注销成功' ) resp.delete_cookie( 'token' ) return resp |
三、 token
3.1 UUID
1 2 3 4 5 6 7 8 9 10 11 12 | from uuid import uuid4 import hashlib token = str (uuid4()) print (token) m5 = hashlib.md5() m5.update(token.encode()) token = m5.hexdigest() # 生成md5加密狗的32位字符串 print (token) de32fd88 - b97f - 41ac - a22d - e862a5cb30f7 b3a13b4fce8b2dac7c3e6cab3a6eb3bc |
用户口令加密
1 2 3 4 5 6 7 8 9 | sha_256 = hashlib.sha256() sha_256.update( '123' .encode()) print (sha_256.hexdigest()) sha_256.update(( '%*&^' + '123' + '$!@' ).encode()) print (sha_256.hexdigest()) a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3 862d568169403a2e118484ed6d44b9b1f24f4d732be033081149149df6d86b14 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!