Django Cookie和Session

一、cookie和session的介绍

  

  cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生。

cookie的工作原理是:由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上cookie,这样服务器就能通过cookie的内容来判断这个是“谁”了。

cookie虽然在一定程度上解决了“保持状态”的需求,但是由于cookie本身最大支持4096字节,以及cookie本身保存在客户端,可能被拦截或窃取,因此就需要有一种新的东西,它能支持更多的字节,并且他保存在服务器,有较高的安全性。这就是session。

  问题来了,基于http协议的无状态特征,服务器根本就不知道访问者是“谁”。那么上述的cookie就起到桥接的作用。

我们可以给每个客户端的cookie分配一个唯一的id,这样用户在访问时,通过cookie,服务器就知道来的人是“谁”。然后我们再根据不同的cookie的id,在服务器上保存一段时间的私密资料,如“账号密码”等等。

总结而言:cookie弥补了http无状态的不足,让服务器知道来的人是“谁”;但是cookie以文本的形式保存在本地,自身安全性较差;所以我们就通过cookie识别不同的用户,对应的在session里保存私密的信息以及超过4096字节的文本。

另外,上述所说的cookie和session其实是共通性的东西,不限于语言和框架

二、登录应用原理

  前几节的介绍中我们已经有能力制作一个登陆页面,在验证了用户名和密码的正确性后跳转到后台的页面。但是测试后也发现,如果绕过登陆页面。直接输入后台的url地址也可以直接访问的。这个显然是不合理的。其实我们缺失的就是cookie和session配合的验证。有了这个验证过程,我们就可以实现和其他网站一样必须登录才能进入后台页面了。

      先说一下这种认证的机制。每当我们使用一款浏览器访问一个登陆页面的时候,一旦我们通过了认证。服务器端就会发送一组随机唯一的字符串(假设是123abc)到浏览器端,这个被存储在浏览端的东西就叫cookie。而服务器端也会自己存储一下用户当前的状态,比如login=true,username=hahaha之类的用户信息。但是这种存储是以字典形式存储的,字典的唯一key就是刚才发给用户的唯一的cookie值。那么如果在服务器端查看session信息的话,理论上就会看到如下样子的字典

{'123abc':{'login':true,'username:hahaha'}}

  因为每个cookie都是唯一的,所以我们在电脑上换个浏览器再登陆同一个网站也需要再次验证。那么为什么说我们只是理论上看到这样子的字典呢?因为处于安全性的考虑,其实对于上面那个大字典不光key值123abc是被加密的,value值{'login':true,'username:hahaha'}在服务器端也是一样被加密的。所以我们服务器上就算打开session信息看到的也是类似与以下样子的东西

{'123abc':dasdasdasd1231231da1231231}

三、cookie的简单使用

获取cookie:如果有值就获取,如果没有则返回None

val = request.COOKIES.get('user','')

设置cookie:

expires:过期时间,是一个日期时间型

path:有效路径,设置的cookie只作用于这个路径以及子路径

max_age:过期时间,单位是秒

        response = redirect('/index/')
            # response.set_cookie('is_login',True,max_age=15) #max_age是以秒计算的,不支持ie
            date = datetime.date(year=2020,month=12,day=31)
            response.set_cookie('user',user_ret.name,expires=date,path='/index/') 

删除cookie:

response.delete_cookie('user','user_ret.name)

基于登录验证的3次请求过程:

一共有三次请求
  注意:form表单的action走的路径还是/login/
     第一次请求:url:http://127.0.0.1:8080/login GET请求
       第二次请求:url:http://127.0.0.1:8080/login POST请求 user pwd
       第三次请求:url:http://127.0.0.1:8080/index GET请求 携带着cookie的了
       所以在index页面中就会取到cookie,因为这是的index里面已经有cookie了

注意:点击提交时,完成了2次请求,一次是form表单的POST请求,一次是验证成功后return response跳转到index的GET请求

登录验证代码:

views.py

from django.shortcuts import render,HttpResponse,redirect
from app01.models import *
import datetime
import  time
# Create your views here.
def login(request):
    if request.method=='POST':
        print('我是post请求')
        user = request.POST.get('user','')
        pwd = request.POST.get('passwd')
        user_ret = Userinfo.objects.filter(name=user,pwd=pwd).first()
        print('用户名:',user)
        print(user_ret)
        if user_ret :
            response = redirect('/index/')
            # response.set_cookie('is_login',True,max_age=15) #max_age是以秒计算的,不支持ie
            response.set_cookie('is_login',True) #max_age是以秒计算的,不支持ie
            date = datetime.date(year=2020,month=12,day=31)
            response.set_cookie('user',user_ret.name,expires=date,path='/index/') #
            # response.set_cookie()

            return response
        else:
            return HttpResponse('登录失败')
    print("我是get请求")
    return  render(request,'login.html')

def index(request):
    print('请求类型:',request.method)
    is_login =request.COOKIES.get('is_login')
    if is_login:
        # 登录成功后,取出cookies中设置的user
        username = request.COOKIES.get('user')
        '''显示上次登录时间:
        1,取出上次登录时间last_time,如果没有,则为空
        2,设置这次登录时间login_date
        3,设置这次登录的last_time
        
        '''
        last = request.COOKIES.get('last_time','')  #1
        login_date = time.strftime('%Y-%m-%d %X',time.localtime())#2
        response=render(request,'index.html',{'username':username,'logindate':last})
        response.set_cookie('last_time',login_date)#3
        return response
    else:
        return redirect('/login/')

    # return render(request,'index.html')
View Code

login.html

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>Cookies设置</title>
</head>
<body>
<form action="" method="post">
    {% csrf_token %}
    用户名 <input type="text" name="user">
    密码 <input type="password" name="passwd">
    <input type="submit">

</form>
</body>
</html>
View Code

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Index</title>
</head>
<body>
<h1>Hi,{{ username }}</h1>
<h2>上次登录时间:{{ logindate }}</h2>
</body>
</html>
View Code

猜你喜欢

转载自www.cnblogs.com/lovepy3/p/10978787.html