django 里的session 和cookie

1,001 阅读4分钟

这几天重新系统学习Django 学到了 session 和 cookie , 第一次学的时候就没有很明白这两个概念,今天学的时候感觉学明白了,于是就打算记下来。

首先先讲一下cookie, 可以这么理解,cookie 的存在导致了session的存在,可以没有session,但是不能没有cookie,可见cookie的重要。

cookie按照我自己的话说,就是浏览器给服务器看的一张id,一张身份证,这张ID卡上记载着客户端的信息,比如说用户名啥之类的,在客户端发送请求给到服务器的时候,同时将这张ID卡拿给服务器看,服务器看了就知道你是谁了,就可以进行一些后续的操作。当然,如果你是第一次访问这个服务器,你当然不会有cookie这个ID卡,此时当你发送请求,服务器发现你的head里面没有cookie,就知道你是第一次来,就会给你发一张ID卡,也就是帮你配置一个cookie,然后和你请求的数据一起返回回去,给到你的客户端,也就是浏览器,当你的浏览器打开页面的时候,同时也将cookie存到了你浏览器里面。当然,如果你的电脑里有多个浏览器,那么这些浏览器里的cookie并不是相通的。

也许有人会说了,服务器看到你的ID卡怎么就能确定这一定没毛病呢?也许是你自己伪造出来的,对的,所以session在这个时候就起作用了。当你第一次访问服务器的时候,服务器会给你的ID卡上加上sessionid,同时在服务器的内存里存储一些信息,而用来标记的就是sessionid。

如果有去过健身房的经历,就知道去的时候,你会把健身卡拿给前台,前台刷一下卡,然后就可以进去健身了。这就跟cookie 和 session 差不多,你去访问服务器,cookie里面带着sessionid, 服务器拿到sessionid,然后进数据库找一下你的信息,然后再返回相应的页面回去,其实非常好理解。

下面来写一下Django里有关session 和cookie的具体代码:

1.设置cookie

可以通过HttpResponse对象中的set_cookie方法来设置cookie。有效期的时间单位是秒,因为要把cookie通过将cookie设置在应答头里,于是对象就是HttpResponse。

HttpResponse.set_cookie(cookie名, value=cookie值, max_age=cookie有效期)
def cookie(request):
    response = HttpResponse('ok')
    response.set_cookie('message1', 'python1')  # 临时cookie
    response.set_cookie('message2', 'python2', max_age=3600)  # 有效期一小时
    return response

2 读取Cookie

可以通过HttpResponse对象的COOKIES属性来读取本次请求携带的cookie值。request.COOKIES为字典类型。cookie 和session 都是通过字典来保存数据的。由于cookie是存储在请求头里,所以可以在request里面拿到cookie的数据。

def cookie(request):
    cookie1 = request.COOKIES.get('message1')
    print(cookie1)
    return HttpResponse('OK')

3 删除Cookie

可以通过HttpResponse对象中的delete_cookie方法来删除。有时候用户通过某些操作修改或删除了某些信息,就可以通过delete_cookie方法删除。

response.delete_cookie('message2')

cookie的操作差不多就这样了,接下来的是session的操作:

1 存储方式

session有很多中储存方式,可以存在数据库,也可以存在内存里面,所以当然可以用mysql或者redis来存数据。在settings.py文件中,可以设置session数据的存储方式,可以保存在数据库、本地缓存等。

1.1 数据库

存储在数据库中,如下设置可以写,也可以不写,这是默认存储方式

SESSION_ENGINE='django.contrib.sessions.backends.db'

如果存储在数据库中,需要在项INSTALLED_APPS中安装Session应用。加一行'django.contrib.sessions'就ok

而数据库里的session包括了三个重要数据:键,值,过期时间。

1.2 本地缓存

存在内存里面,读取速度快倒是快,但是数据一旦丢失就凉凉,在setting.py里这么写:

SESSION_ENGINE='django.contrib.sessions.backends.cache'

1.3 混合存储

优先从内存中取,找不到就从数据库里取

2 Session操作

当然还可以设置数据库为mysql 和 redis 这里网上都有资料。接下来写一点重要的session操作:

和cookie很像,写session也是通过键值对写的,取的时候也是一样

request.session['键']=值
request.session.get('键',默认值)

清除所有session,在存储中删除值部分。

request.session.clear()

清除session数据,在存储中删除session的整条数据。

request.session.flush()

删除session中的指定键及值,在存储中只删除某个键及对应的值。

del request.session['键']

设置session的有效期

request.session.set_expiry(value)

差不多cookie和session的基本的知识就总结的差不多了,其实理解过程就是取健身房办卡的一个过程,而代码部分也挺好理解,无非就是在请求头和相应头里面加数据或者删数据,而且都是以键值对的形式储存,所以还是不难的。

日拱一卒,功不唐捐。