文章目录


参考视频:https://ke.qq.com/course/320021

一、Session与Cookie是什么

就像你去电商平台购物一样,而网站采用是HTTP协议,它本身就是一个无状态的,是记不住你上次来做了什么事,那怎么记住每个用户呢。
于是,服务器给每个用户贴了一个小纸条,上面记录了服务器给我们返回的一些信息。然后服务器看到这张小纸条就知道我们是谁了。

​1.1.Cookie是怎么工作的?​

  1. 浏览器第一次访问服务器时,服务器此时肯定不知道它的身份,所以创建一个独特的身份标识数据,格式为key=value,放入到Set-Cookie字段里,随着响应报文发给浏览器。
  2. 浏览器看到有Set-Cookie字段以后就知道这是服务器给的身份标识,于是就保存起来,下次请求时会自动将此key=value值放入到Cookie字段中发给服务器。
  3. 服务器收到请求报文后,发现Cookie字段中有值,就能根据此值识别用户的身份然后提供个性化的服务。

​1.2.为什么需要Session?​

如果将用户账户的一些信息都存入Cookie中,一旦信息被拦截,那么所有的账户信息都可
能被泄露,这是不安全的。所以就出现了Session,在一次会话中将重要信息保存在Session中,浏览器只记录SessionId;
一个SessionId对应一次会话请求。
Django Session管理_session

二、Django使用Session

默认是开启的
Django Session管理_django_02

​2.1.在settings.py配置文件中设置客户端Cookie:​

Django Session管理_django_03
例如:

SESSION_COOKIE_AGE = 300   # cookie过期时间,单位为s
SESSION_EXPIRE_AT_BROWSER_CLOSE = True # 关闭浏览器,cookie过期

​2.2.在视图中操作Session:​

Django Session管理_python_04

三、自己实现用户登录认证

views.py:

from django.shortcuts import render,redirect
from myldp.models import User

# 登录认证装饰器
def self_login_required(func):
def inner(request):
login_status = request.session.get('login_status', False)
if login_status:
return func(request)
else:
return redirect(login)
return inner

# 首页
@self_login_required
def index(request):
return render(request, 'index.html')

def login(request):
if request.method == "GET":
return render(request, 'login.html')
elif request.method == "POST":
# 获取前端登录的用户名和密码
username = request.POST.get('username', None)
password = request.POST.get('password', None)
# 对用户身份验证
user = User.objects.filter(user=username)
if user:
for info in user:
passwd = info.password
if passwd == password:
request.session['login_status']=True # 自定义session内容,会保存到django_session表中
request.session['login_user']=username
return redirect(index) # 重定向到函数名,这里是首页
else:
msg = "用户名或密码输入错误"
else:
msg = "用户名或密码输入错误"
return render(request, 'login.html', {"msg": msg})
# 登出
def logout(request):
auth.logout(request) # 清除当前用户的session信息
return redirect(login)

登录成功后会在django_session表中多出一条记录
Django Session管理_session_05
session_data可以通过base64解密

echo MjMwNjExZGExMTJmNzlhNzEzMTAyNGNhYjViMGNiZWE2NmVhMzRiZDp7ImxvZ2luX3N0YXR1cyI6dHJ1ZSwidXNlcm5hbWUiOiJkZXZvcHMifQ | base64 -d

Django Session管理_服务器_06