一:cookie
cookie是一段存在本地浏览器上的文本信息,不适合存储敏感的密码等信息,不安全。
cookie的特点:
1. 键值对的形式
2.Cookie基于域名安全,不同域名的Cookie是不能互相访问的,如访问www.taobao.com时向浏览器中写了Cookie信息,使用同一浏览器访问baidu.com时,无法访问到itcast.cn写的Cookie信息。
3.当浏览器请求某网站时,会将浏览器存储的跟网站相关的所有Cookie信息提交给网站服务器。
二:设置cookie
def get_json_data(request): response = HttpResponse("ok")
#name是cookie的键,value的值是name的值,max_age=300是cookie的有效期,单位为秒。 response.set_cookie("name",value="zhangsanfeng",max_age=300) # 设置cookie通过HttpResponse的实例对象进行设置 json_str = request.body json_str = json_str.decode("utf-8") data = json.loads(json_str) d = data["test"] print(d) return response

三:获取cookie
def get_json_data(request): json_str = request.body json_str = json_str.decode("utf-8") data = json.loads(json_str) d = data["test"] print(d) cookie = request.COOKIES.get("name") # 获取cookie的方式 return HttpResponse("cookie:{}".format(cookie))
postman

四:删除cookie
def get_json_data(request): response = HttpResponse("删除cookie") response.delete_cookie("name") return response postman
结果:严格意义上不是完全删除cookie,只是删除了cookie中name的值。
五:cookie的原理
因为Http的请求时无状态的,无法判断每次是谁请求的,因此需要一个东西用来判断是谁请求了我,那么这个东西就是cookie,浏览器每次请求会带上cookie,服务器通过cookie,就知道是张三请求了我,还是李四请求了我。
cookie的大小上限为4kb,一个服务器最多在客户端上保存20个cookie,一个浏览器最多保存300个cookie。
但是有一个问题,上面我们给服务器postman中设置了cookie,为什么cookie是明文显示,安全性太差。怎么保证我们传输的是加密的。
def get_json_data(request): response = HttpResponse("cookie加密") response.set_signed_cookie("name","zhangsanfeng",salt="key",max_age=3600) return response postman
结果:value的值被签名了,只是被加了签名的cookie,并不是被加密后的值,能看出来zhangsanfenxxxxx 后面跟了一串,应该是签名的东西。
重要:expires是cookie在浏览器中的存活时间。
二:session
session主要用于会话控制,Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被删除后,服务器将终止该会话。
session的功能就是将服务器需要保存的数据存储在服务端。例如账号登录记录的功能,可以以session的方式将登录状态保存在服务器端,这样当用户访问其他程序时,需要用到登录的地方,都可以从该用户的session中取出该用户的数据,为用户服务。
session可以存储方式:
1. 数据库
setting.py文件中:
Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中

session存贮redis数据库中 # 必须保证django中安装了django-redis,没有的话 pip install django-redis
1. 建立一个CACHES字典,指明数据库的信息
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
2. 声明引擎
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
3. 缓存别名的建立,采取默认值
SESSION_CACHE_ALIAS = "default"
实例:访问主页设置session,然后访问其他页面,都要经过session验证,来保持会话
from django.http import HttpResponse from django.http import JsonResponse def index(request): request.session["user_id"] = 1 # 给session中设置键值对 return HttpResponse("欢迎访问") def goat_show(request): user_id = request.session.get("user_id",None) # 获取session中存储的值,默认是None if user_id: return JsonResponse({"1":"美多多","2":"喜多多","3":"懒多多"}) else: return JsonResponse({"error":"请登录后访问"})
第一步:访问 127.0.0.1:8000/user/index
原因是:SESSION_CACHE_ALIAS = "default" 被我改成 "django_redis"导致,修改成default就可解决问题,具体原因,后面再研究。
第二步:访问 127.0.0.1:8000/user/goat_show
在goat中打印user_id 结果为 1
在数据库中存储的样式为 ":1:django.contrib.sessions.cacheufbtwh9nrbjtuvh6tq1v6mg4pwv0onls"
这种形式的存储:按理说不是应该对值 1进行加密么,怎么1暴露在外面了?
request.session.clear() 清除所有的session,只是将session中所有键值对的值部分删除了。
request.session.flush() 清除session数据,在存储中删除session的整条数据。键值对都删除了
del request.session['键'] 删除session中的指定键及值,在存储中只删除某个键及对应的值。
request.session.set_expiry(value) 设置session的有效期,不填,默认是两周的时间,默认是秒。
2. 本机内存
3. 本机内存 + 数据库