Django-09-cookie和session

1. 简介

<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其实是共通性的东西,不限于语言和框架

2. 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: ‘/‘ });

3. session的使用

获取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失效策略。
def login(request):
    print(‘COOKIE‘,request.COOKIES)
    print(‘SESSION‘,request.session)
    if request.method == "POST":
        name = request.POST.get(‘user‘)
        pwd = request.POST.get(‘pwd‘)
        if name == ‘lsf‘ and pwd == ‘123456‘:
            # # COOKIE
            # ret = redirect(‘/index/‘)
            # ret.set_cookie(‘username‘,{‘abc‘: ‘def‘},max_age=10,expires=datetime.datetime.utcNow() + datetime.timedelta(days=3))
            # return ret

            # # SESSION
            request.session[‘is_login‘] = True
            request.session[‘user‘] = name
            return redirect(‘/index/‘)

    return render(request,‘login.html‘)


def index(request):
    # # COOKIE
    # if request.COOKIES.get(‘username‘,None):
    #     name = request.COOKIES.get(‘username‘,None)
    #     return render(request,‘index.html‘,locals())
    
    # SESSION
    if request.session.get(‘is_login‘,None):
        name = request.session.get(‘user‘,None)
        return render(request,locals())
    
    else:
        return redirect(‘/login/‘)

相关文章

功能概要:(目前已实现功能)公共展示部分:1.网站首页展示...
大体上把Python中的数据类型分为如下几类: Number(数字) ...
开发之前第一步,就是构造整个的项目结构。这就好比作一幅画...
源码编译方式安装Apache首先下载Apache源码压缩包,地址为ht...
前面说完了此项目的创建及数据模型设计的过程。如果未看过,...
python中常用的写爬虫的库有urllib2、requests,对于大多数比...