Django之Cookie和Session
http://www.cnblogs.com/liwenzhou/p/8343243.html
一、Cookie
Cookie是什么?
就是保存在客户端浏览器上的键值对。
Cookie为什么存在?
因为HTTP请求是没有状态的,每一次请求都是独立的。
服务端控制着响应,在响应里可以让浏览器在本地保存键值对,下一次登录时可以自动携带这个值。
Cookie的应用:
1、登陆、七天免登陆。
2、记录用户的浏览习惯。
3、简单的投票限制。
Cookie是服务端设置的,浏览器可以不让服务端设置Cookie(禁用),但是就无法登陆。
Cookie默认在浏览器关闭时清楚。
(1)Cookie设置流程(以登陆为例):
1、在登陆数据提交时red = redrict(...) red.set_cookie("key","value")
2、在主页验证是否有cookie: request.COOKIES.get("...")
(2)装饰器
由于在每个页面都会用到Cookie,所以可以把验证Cookie的语句封装成装饰器来使用:
(3)验证cookie后返回之前的页面 path_info
(4)cookie的保存时间max_age
(5)删除cookie
def cookie_decoration(func): def inner(request): ": return func(request) else: present_url = request.path_info #获取当前url地址 return redirect("/login"+"/?pre="+present_url) return inner def login(request): if request.method == "POST": ": if request.GET.get("pre"): #获取上一页url地址 red = redirect(request.GET.get("pre")) else: red = redirect("/home") red.set_cookie(",max_age=30) #max_age是cookie值保存的时间,以秒为单位 return red else: return HttpResponse("error") return render(request,"login.html",locals()) @cookie_decoration def home(request): return render(request,"home.html",locals()) def logout(request): red = redirect("/login") red.delete_cookie("is_login") return red
二、session
为什么有session?
cookie有一些弊端,其存储的数据是有限制的,而且数据存储在客户端,容易被窃取,所以出现session,session没有数据大小限制,且数据存储在服务端,安全性强。
session依赖于cookie,他把随机字符串作为一个大字典的键,把数据都存储在这个大字典中,字典存储在服务端,而把这个随机字符串作为cookie的值传给客户端,所以客户端只拿到这个随机值,通过这个值去服务端取数据。
注意:session需要创建数据库信息,才能把键值对存储在数据库中,不然无法使用,记得makemigrations
def cookie_decoration(func): def inner(request): if request.session.get("is_login") == "true": return func(request) else: present_url = request.path_info #获取当前url地址 return redirect("/app02/login"+"/?pre="+present_url) return inner def login(request): if request.method == "POST": ": request.session['is_login'] = "true" if request.GET.get("pre"): #获取上一页url地址 return redirect(request.GET.get("pre")) else: return redirect("/app02/home") else: return HttpResponse("error") return render(request,"login.html",locals()) @cookie_decoration def home(request): return render(request,"home.html",locals()) def logout(request): request.session.flush() return redirect("/app02/login")
最新文章
- Selenium2学习-040-JavaScript弹出框(alert、confirm、prompt)操作演示实例
- word 文档 一次性设置多张图片大小
- 解决在VS2015下用C++开发的DLL在WIN7上无法加载运行
- SPL--Serializable
- aop测试jdk代理机制
- JqueryEasyUI浅谈---视频教程公布
- (转) An overview of gradient descent optimization algorithms
- 【转】使用VisualSVN Server搭建SVN服务器
- jQuery的延迟对象
- uva 10401 Injured Queen Problem(dp)
- Uploadify自定义提示信息
- java类到底是如何加载并初始化的?
- .net 爬虫框架技术选型
- Validate Model State automatically in ASP.NET Core 2.0
- 2道acm简单题(2010):1.猜数字游戏;2.字符串提取数字并求和;
- vue.js下载及安装配置
- python列表的交、并、差集
- 利用CocoaHttpServer搭建手机本地服务器
- No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer and no properties discovered to create BeanSerializer
- Android Systom
热门文章
- ESP8266产品ID
- Ubuntu16.04中php如何切换版本
- SkylineGlobe7.0.1版本 通过鼠标左右平移模型对象
- git完全cli指南之详细思维导图整理分享
- springboot项目利用Swagger2生成在线接口文档
- Player启动时提示 ";System.InvalidOperationException:无法加载计数器名称数据
- webpack+vue 组件间传参(单一事件中心管理组件通信--$root),如果有路由的话会失效
- 面试题(一GC)
- DAY17、常用模块
- 解决mysql中文乱码问题 在url后面添加?characterEncoding=utf8