产生背景:
一次会话(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
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
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 配置路由
path('code/', views.do_new_code), path('login/', views.login), path('logout/', views.logout), path('list/', views.index_list),
2.2.2 生成验证码
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
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 查看数据
def index_list(request): if request.COOKIES.get('token'): return HttpResponse('已登录, 正在跳转到主页') return HttpResponse('请先登录')
2.2.5 退出登录
def logout(request):
# 删除所有的session中的信息和cookie信息 request.session.clear() request.session.flush() # 删除SESSION_ID resp = HttpResponse('注销成功') resp.delete_cookie('token') return resp
三、 token
3.1 UUID
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
用户口令加密
sha_256 = hashlib.sha256() sha_256.update('123'.encode()) print(sha_256.hexdigest()) sha_256.update(('%*&^'+'123'+'$!@').encode()) print(sha_256.hexdigest()) a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3 862d568169403a2e118484ed6d44b9b1f24f4d732be033081149149df6d86b14