Django基础 - 11会话Cookie/Session

发布时间 2023-04-16 21:29:28作者: Kingdomer

 

产生背景:

一次会话(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