前言

HTTP协议 是短连接、且状态的,所以在客户端向服务端发起请求后,服务端在响应头 加入cokie响应给浏览器,以此记录客户端状态;

cook是来自服务端,保存在浏览器的键值对,主要应用于用户登录;

cookie如此重要!!那么如何在Django应用cookie呢?cookie又有什么缺陷呢?

一、Django应用cookie

参数介绍

1、max_age=1 :cookie生效的时间,单位是秒

2、expires:具体过期日期  

3、path='/':指定那个url可以访问到cookie;‘/’是所有; path='/'

4、 domain=None(None代表当前域名):指定那个域名以及它下面的二级域名(子域名)可以访问这个cookie

5、secure=False:https安全相关

6、httponly=False:限制只能通过http传输,JS无法在传输中获取和修改

设置cookie

1.普通

obj.set_cookie("tile","zhanggen",expires=value,path='/' )

2.加盐

普通cookie是明文传输的,可以直接在客户端直接打开,所以需要加盐,解盐之后才能查看

obj.set_signed_cookie('k','v',salt="zhangge")

获取cookie

1、普通

request.COOKIES.get(‘k’)

2、加盐

cookies=request.get_signed_cookie('k',salt='zhanggen')

 

最后给每个视图函数装饰cookie认证功能

  1. from until import mysqlhelper
  2. from django.shortcuts import HttpResponse,render,redirect
  3. import json
  4. import datetime
  5. from datetime import timedelta
  6.  
  7. def cookie_auth(func):
  8. def weaper(request,*args,**kwargs):
  9. cookies = request.get_signed_cookie('k', salt='zhanggen')
  10. if cookies == 'v':
  11. return func(request)
  12. else:
  13. return HttpResponse('OK')
  14. return weaper
  15.  
  16. now = datetime.datetime.utcnow()
  17. delta = timedelta(seconds=10)
  18. def login(request):
  19. if request.method=='GET':
  20. return render(request,'login.html')
  21. else:
  22. name = request.POST.get('N')
  23. pwd=request.POST.get('P')
  24. if name=="alex" and pwd=="":
  25. obj=redirect("/modal")
  26. # obj.set_cookie("tile","zhanggen",max_age=1,)
  27. value=now+delta
  28. obj.set_cookie("tile","zhanggen",expires=value,path='/',domain=None,secure=False,httponly=False)
  29. obj.set_signed_cookie('k','v',salt="zhanggen",)
  30. return obj
  31. else:
  32. return render(request,'login.html')
  33.  
  34. def test(request):
  35. return render(request,'layout.html')
  36.  
  37. @cookie_auth
  38. def modal(request):
  39. sql='''
  40. SELECT teacher.id as tid,teacher.`name`as tname,class.title FROM day64.teacher LEFT JOIN teacher_class ON day64.teacher.id=day64.teacher_class.tid
  41. LEFT JOIN day64.class ON day64.teacher_class.cid=day64.class.id;
  42. '''
  43. teacher_list= mysqlhelper.get_list(sql,[])
  44.  
  45. res={}
  46. for row in teacher_list:
  47. tid=row["tid"]
  48. if tid in res:
  49. res[tid]["titles"].append(row["title"])
  50. else:
  51. res[tid]={'tid':row["tid"],'tname':row["tname"],'titles':[row["title"],]}
  52.  
  53. class_list=mysqlhelper.get_list("SELECT id ,title FROM day64.class" ,[])
  54. return render(request,'modal.html',{"list":res.values(),"class_list":class_list} )
  1. 1cookies
  2. 1、什么是cookies
  3. cookies是一种数据存储技术
  4. 将一段文本保存在客户端(浏览器)的一种技术。并可以长时间的保存
  5. 2cookies的使用场合
  6. 1、保存登录信息
  7. 2、保存用户的搜索关键词
  8. 3django 中使用 cookies
  9. 1、设置cookies(保存数据到客户端)
  10. 1、不使用模板
  11. resp = HttpResponse("给客户端的一句话")
  12. resp.set_cookie(key,value,expires)
  13. return resp
  14.  
  15. key : cookie的名称
  16. value : 保存的cookie的值
  17. expires : 保存的时间,以 s 为单位
  18.  
  19. ex:
  20. resp.set_cookie('uname','zsf',60*60*24*365)
  21. 2、使用模板
  22. resp = render(request,'xxx.html',locals())
  23. resp.set_cookie(key,value,expires)
  24. return resp
  25. 3、重定向
  26. resp = HttpResponseRedirect('/login/')
  27. resp.set_cookie(key,value,expires)
  28. return resp
  29.  
  30. 2、获取cookies(从客户端获取数据)
  31. request.COOKIES

