zoukankan      html  css  js  c++  java
  • django Cookie 和 Session 装饰器修复技术

     
    1    回话跟踪技术
     
      可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应。
           客户向某一服务器发出第一个请求开始,会话就开始了,直到客户关闭了浏览器会话结束。 
      在一个会话的多个请求中共享数据,这就是会话跟踪技术。
     
           HTTP协议是无状态协议,也就是说每个请求都是独立的!无法记录前一次请求的状态。但HTTP协议中可以使用Cookie来完成会话跟踪。
      

      注意注意注意:

        cookie,session是用来记录请求状态的,即记录是谁发出了请求希望访问服务器,也就是说cookie是根据浏览器来记录的。

        不同的浏览器就是不同的客户端,拥有不同的cookie。

        同一个浏览器,发出的请求的状态是一样的。

        比如,同一个浏览器开了两个单独的窗口,他们共用cookie,cookie存在浏览器缓存Cache中;若再开一个单独窗口,

        第三个窗口,发出的请求一样会携带cookie(同一浏览器共用的)。

        (第三个窗口若有form表单,并有{% csrf_token %}隐式csrftoken,则会覆盖缓存中的csrf_token)

     
    2     Cookie
           Cookie翻译成中文是小甜点,小饼干的意思。在HTTP中它表示服务器送给客户端浏览器的小甜点。
      其实Cookie是key-value结构,类似于一个python中的字典。随着服务器端的响应发送给客户端浏览器。
      然后客户端浏览器会把Cookie保存起来,当下一次再访问服务器时把Cookie再发送给服务器。
       Cookie是由服务器创建,然后通过响应发送给客户端的一个键值对。
            
            Cookie是什么?  
                       保存在浏览器端的键值对
            Cookie能做什么?
                       1  做登录
                       2  记录用户的浏览习惯
                       3  简单的访问限制
       Django中如何使用Cookie?

        1. 设置Cookie
          rep = redirect('/home/')
          rep.set_cookie(key, value, max_age=60*60*24*7)   --> 设置明文Cookie,有效期是7天
          rep.set_signed_cookie(key, value, salt="", max_age=10)    --> 设置加盐的Cookie,有效期是10秒
        2. 获取Cookie
          request.COOKIES   --> 获取请求中的Cookie数据,数据格式是大字典
          request.COOKIES[key]    不推荐这种写法
          request.COOKIES.get(key, "默认值")    推荐使用这种方法取值

          request.get_signed_cookie(key, default="默认值", salt="")   --> 获取加盐的Cookie

          request.GET --> 获取URL里面的参数
          request.POST --> 获取POST请求的参数
          request.FILES --> 上传文件的数据


        3. 删除Cookie(用于注销)
          rep = redirect('/home/')
          rep.delete_cookie("key")

    3 Session
      Session是什么?
        保存在服务器端的键值对,依赖于Cookie

      为什么要有Session?
        Cookie将数据保存在客户端(浏览器)上,数据不安全。
        Cookie存储的数据有限制

      Django中Session操作
        1. 设置Session
          1. request.session[key] = value
          2. request.session.setdefault(key, value)    --> 有就啥都不干,没有就赋值
        2. 获取Session
          1. request.session[key]
          2. request.session.get(key)   推荐
        3. 删除Session
          1. request.session.delete()
          2. request.session.flush()    --> 删除Cookie和Session
        4. 清空已经过期的session数据
          request.session.clear_expired()
        5. 设置Session过期时间
          request.session.set_expiry(过期时间)

      Django中Session的配置项
        1. 配置写在settings.py中
        2. 几个常用的配置项
          1. 全局设置Session的过期时间
            SESSION_COOKIE_AGE = 1209600   --> 默认两周
          2. 设置每次请求来都刷新过期时间
            SESSION_SAVE_EVERY_REQUEST = True

      补充: CBV 装饰器版 登录验证

         1. CBV加登陆验证的装饰器
           1.原装饰器丝毫不做改动,inner函数与 func函数的参数不改动,仍为(request,*args,**kwargs)

               

                

               使用Django提供的装饰器工具:

                   from django.utils.decorators import method_decorator

                    三种方式:

                      1.

                        

                      2.

                        

                      3.

                        

           2. 改动原装饰器,(不推荐)

             

             

         2. 补充csrf相关装饰器
             from   django.views.decorators.csrf    import   csrf_exempt,  csrf_protect
              1. csrf_exempt 对某个视图取消csrf_token的验证
              2. csrf_protect 对某个视图加上csrf_token的验证

    补充:  python 内置装饰器修复技术

        

  • 相关阅读:
    Java实现 LeetCode 50 Pow(x,n)
    Java实现 LeetCode 50 Pow(x,n)
    Java实现 LeetCode 49 字母异位词分组
    Java实现 LeetCode 49 字母异位词分组
    Java实现 LeetCode 49 字母异位词分组
    Java实现 LeetCode 48 旋转图像
    Java实现 LeetCode 48 旋转图像
    Java实现 LeetCode 48 旋转图像
    Java实现 LeetCode 47 全排列 II(二)
    Java实现 LeetCode 47 全排列 II(二)
  • 原文地址:https://www.cnblogs.com/kingon/p/9436816.html
Copyright © 2011-2022 走看看