【Django】cookie和session

cookie的介绍

  • 工作原理
    1. 浏览器端第一次访问服务器,提交客户端信息
    2. 服务器端创建Cookie,该Cookie中包含用户的信息,然后将该Cookie发送到浏览器端
    3. 浏览器端再次访问服务器端时会携带服务器端创建的Cookie信息
    4. 服务器端通过Cookie信息,辨别客户端状态来动态生成客户端请求的内容
  • 示意图
    在这里插入图片描述

Django中的cookie

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

  • 设置cookie

    • 普通:obj.set_cookie(“tile”,“alan”,expires=value,path=‘/’ )
      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无法在传输中获取和修改
    • 加盐:obj.set_signed_cookie(‘k’,‘v’,salt=“alan”)
  • 获取cookie

    • request.COOKIES.get(‘k’)
    • cookies=request.get_signed_cookie(‘k’,salt=‘alan’)
  • 给每个视图函数装饰cookie认证功能

    • 视图函数
      from until import mysqlhelper
      from django.shortcuts import HttpResponse,render,redirect
      import json
      import datetime
      from datetime import timedelta
      
      def cookie_auth(func):
          def weaper(request,*args,**kwargs):
              cookies = request.get_signed_cookie('k', salt='alan')
              if cookies == 'v':
                  return func(request)
              else:
                  return HttpResponse('OK')
          return weaper
      
      now = datetime.datetime.utcnow()
      delta = timedelta(seconds=10)
      def login(request):
          if request.method=='GET':
              return render(request,'login.html')
          else:
              name = request.POST.get('N')
              pwd=request.POST.get('P')
              if name=="alex" and pwd=="123":
                  obj=redirect("/modal")
                  # obj.set_cookie("tile","alan",max_age=1,)
                  value=now+delta
                  obj.set_cookie("tile","alan",expires=value,path='/',domain=None,secure=False,httponly=False)
                  obj.set_signed_cookie('k','v',salt="alan",)
                  return obj
              else:
                  return render(request,'login.html')
      
      def test(request):
          return render(request,'layout.html')
      
      
      
      
      @cookie_auth
      def modal(request):
              sql='''
                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
                LEFT JOIN day64.class ON day64.teacher_class.cid=day64.class.id;
                  '''
              teacher_list= mysqlhelper.get_list(sql,[])
      
              res={}
              for row in teacher_list:
                  tid=row["tid"]
                  if tid in res:
                      res[tid]["titles"].append(row["title"])
                  else:
                      res[tid]={'tid':row["tid"],'tname':row["tname"],'titles':[row["title"],]}
      
              class_list=mysqlhelper.get_list("SELECT id ,title FROM day64.class" ,[])
              return render(request,'modal.html',{"list":res.values(),"class_list":class_list} )
      
    • 不同相应方式设置cookie
      1、设置cookies(保存数据到客户端)
          1、不使用模板
              resp = HttpResponse("给客户端的一句话")
              resp.set_cookie(key,value,expires)
              return resp
      
      
              key : cookie的名称
              value : 保存的cookie的值
              expires : 保存的时间,以 s 为单位
      
      
              ex:
                  resp.set_cookie('uname','zsf',60*60*24*365)
          2、使用模板
              resp = render(request,'xxx.html',locals())
              resp.set_cookie(key,value,expires)
              return resp
          3、重定向
              resp = HttpResponseRedirect('/login/')
              resp.set_cookie(key,value,expires)
              return resp
      
      2、获取cookies(从客户端获取数据)
          request.COOKIES
      
    • redirect方法设置cokie
      from django.shortcuts import render,HttpResponse,redirect,HttpResponseRedirect
      from tools.resis_handler import connect_obj
      
      def login(request):
          resp = redirect('/list_display/')
          resp.set_cookie('K','alan')
          return resp
      def display(request):
          print(request.COOKIES['K'])
          return HttpResponse('OK')
      

session的介绍

  • 工作原理
    1. 浏览器端第一次发送请求到服务器端,服务器端创建一个Session,同时会创建一个特殊的Cookie(name为JSESSIONID的固定值,value为session对象的ID),然后将该Cookie发送至浏览器端
    2. 浏览器端发送第N(N>1)次请求到服务器端,浏览器端访问服务器端时就会携带该name为JSESSIONID的Cookie对象
    3. 服务器端根据name为JSESSIONID的Cookie的value(sessionId),去查询Session对象,从而区分不同用户。
      在这里插入图片描述
  • 每次用户第一次访问服务端, 把用户的唯一字符串 session_id加到cookie里面,发送给客户端;
    在这里插入图片描述
  • 服务器端保存 随机字符串(sessionID:{用户信息})服务端
    在这里插入图片描述

Django中的session

  • 视图层

    def login(request):
        if request.method=='GET':
            return render(request,'login.html')
        else:
            name=request.POST.get('user')
            pwd=request.POST.get('pwd')
            # obj=models.Girl.objects.filter(username=name,passwprd=pwd).first()
            obj = models.Boy.objects.filter(username=name, passwprd=pwd).first()
            if obj:
                #1、生成随机字符串(sessionID)
                #2、通过cookie发送给客户端
                #3、服务端保存{alan随机字符串:{'name':'alan'.'email':'alan@le.com'}}
                request.session['name']=obj.username #在Django 中一句话搞定
                request.session['email'] = 'alan@le.com'
                return redirect('/index')
            else:
                return render(request,'login.html',{'msg':"用户名/密码错误"})
    
    def index(request):
        #1、获取客户端的 sessionID
        #2、在服务端查找是否存在 这个sessionID
        #3、在服务端查看对应的key sessionID键的值中是否有name(有值就是登录过了!!)
        v=request.session.get('name')
        print(v)
        if v:
            return render(request,'index.html',{'msg':v})
        else:return redirect('/login/')
    
  • 使用参数

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

    #session配置文件
    
    SESSION_ENGINE = 'django.contrib.sessions.backends.file'  # 引擎
    SESSION_FILE_PATH = 文件路径  # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()                                                            # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T
    session不仅可以保存在数据库里,
    	数据库(默认)
    	缓存(memchache、redis)
    	文件
    	缓存+数据库
    	加密cookie
    
    SESSION_COOKIE_NAME="alan"  # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
    SESSION_COOKIE_PATH="/"  # Session的cookie保存的路径
    SESSION_COOKIE_DOMAIN = None  # Session的cookie保存的域名
    SESSION_COOKIE_SECURE = False  # 是否Https传输cookie
    SESSION_COOKIE_HTTPONLY = True  # 是否Session的cookie只支持http传输
    SESSION_COOKIE_AGE = 600000  # Session的cookie失效日期(2周) 默认1209600秒
    SESSION_EXPIRE_AT_BROWSER_CLOSE =True  # 是否关闭浏览器使得Session过期
    
    SESSION_SAVE_EVERY_REQUEST = True
    如果你设置了session的过期时间 30分钟后,这个参数是False30分钟过后,session准时失效
    如果设置 True,在30分钟期间有请求服务端,就不会过期!(为什么逛一晚上淘宝,也不会登出,但是不浏览器不刷新了就会自动登出)
    
  • session保存位置配置

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

cookie和session的区别

  1. cookie数据保存在客户端,session数据保存在服务端。
  2. cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,如果主要考虑到安全应当使用session
  3. session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,如果主要考虑到减轻服务器性能方面,应当使用COOKIE
  4. 单个cookie在客户端的限制是4K,就是说一个站点在客户端存放的COOKIE不能4K。
  5. 所以:将登陆信息等重要信息存放为SESSION;其他信息如果需要保留,可以放在COOKIE中
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Al6n Lee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值