学习笔记,仅供参考,有错必究



文章目录





cookies和session



cookies



cookies是保存在客户端浏览器上的存储空间,通常用来记录浏览器端的信息和当前连接的确认信息;cookies 在浏览器上是以键-值对的形式进行存储的,键和值都是以ASCII字符串的形式存储(不能是中文字符串);在Django 服务器端设置浏览器的COOKIE必须通过 HttpResponse对象来完成。



注意,cookies跟域名相关,也就说如果我们在网站A获取了cookies,那么这个cookies在另一个网站B就无效了。同时,如果我们在网站A拿到了一个cookies,在此之后,无论我们访问网站A的哪个网页,都会带着这个cookies(在该cookies过期之前)。



关于自动登录



一般情况下,在登录某网站时会用到cookies,比如,我们在登录微博时,如果点击​​记住我​​,那么我们的浏览器端就会以cookie的形式记住用户名和密码,下次登录时,我们的账户和密码就会被自动填入文本框,我们就不需要再输入一次了:

Django(part36)--cookies_客户端



HttpResponse 关于cookie的添加修改删除



  • 添加和修改cookie
HttpResponse.set_cookie(key, value='', max_age=None, expires=None)
#key:cookie的名字(最好别用中文)
#value:cookie的值(最好别用中文)
#max_age:cookie存活时间, 以秒为单位(默认为永远存活)
#expires:具体过期时间, 比如2021年1月1日前有效datatime(2021,1,1)
  • 删除cookie
HttpResponse.delete_cookie(key)
#key为Cookie的键
#删除指定的key的Cookie, 如果key不存在则什么也不发生。



Django中关于cookie的使用



  • 方法1:通过HttpResponse将cookie保存进客户端

用法:

from django.http import HttpResponse
resp = HttpResponse()
resp.set_cookie('cookies名', cookies值, 超期时间)



  • 方法2:使用render对象将cookie保存进客户端

用法:

from django.shortcuts import render
resp = render(request,'xxx.html',locals())
resp.set_cookie('cookies名', cookies值, 超期时间)



  • 方法3: 使用redirect对象将cookie保存进客户端

用法:

from django.shortcuts import redirect
resp = redirect('/')
resp.set_cookie('cookies名', cookies值, 超期时间)



获取cookie



我们可以通过request.COOKIES(请求里的Cookies对象) 绑定的字典(dict) 获取客户端的COOKIES数据:

value = request.COOKIES.get('cookies名', '没有值')
print("cookies名 = ", value)



举个例子



我们创建一个新项目mywebsite_bookstore,在项目下添加两个应用(bookstore, userinfo),创建一个模板文件templates,在mysql中创建新数据库mybookstore,再进行一系列配置,这个过程我就不演示了。

配置完成之后,我们在主urls.py中添加两个路由:

from django.urls import re_path
from django.contrib import admin
from django.conf.urls import include
from . import views

urlpatterns = [
re_path(r'^admin/', admin.site.urls),
re_path(r'^bookstore/', include('bookstore.urls')),
re_path(r'^test_cookie/', views.test_cookie),
re_path(r'^show_cookie/', views.show_cookie),
re_path(r'^userinfo/', include('userinfo.urls')),
]



在主视图文件views.py中添加两个视图函数:

def test_cookie(request):
resp = HttpResponse("OK")
return resp

def show_cookie(request):
dic = request.COOKIES
return HttpResponse(str(dic))

向http://127.0.0.1:8000/show_cookie/发起请求:

Django(part36)--cookies_cookie_02

我们看到了一个字典,这个字典就是浏览器给予服务器的cookie信息。



我们在Chrome浏览器的开发者工具中,也可以查看和操作浏览器端所有的Cookies 值。

我们打开开发者工具(DevTool),依次进入Application、Storage、Cookies:

Django(part36)--cookies_客户端_03

我们也可以在DevTool中将这个Cookie删除,删除后,我们再刷新一下http://127.0.0.1:8000/show_cookie/,发现只剩下一个空字典了:

Django(part36)--cookies_cookie_04

这时,若我想添加一个Cookie,那我们可以在views.py中操作:

def test_cookie(request):
resp = HttpResponse("OK")
resp.set_cookie('myschool', 'goatbishop')
return resp

我们向http://127.0.0.1:8000/test_cookie/发起请求:

Django(part36)--cookies_python_05

再向http://127.0.0.1:8000/show_cookie/发起请求:

Django(part36)--cookies_开发者工具_06

查看DevTool,发现多了一个Cookie:

Django(part36)--cookies_客户端_07

我再设置cookie存活时间为10秒:

def test_cookie(request):
resp = HttpResponse("OK")
resp.set_cookie('myschool', 'goatbishop', max_age=10)
return resp

我们先向http://127.0.0.1:8000/test_cookie/发起请求,再向http://127.0.0.1:8000/show_cookie/发起请求:

Django(part36)--cookies_cookie_08

等待11s,我们刷新DevTool,发现这个Cookie消失了:

Django(part36)--cookies_客户端_09



这时,我们设置cookie存活时间为7天(7$\timesDjango(part36)--cookies_cookie_10\timesDjango(part36)--cookies_客户端_11\times$60s):

def test_cookie(request):
resp = HttpResponse("OK")
resp.set_cookie('myschool', 'goatbishop', max_age=7*24*60*60)
return resp

首先,向http://127.0.0.1:8000/test_cookie/发起请求,得到新cookie后,我们再利用响应对象的delete_cookie方法将该cookie删除:

def test_cookie(request):
resp = HttpResponse("OK")
#删除和Cookies
resp.delete_cookie('myschool')
return resp