Session与Cookie是什么

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

这个小纸条就是Cookie。那么Cookie怎么工作的呢?

  1. 浏览器第一次访问服务器时,服务器此时肯定不知道它的身份,所以创建一个独特的身份标识数据,格式 为key=value,放入到Set-Cookie字段里,随着响应报文发给浏览器。

  2. 浏览器看到有Set-Cookie字段以后就知道这是服务器给的身份标识,于是就保存起来,下次请求时会自动 将此key=value值放入到Cookie字段中发给服务器。

  3. 服务器收到请求报文后,发现Cookie字段中有值,就能根据此值识别用户的身份然后提供个性化的服务。

有了Cookie实现了有状态这一需求,那为什么又来一个Session呢?

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

Django使用Session

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

在视图中操作Session:

自己实现用户登录认证

案例:自己实现登录认证机制

  1. 登录

  2. 视图验证登录

from devops2.user_login import login_decorator

@login_decorator #自定义认证登录装饰器
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')
password = request.POST.get('password')
"""
###############内置认证机制################
#验证用户
user = auth.authenticate(username=username,password=password) #验证通过返回用户名,否则返回None

if user:
auth.login(request,user) #将request与用户对象(包含session)传给login()函数
request.session['username'] = username #往session临时存储数据
return redirect('/') #跳转到首页
else:
msg = '用户名或密码错误'
return render(request,'login.html',{'msg':msg})
"""
#自定义用户认证

user_obj = User.objects.get(user=username)
if user_obj.user:
if user_obj.password == password:
request.session['is_login'] = True
request.session['username'] = username
return redirect('/')
else:
msg = '用户名或密码错误!'
return render(request, 'login.html', {'msg': msg})
else:
msg = '用户名或密码错误!'
return render(request, 'login.html', {'msg': msg})
  1. 退出登录
def logout(request):
request.session.flush()
return redirect('/login') #跳转到登录页
  1. 装饰器
from django.shortcuts import redirect


#登录装饰器
def login_decorator(func):
def inner(request):
is_login = request.session.get('is_login',False)
if is_login:
return func(request) #执行原函数
else:
return redirect('/login')
return inner