Django:Cookie与Session

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

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

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

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

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

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

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

 

具体实例:

一、仅使用cookie

name:名称不能唯一确定一个Cookie。路径可能不同。
value:不能存中文和空格。
path:默认值是写Cookie的那个程序的访问路径
maxAge:cookie的缓存时间。默认是负数(默认存在浏览器的内存中),即浏览器关闭则销毁cookie,单位是秒;设置为0表示删除该cookie ;正数表示缓存(持久化到磁盘上)的时间。
cookie常用API

 

 

1.创建一个django项目

2.setting中的中间键关闭csrf

3.url进行路由分发:

from django.contrib import admin
from django.urls import path

from app01 import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('login/', views.login),#登录界面的url
    path('index/', views.index),#登录成功后的主页url
]

4.编写对应的视图函数

  #登录页面

def login(req):

    #1.第一次访问login的url,get请求,此时生成一个COOKIES
    print("COOKIES:", req.COOKIES)

    if req.method=="POST":#3.login.html中的表单以POST方式提交后,进入此逻辑判断语句
        user=req.POST.get("user")#获取表单传递过来的用户名
        pwd=req.POST.get("pwd")  #获取表单传递过来的密码

        if user=="yuan" and pwd=="123":#4.进行用户名与密码验证

            ret=redirect("/index/")#5.验证成功,获取一个跳转页面(未返回给客户端(浏览器))
            ret.set_cookie("bilibili","cheers")#6.给页面跳转添加一个cookie,用于下次访问时免登录
            return ret  #7.返回一个跳转的页面(返回给客户端(浏览器))

    return render(req,"login.html")#2.返回一个用于登录的login.html(一个form表单)
login

  #登录成功后的主页

def index(req):

    if req.COOKIES.get("bilibili",None)=="cheers":#1.判断是否已登录
        name="yuan"
        return render(req,"index.html",locals())#2-2,非初次访问,已登录,仅需index页面访问主页信息
    return redirect("/login/")#2-1.初次访问,未登录,跳转到login页面进行登录操作
index

 

5.编写对应的模版html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/login/" method="post">
    <p>用户名:<input type="text" name="user"></p>
    <p>密码:<input type="password" name="pwd"></p>
    <p><input type="submit" value="提交"></p>

</form>
</body>
</html>
login.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>Hello {{ name }}</h1>
</body>
</html>
index.html

 

二、cookie+session

 

仅views.py文件不同

from django.shortcuts import render,redirect

# Create your views here.
import datetime
def login(request):
    # 1.第一次访问login的url,get请求,此时生成一个COOKIES
    print(request.COOKIES)
    print(request.session)
    if request.method == "POST":#3.login.html中的表单以POST方式提交后,进入此逻辑判断语句
        user = request.POST.get("user")#获取表单传递过来的用户名
        pwd = request.POST.get("pwd")#获取表单传递过来的密码

        if user == 'yuan' and pwd == '123':#4.进行用户名与密码验证

            # #COOKIE
            # ret = redirect('/index/')

            # #COOKIE中设置有效时间
            # #max_age与expires是设置有效时间,不同浏览器可能找不到max_age或者expires,所以一般设置两个相同的有效时间
            # ret.set_cookie('bilibili',"cheer",max_age=10,expires=datetime.datetime.utcnow()+datetime.timedelta(days=3))
            # return ret



            #COOKIE+SESSION
            request.session['is_login']= True #5.验证成功,登录状态设为True
            request.session['user'] = user    #6.以字典的形式设置session键值对,{"用户名":"用户的个人信息"},将用户的个人信息存储在服务器上,"用户名"相当于一把访问服务器的钥匙

            # #SESSION中设置有效时间
            # request.session.set_expiry(value=10)  #10秒后失效


            return redirect('/index/')        #7.返回一个跳转的页面(返回给客户端(浏览器))

    return render(request,"login.html")       #2.返回一个用于登录的login.html(一个form表单)



def index(request):

    # #COOKIE
    # if request.COOKIES.get('bilibili',None) == 'cheer':
    #     name='yuan'
    #     return render(request,'index.html',locals())



    #COOKIE+SESSION
    if request.session.get('is_login',None):    #1.判断是否已登录
        name=request.session.get('user')        #获取session的键"user"(钥匙)
        return render(request,'index.html',locals())    #2-2,非初次访问,已登录,

    else:
        return redirect('/login')   #2-1.初次访问,未登录,跳转到login页面进行登录操作

 

 

 

下面我们再来最后的总结一下cookie和session的知识点

Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;
Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式

一、操作Cookie

  获取cookie:request.COOKIES[key]

  设置cookie:response.set_cookie(key,value)

由于cookie保存在客户端的电脑上,所以,jquery也可以操作cookie。

<script src='http://830909.blog.51cto.com/static/js/jquery.cookie.js'></script>
$.cookie("list_pager_num", 30,{ path: '/' });

二、操作Session(session默认在服务器端保存15天)

  获取session:request.session[key]

  设置session:reqeust.session[key] = value

  删除session:del request.session[key]    

(这个删除其实就是把数据库的session_data更新为一个其他的值了,并没有立即删除)

 

request.session.set_expiry(value)
* 如果value是个整数,session会在些秒数后失效。
* 如果value是个datatime或timedelta,session就会在这个时间后失效。
* 如果value是0,用户关闭浏览器session就会失效。
* 如果value是None,session会依赖全局session失效策略。

 

 

典型区别

1、cookie采用的是在客户端保持状态的方案,因此数据存放在客户的浏览器上,而session采用的是服务端保持状态的方案,因此数据放在服务器上。

2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗。 考虑到安全应当使用session。

3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能。考虑到减轻服务器性能方面,应当使用COOKIE。

 

 

 

 

参考:https://blog.csdn.net/qq_28296925/article/details/80921585?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

posted @ 2020-09-26 23:39  麟灬  阅读(77)  评论(0)    收藏  举报