zoukankan      html  css  js  c++  java
  • 第六章、Cookies和Session

    第六章、Cookies和Session

    一、来源

    由于 http 协议是无状态的,无法记录用户状态,为了能够记录用户状态,就出现了 cookie 和 session (cookie 安全性不足才出现的 session)来识别并保存用户状态

    二、cookie工作原理

    cookie就是保存在客户端浏览器上的键值对

    工作原理:

    • 当你登录成功之后,浏览器上会保存一些信息,下次再访问的时候,就会带着这些信息去访问服务端,服务端通过这些信息来识别出你的身份

    cookie 虽然是写在客户端浏览器上的,但其其实是服务端设置的

    浏览器可以选择不服从命令 禁止写 cookie (设置,禁用 cookie)

    不让写 cookie 的话,所有要保存登录状态的页面都不能登录成功

    查看cookie的方式

    F12-->application->Cookie

    三、session的工作原理

    session 是保存在服务端的键值对

    Cookie 虽然在一定程度上解决了 “保持状态” 的需求,但是由于 Cookie 本身最大支持 4096 字节,以及 Cookie 本身保存在客户端,可能被拦截或窃取,因此就需要有一种新的东西,它能支持更多的字节,并且他保存在服务器,有较高的安全性,然后就出现了 Session 。

    工作原理:

    • 服务端返回给浏览器一个随机的字符串,浏览器以键值对的形式保存(sessionid:随机字符串)
    • 浏览器在访问服务端的时候,就会将这个随机字符串携带上,后端获取随机字符串与后端的记录作对比(随机字符串1:数据1)

    四、如何操作cookie

    django 操作 cookie 要利用 HttpResponse 对象

    (返回给客户端浏览器的都必须是 HttpResponse 对象)

    目前HttpResponse()和render()对象都是返回HttpRespose对象

    服务端常见的cookie操作

    #设置cookie利用的就是HttpResponse对象
        obj1.set_cookie('k1','v1')
            
    #获取cookie
        request.COOKIES.get('k1')
            
    #删除cookie
        obj1.delete_cookie("k1")
            
    #设置超时时间
        max_age=None, 超时时间
    

    五、案例

    需求:做个登录验证(登陆成功才能访问几个页面)

    思考

    • 既然几个网页都需要做登录验证那么我们直接用装饰器

    • *装饰器参数:request, *args, **kwargs (request 如果用位置参数接取不是很方便,直接当做第一个参数好取一些)

    • 跳转到login 登录通过后如何回到上一次未访问的地址(拼接在login/?next=上一次未访问的地址)

    • 登录装饰器

      from functools import wraps
      def login_auth(func):
          @wraps(func)
          def inner(request,*args,**kwargs):
              if request.COOKIES.get('name'):
                  res = func(request,*args,**kwargs)
                  return res
              else:
                  target_url = request.path_info
                  return redirect('/login/?next=%s'%target_url)
          return inner
      

      科普

      • Python装饰器(decorator)在实现的时候,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变),为了不影响,Python的functools包中提供了一个叫wraps的decorator来消除这样的副作用。写一个decorator的时候,最好在实现之前加上functools的wrap,它能保留原有函数的名称和docstring

      • print(request.path)和print(request.get_full_path())的区别

        request.path只拿url不拿get请求携带的额外的参数,本案例只拿了127.0.0.1:8000/login/的url

        request.get_full_path()啥都拿

      装饰器怎么用?放函数上面就好了

      @login_auth
      def home(request):
          # 校验用户是否登录
          # if request.COOKIES.get('name'):
          #     return HttpResponse('我是主页 只有登录了才能看')
          # return redirect('/login/')
          # 上面三行代码是不引入装饰器的原始方法
          return HttpResponse('我是主页 只有登录了才能看')
      

    六、如何操作session

    当成一个 字典 来操作就行了

    设置session

    request.session['key'] = value  # 仅仅只会在内存产生一个缓存
    1.django内部自动生成了随机的字符串
    2.在django_session表中存入数据
            session_key          session_data         date
            随机字符串1              数据1            ...
            随机字符串2              数据2            ...
            随机字符串3              数据3            ...
    3.将产生的随机字符串发送给浏览器 让浏览器保存到cookie中
    sessionid:随机字符串
    

    获取session

    request.session.get('key')
    1.浏览器发送cookie到django后端之后 django会自动获取到cookie值
    2.拿着随机字符串去django_session表中比对 是否有对应的数据
    3.如果比对上了 就讲随机字符串所对应的数据 取出赋值给request.session
    如果对不上 那么request.session就是个空
    说明: django session表是针对浏览器的 不同的浏览器来 才会有不同的记录
    

    删除session

    request.session.delete()  # 只删除服务端的session
    request.session.flush()  # 浏览器和服务端全部删除
    

    session也可以设置超时时间

    request.session.set_expiry(value多种配置)
    数字
    0 
    不写
    时间格式
  • 相关阅读:
    创建一个简单的图片服务器
    spring-boot系列:初试spring-boot
    java的动态代理机制
    jedis连接池详解(Redis)
    使用logback.xml配置来实现日志文件输出
    redis在mac上的安装
    理解RESTful架构
    分布式应用框架Akka快速入门
    [Java基础]Java通配符
    Mac vim iterm2配色方案
  • 原文地址:https://www.cnblogs.com/demiao/p/11767904.html
Copyright © 2011-2022 走看看