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 内置装饰器修复技术

    

原文地址:https://www.cnblogs.com/kingon/p/9436816.html