文章目录
参考视频:https://ke.qq.com/course/320021
一、Session与Cookie是什么
就像你去电商平台购物一样,而网站采用是HTTP协议,它本身就是一个无状态的,是记不住你上次来做了什么事,那怎么记住每个用户呢。
于是,服务器给每个用户贴了一个小纸条,上面记录了服务器给我们返回的一些信息。然后服务器看到这张小纸条就知道我们是谁了。
1.1.Cookie是怎么工作的?
- 浏览器第一次访问服务器时,服务器此时肯定不知道它的身份,所以创建一个独特的身份标识数据,格式为key=value,放入到Set-Cookie字段里,随着响应报文发给浏览器。
- 浏览器看到有Set-Cookie字段以后就知道这是服务器给的身份标识,于是就保存起来,下次请求时会自动将此key=value值放入到Cookie字段中发给服务器。
- 服务器收到请求报文后,发现Cookie字段中有值,就能根据此值识别用户的身份然后提供个性化的服务。
1.2.为什么需要Session?
如果将用户账户的一些信息都存入Cookie中,一旦信息被拦截,那么所有的账户信息都可
能被泄露,这是不安全的。所以就出现了Session,在一次会话中将重要信息保存在Session中,浏览器只记录SessionId;
一个SessionId对应一次会话请求。
二、Django使用Session
默认是开启的
2.1.在settings.py配置文件中设置客户端Cookie:
例如:
SESSION_COOKIE_AGE = 300 # cookie过期时间,单位为s
SESSION_EXPIRE_AT_BROWSER_CLOSE = True # 关闭浏览器,cookie过期
2.2.在视图中操作Session:
三、自己实现用户登录认证
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表中多出一条记录
session_data可以通过base64解密
echo MjMwNjExZGExMTJmNzlhNzEzMTAyNGNhYjViMGNiZWE2NmVhMzRiZDp7ImxvZ2luX3N0YXR1cyI6dHJ1ZSwidXNlcm5hbWUiOiJkZXZvcHMifQ | base64 -d