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")

最新文章

  1. Selenium2学习-040-JavaScript弹出框(alert、confirm、prompt)操作演示实例
  2. word 文档 一次性设置多张图片大小
  3. 解决在VS2015下用C++开发的DLL在WIN7上无法加载运行
  4. SPL--Serializable
  5. aop测试jdk代理机制
  6. JqueryEasyUI浅谈---视频教程公布
  7. (转) An overview of gradient descent optimization algorithms
  8. 【转】使用VisualSVN Server搭建SVN服务器
  9. jQuery的延迟对象
  10. uva 10401 Injured Queen Problem(dp)
  11. Uploadify自定义提示信息
  12. java类到底是如何加载并初始化的?
  13. .net 爬虫框架技术选型
  14. Validate Model State automatically in ASP.NET Core 2.0
  15. 2道acm简单题(2010):1.猜数字游戏;2.字符串提取数字并求和;
  16. vue.js下载及安装配置
  17. python列表的交、并、差集
  18. 利用CocoaHttpServer搭建手机本地服务器
  19. No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer and no properties discovered to create BeanSerializer
  20. Android Systom

热门文章

  1. ESP8266产品ID
  2. Ubuntu16.04中php如何切换版本
  3. SkylineGlobe7.0.1版本 通过鼠标左右平移模型对象
  4. git完全cli指南之详细思维导图整理分享
  5. springboot项目利用Swagger2生成在线接口文档
  6. Player启动时提示 "System.InvalidOperationException:无法加载计数器名称数据
  7. webpack+vue 组件间传参(单一事件中心管理组件通信--$root),如果有路由的话会失效
  8. 面试题(一GC)
  9. DAY17、常用模块
  10. 解决mysql中文乱码问题 在url后面添加?characterEncoding=utf8