django_day06

django_day06

内容回顾

  1. 事务
try:
    with transaction.atomic():
        #事务
        #一系列的操作
        pass
except Exception as e:
    print(e)
  1. cookie

    1. 是什么?保存在浏览器本地的一组组键值对

    2. 为什么要使用cookie?

      1. Http协议时无状态协议 每次请求之间都是相互独立的 没有办法保存状态 使用cookie保存状态
      2. 特征:
        1. 由服务器让浏览器设置的
        2. 浏览器把键值对保存在本地 本权不保存
        3. 下次访问时会自动携带对应的cookie
    3. django中操作cookie

      #设置cookie  响应头 set=cookie
      ret = HttpResponse('xx')
      ret.set_cookie(key,value,max_age=5,path='/')
      ret.set_signed_cookie(key,value,max_age=5,path='/',salt='xxx')
      #获取cookie
      request.COOKIES {}  [key] .get(key)
      request.get_signed_cookie(key,salt='xxx',default='')
      
      #删除cookie    set=cookie   key:''  max_age = 0
      ret = HttpResponse('xx')
      ret.delete_cookie(key)
      
      

session

  1. 保存在服务器上的一组组键值对,依赖于cookie使用

  2. 为什么使用session?

    1. cookie是保存在浏览器本地,不太安全
    2. 浏览器会对cookie的大小和个数有一定的限制
  3. django中操作session

    #设置session 
    request.session[key] = value
    #获取
    request.session[key]   request.session.get(key)
    
    #删除
    del request.session[key]
    request.session.pop(key)
    
    #将所有session 失效日期小于当前日期的数据删除
    request.session.clear_expired()
    #删除当前用户的所有session数据
    request.session.delete() #不删除cookie
    request.session.flush() #删除cookie
    
   
4. 配置

   ```python
   SESSION_COOKIE_NAME = 'session'
   SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2
   SESSION_SAVE_EVERY_REQUEST = True #每次请求后更新超时时间
   SESSION_EXPIRE_AT_BROWSER_CLOSE = False  # 关闭浏览器cookie就失效
   SESSION_ENGINE = 'django.contrib.sessions.backends.db' 
   #session保存的位置
   #默认是数据库 缓存 缓存+数据库  文件  加密cookie
   from django.contrib.sessions.backends import db
   
  1. 中间件(类似过滤器)

    1. Django中处理请求和响应的框架级别的钩子。本质上就是一个类 类定义5个方法 特定时执行这些方法
    2. 5个方法 4个特征

    image-20200408154557078

    1. 执行时间 执行顺序 参数 返回值
      process_request(self,request)

      1. 执行时间 :视图函数之前
      2. 参数:
        1. request:请求的对象和 视图函数是一个对象
      3. 执行顺序 : 按照注册的顺序 顺序执行
      4. 返回值:
        1. None 正常流程
        2. HttpResponse 不执行后续的中间件的process_request 、路由匹配、process_view、视图都不执行,直接执行当前中间件的process_response方法
        3. image-20200408172036668

      process_response(self,request,response)

      1. 执行时间 :视图函数之后
      2. 参数:
        1. request:请求的对象和 视图函数是一个对象
        2. response:响应对象
      3. 执行顺序 : 按照注册的顺序 倒序执行
      4. 返回值:
        1. HttpResponse 必须返回response对象

      process_view(self,request,view_func,view_args,view_kwargs)

      1. 执行时间 :路由匹配之后,视图函数之后

      2. 参数:

        1. request:请求的对象和 视图函数是一个对象
        2. view_func:视图函数 形参
        3. view_args:视图函数的位置参数 形参
        4. view_kwargs:视图函数关键字参数 形参
      3. 执行顺序 : 按照注册的顺序 顺序执行

      4. 返回值:

        1. HttpResponse 之后的中间件的process_view 视图都不执行 执行最后一个中间件的process_response方法

        2. 正常执行顺序

          image-20200408174143303
        3. 返回response对象执行顺序

          image-20200408174338641

      process_exception(self,request,exception)

      1. 执行时间(触发条件) :视图中有错误
      2. 参数:
        1. request:请求的对象和 视图函数是一个对象
        2. exception:异常对象
      3. 执行顺序 : 按照注册的顺序 倒序执行
      4. 返回值:
        1. None : 当前的中间件没有处理异常 交给下一个中间件处理异常 如果都没有处理异常 就让django处理异常
        2. HttpResponse对象 当前中间件处理了异常后面的process_exception就不执行了 执行最后一个中间件的process_response方法

      process_template_response(self,request,response)

      1. 执行时间(触发条件) :视图中返回对象时一个TemplateResponse对象
      2. 参数:
        1. request :请求的对象和 视图函数是一个对象
        2. response :TemplateResponse对象
      3. 执行顺序 : 按照注册的顺序 倒序执行
      4. 返回值:
        1. HttpResponse对象 必须返回TemplateResponse对象
        2. 过程处理模板的名字参数
          1. response.template_name = 'index1_html'
          2. response.context_data['user'] = 'lsl'
        3. image-20200408183642078

    JSON

    1. 轻量级的文本数据交互格式
    2. python
    3. 支持的数据类型
      1. 字符串 数字 布尔值 列表 字典 None
    4. 序列化
      1. python的数据类型————》》json字符串
    5. 反序列化
      1. json————》》python的数据类型

    AJAX

    1. ajax是一个js技术,实习异步交互

    2. 局部刷新

    3. 传输的数据量很小

    4. <script>
          $('#b1').click(function () {
              $.ajax({
                  url:'/calc/',
                  type:'get',
                  data:{
                      'x1':$('[name="i1"]').val(),
                      'x2':$('[name="i2"]').val(),
                  },
                  success:function (data) {
                      $('[name="i3"]').val(data)
                  }
              })
          })
      </script>
      
      
    5. ajax上传文件

      1. $.ajax({
            url:'/test/',
            type:'get',
            data:{
                name:'李世林',
                age:18,
                hobby:JSON.stringify(['q','w','e','r'])
            },
            success:function (data) {
                console.log(data);
                console.log(data.stasus);
        
            }
        })
        
    6. 使用ajax上传文件

      1. $.ajax({
            url:'/upload/',
            type:'post',
            data:formData,
            processData: false,// ajax 不处理数据的编码
            contentType: false,//  不修改content-type的请求头
            success:function (data) {
                alert(data)
        
            }
        
        })
        
        from django.views.decorators.csrf import csrf_exempt,csrf_protect,ensure_csrf_cookie
        
        @csrf_exempt   加在视图函数上  该视图不需要进行csrf校验
        @csrf_protect  加在视图函数上  该视图需要进行csrf校验
        @ensure_csrf_cookie 加在视图上  确保返回时设置csrftoken的cookie
        

        csrf的校验

        从cookie中获取csrftoken的值
        从request.POST中获取csrfmiddlewaretoken的值
        把这两个值做对比 对比成功就接受请求 反之拒绝
        

        前提:必须有csrftoken的cookie:

        1. 使用{% csrf_token %}
        2. 视图上加ensure_csrf_cookie装饰器

        让ajax可以通过django的csrf的校验:

        1. 给data添加csrfmiddlewaretoken的键值对
        2. 给headers添加x-csrftoken的键值对(导入文件方式)

        推荐:导入文件+确保有cookie

原文地址:https://www.cnblogs.com/DemoLi/p/12770065.html