一、概述
cookies:一般是在用户登录成功时,将一些用户信息随着响应response,一同返回给浏览器。之后浏览器会将根据IP地址,开辟一个存储空间,将用户数据存储到浏览器的存储空间中。cookies的数据是存储在浏览器中的,所以这些数据中不能含有用户敏感性的数据。
session:首先session是依赖于cookies的,会将系统生成session_id 随着响应response,存储到浏览器的存储空间中,存储在浏览器的session_id就是一个随机字符串,就像一把钥匙。真正的用户数据是存储在后端系统中的,django默认是存储在数据库表,通过cookies中的session_id这把钥匙,从数据库表中获取到对应的用户数据。
二、cookies和session的使用
cookies使用:
from django.contrib.auth.hashers import make_password, check_password
from django.http import JsonResponse
class LoginView(View):
def post(self,request):
user = request.POST.get('username')
password = request.POST.get('password')
user_obj = models.Usermodel.objects.filter(user=user).first()
if user_obj:
is_true = check_password(password,user_obj.password)
if is_true:
response = JsonResponse({'code':200,'msg':'登录成功'})
#设置cookies
response.set_cookie('name',user)
response.set_cookie('hobby',['惨','跳','rap'])
#设置session
request.session['user']=user
return response
else:
return JsonResponse({'code':404,'msg':'密码错误'})
else:
return JsonResponse({'code':404,'msg':'用户不存在'})
def home(request):
#去cookies,在request中取,浏览器中存储的用户数据,django会取出存到request中
name = request.COOKIES.get('name')
hobby = request.COOKIES.get('hobby)
return HttpResponse('ok')
session的使用:
from django.contrib.auth.hashers import make_password, check_password
from django.http import JsonResponse
class LoginView(View):
def post(self,request):
user = request.POST.get('username')
password = request.POST.get('password')
user_obj = models.Usermodel.objects.filter(user=user).first()
if user_obj:
is_true = check_password(password,user_obj.password)
if is_true:
response = JsonResponse({'code':200,'msg':'登录成功'})
#设置cookies
response.set_cookie('name',user)
response.set_cookie('hobby',['惨','跳','rap'])
#设置session,在session的中间件中,会生成session_id写到response中
request.session['user']=user#会将session数据存到数据中
return response
else:
return JsonResponse({'code':404,'msg':'密码错误'})
else:
return JsonResponse({'code':404,'msg':'用户不存在'})
def home(request):
#取session,在request中取出来。
user = request.session.get('user')
obj = models.UserModelobjects,filter(user=user).first()
if obj:
name = obj.name
age = obj.age
name = request.COOKIES.get('name')
hobby = request.COOKIES.get('hobby)
return HttpResponse('ok')
三、session中间件的源码解析
session是存储在后端中,但需要session_id这把钥匙去把对应的数据取出来。
class SessionMiddleware(MiddlewareMixin):
def process_request(self, request):
#请求到路由控制前,执行该中间件
#从request中将cookies中的session_id取出来,
#通过session_id 这把钥匙,获取对应的session数据
session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME)
request.session = self.SessionStore(session_key)
#将session数据存储到request.session中
#这就是为什么我们可以在视图函数中,通过request.session中获取用户信息
def process_response(self, request, response):
#视图函数响应后执行这个中间件函数
#这里就是生成session_id, 一个session_id 对应一个数据库记录
#session_id会存储到cookies中,最后存储到浏览器中
return response