Django不同响应方式设置cokie

  1. from django.shortcuts import render,HttpResponse,redirect,HttpResponseRedirect
  2. from tools.resis_handler import connect_obj
  3.  
  4. def login(request):
  5. resp = redirect('/list_display/')
  6. resp.set_cookie('K','zhanggen')
  7. return resp
  8. def display(request):
  9. print(request.COOKIES['K'])
  10. return HttpResponse('OK')

redirect方法设置cokie

二、cookie+session

1、cookie引入session:

cookie看似解决了HTTP(短连接、无状态)的会话保持问题,但把全部用户数据保存在客户端,存在安全隐患,

于是cookie+session出现了!我们可以 把关于用户的数据保存在服务端,在客户端cookie里加一个sessionID(随机字符串),

基于以上原因:cook+session组合就此作古了单单使用cookie做会话保持的方式;

2、cookie+session的工作流程:

(1)、当用户来访问服务端时,服务端生成一个随机字符串;

(2)、当用户登录成功后 把 {sessionID :随机字符串} 组织成键值对 加到 cookie里发送给用户;

(3)、服务器以发送给客户端 cookie中的随机字符串做键,用户信息做值,保存用户信息;

3、保存在服务端session数据格式

{

随机字符串                                        用户信息

傻狍子的随机字符串:        {id:1,nam:"alex",account:1000000000 },

二狗子的随机字符串:        {id:1,nam:"eric",account:10}

注意:request.session['name']=‘alex’,request.session默认隐含了通过sessionID找到用户信息那一步;

所以现在设置的是用户信息的键(name)和用户信息的值(alex),删除也是如此!

4、最终得出结论了!!!

session的应用 要依赖于cookie:(session就是 cookie的变种)

(1)每次用户第一次访问服务端, 把用户的唯一字符串 session_id加到cookie里面,发送给客户端;

(2)服务器端保存 随机字符串(sessionID:{用户信息})服务端

(3)下次来通过 cookie中的sessionID(键)获取用户信息值(值)

session作用:

会话保持,记住用户的登录状态(WEB网站,分布式架构)

作用(和cookie的区别)

避免了敏感信息保存在客户端,防止客户端修改cookie信息!

5、Django应用session

  1. def login(request):
  2. if request.method=='GET':
  3. return render(request,'login.html')
  4. else:
  5. name=request.POST.get('user')
  6. pwd=request.POST.get('pwd')
  7. # obj=models.Girl.objects.filter(username=name,passwprd=pwd).first()
  8. obj = models.Boy.objects.filter(username=name, passwprd=pwd).first()
  9. if obj:
  10. #1、生成随机字符串(sessionID)
  11. #2、通过cookie发送给客户端
  12. #3、服务端保存{zhanggen随机字符串:{'name':'zhanggen'.'email':'zhanggen@le.com'}}
  13. request.session['name']=obj.username #在Django 中一句话搞定
  14. request.session['email'] = 'zhanggen@le.com'
  15. return redirect('/index')
  16. else:
  17. return render(request,'login.html',{'msg':"用户名/密码错误"})
  18.  
  19. def index(request):
  20. #1、获取客户端的 sessionID
  21. #2、在服务端查找是否存在 这个sessionID
  22. #3、在服务端查看对应的key sessionID键的值中是否有name(有值就是登录过了!!)
  23. v=request.session.get('name')
  24. print(v)
  25. if v:
  26. return render(request,'index.html',{'msg':v})
  27. else:return redirect('/login/')

 使用参数:

  1. def index(request):
  2. # 获取、设置、删除Session中数据
  3. request.session['k1']
  4. request.session.get('k1',None) #这样取值的不报错,没有拿None
  5. request.session['k1'] = 123
  6. request.session.setdefault('k1',123) # 存在则不设置
  7. del request.session['k1']
  8.  
  9. # 所有 键、值、键值对
  10. request.session.keys()
  11. request.session.values()
  12. request.session.items()
  13. request.session.iterkeys()
  14. request.session.itervalues()
  15. request.session.iteritems()
  16.  
  17. # 用户session的随机字符串
  18. request.session.session_key
  19.  
  20. request.session.clear_expired()
  1. #sessionID在客户端,过期后自动失效;
      session信息存储在数据库里,sessionID过期后怎么删除呢?
    无法动态删过期的session,可执行这个方法!(数据库中不仅存储了session 还有该session的过期时间,这个方法就是where数据库里时间过期的session删除掉)
  1. request.session.exists("session_key")# 检查 用户session的随机字符串 在数据库中是否
  2. # 删除当前用户的所有Session数据
    request.session.delete("session_key")
  3. request.session.set_expiry(value) 设置session过期时间
  4.  
  5. * 如果value是个整数,session会在些秒数后失效。 *
    如果value是个datatimetimedeltasession就会在这个时间后失效。 *
  6.  
  7. 如果value0,用户关闭浏览器session就会失效。 *
    如果valueNone,session会依赖全局session失效策略。

session配置文件

  1. #session配置文件
  2.  
  3. SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎
  4. SESSION_FILE_PATH = 文件路径 # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T
  5. session不仅可以保存在数据库里,
  • 数据库(默认)
  • 缓存(memchache、redis)
  • 文件
  • 缓存+数据库
  • 加密cookie
  1.  
  2. SESSION_COOKIE_NAME="zhanggen" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
  3. SESSION_COOKIE_PATH="/" # Session的cookie保存的路径
  4. SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名
  5. SESSION_COOKIE_SECURE = False # 是否Https传输cookie
  6. SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输
  7. SESSION_COOKIE_AGE = 600000 # Session的cookie失效日期(2周) 默认1209600秒
  8. SESSION_EXPIRE_AT_BROWSER_CLOSE =True # 是否关闭浏览器使得Session过期

  9. SESSION_SAVE_EVERY_REQUEST = True
    #如果你设置了session的过期时间 30分钟后,这个参数是False30分钟过后,session准时失效
    #如果设置 True,在30分钟期间有请求服务端,就不会过期!(为什么逛一晚上淘宝,也不会登出,但是不浏览器不刷新了就会自动登出)

 session保存位置配置

  1. 缓存 redis memcache
  2. SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎
  3.  
  4. 浏览器cook(相当于没有用session,又把敏感信息保存到客户端了)
  5. SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎

6、session注意事项

(1)、每个用户的保存在 服务端的sessionID保存在数据库里的 sessionID隔离不一样的,不会造成用户间的信息混淆!(淫王一问,我答错了!)

(2)、如果A用户和B用户在同一个浏览器登录,会!因为保存在浏览器的sessionID先后覆盖了!!

(3)、如果用户的cookie泄露了,别拿着你的cookie也是可以 访问服务端的,所以cookie一定要保存好。

Django中的cookie和session的更多相关文章

  1. {Django基础八之cookie和session}一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session

    Django基础八之cookie和session 本节目录 一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session 六 xxx 七 ...

  2. Django 中的 cookie 和 session

    一.cookie 由于HTTP协议是无状态的,而服务器端的业务必须是要有状态的.Cookie诞生的最初目的是为了存储web中的状态信息,以方便服务器端使用.比如判断用户是否是第一次访问网站.目前最新的 ...

  3. django中操作cookie与session

    cookie 什么是Cookie Cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务器提取有用信息. Cookie的 ...

  4. Django中的Cookie、Session、Token

    Cookie : 指望着为了辨别用户身份.进行会话跟踪而存储在用户本地的数据(通常经过加密),是由服务端生成,发送给客户端浏览器,浏览器会将Cookie以key/value保存,下一请求同一网站是就发 ...

  5. Django中的cookie与session

    cookie与session的实现原理 HTTP被设计为”无状态”,每次请求都处于相同的空间中. 在一次请求和下一次请求之间没有任何状态保持,我们无法根据请求的任何方面(IP地址,用户代理等)来识别来 ...

  6. 【转】Django中的cookie与session

    转自:https://www.cnblogs.com/chenchao1990/p/5283725.html cookie与session的实现原理 HTTP被设计为”无状态”,每次请求都处于相同的空 ...

  7. 如何使用django中的cookie和session?

    1.Cookie 介绍 Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Co ...

  8. Django中的Cookie和Session操作以及CBV

    1.Cookie 平常我们在浏览网页的时候,在需要输入密码的地方,如果已经登陆了一次,并且时间间隔比较近的话,是不需要登陆的,为什么了?这就是Cookie的作用. Cookie(或Cookies)指某 ...

  9. python Django中的cookie和session

    目录 Cookie 1.1获取Cookie 1.2设置Cookie Session 1.数据库Session 2.缓存Session 3.文件Session 4.缓存+数据库Session Cooki ...

随机推荐

  1. LeetCode题解之 Implement strStr()

    1.题目描述 2.题目分析 字符串操作,注意边界条件即可. 3.代码 int strStr(string haystack, string needle) { int n = needle.size( ...

  2. 重学C语言---03数据和C

    1.数据的必要性.数据使我们生活中不可缺少的东西,程序也是如次,离不开数据.将文字.图片和单词等输入到算计,将其展现出来或者做一系列操作等. 2.实例程序. /*rhodium.c--用金属铑衡量体重 ...

  3. python2与python3的区别(持续更新)

    1,print(打印),python2不换行可以使用逗号,python3不换行使用end='' python2版本: print 'a' 输出一个字符串 print a 输出一个变量 print 'a ...

  4. css继承属性与非继承属性

    一.无继承性的属性 1.display:规定元素应该生成的框的类型 2.文本属性: vertical-align:垂直文本对齐 text-decoration:规定添加到文本的装饰 text-shad ...

  5. MySQL基础之---mysqlimport工具和LOAD DATA命令导入文本文件

     1.mysqlimport工具的使用 看一下命令的使用方法: shell > mysqlimport -u root -p [--LOCAL] DBname File [option] --f ...

  6. October 15th 2017 Week 42nd Sunday

    Excellence is a continuous process and not an accident. 卓越是一个持续的过程而不是一个偶然事件. It is said that ten tho ...

  7. mac brew安装mysql

    mac不自带mysql,这里需要重新安装,方法依然很简单 brew install mysql unset TMPDIR mysql_install_db --verbose --user=`whoa ...

  8. MySQL安装及初步配置.md

    MySQL 安装脚本 #!/bin/bash MYSQL_BASEDIR=/usr/local/mysql MySQL_DATADIR=/data/mysql SERVER_ID=`hostname ...

  9. HDU5629:Clarke and tree(DP,Prufer)

    Description Input Output Sample Input Sample Output Solution 题意:给你$n$个点,还有每个点的度数,问你任选$i(1\leq i \leq ...

  10. CHECKEDLISTBOX用法总结

    C# CHECKEDLISTBOX用法总结   一般认为:foreach (object obj in checkedListBox1.SelectedItems)即可遍历选中的值. 其实这里遍历的只 ...