django09 cookie与session与django中间件

191 阅读4分钟

cookie与session简介

回忆Http协议四大特性

  • Cookie
    • 保存在客户端上跟用户信息(状态)相关的数据
  • Session
    • 保存在服务端上跟用户信息(状态)相关的数据

session的工作需要依赖于cookie 就算是目前所有能够识别用户身份的网址也都需要使用cookie(客户端浏览器也有权拒绝保存cookie)

django操作cookie

  • 想要让客户端浏览器保存cookie需要HttpResonse对象调用方法
    return HttpResponse()
    return render()
    return redirect()
    return JsonRepsonse()
    
  • 设置cookie
    obj = HttpResponse()/render()/redirect()/JsonRepsonse()
    obj.操作cookie的方法
    return obj
    
  • cookie操作设置
    1.登录设置cookie
    2.多个视图函数都需要校验用户是否登录
      装饰器
    3.如何记住用户登录之前想要访问的页面 用户登录成功之后自动跳转
      场景1:用户访问了其他需要登录才可以访问的页面   如何跳转>>>:想要访问的
      场景2:用户直接访问的登录页面  如何跳转>>>:网址首页
      	print(request.path)
      	        print(request.path_info)
      	        print(request.get_full_path())
    

django操作session

  • 类似于服务端接收到客户端产生的随机字符串,存储后每次自动校验
    • 1.django默认的session失效时间14天
    • 2.客户端会接收到键值对,键默认是sessionid值是加密的随机字符串(令牌)
    • 3.session用于存储一次会话的多次请求的数据,存在服务器端
    • 4.session可以存储任意类型,任意大小的数据
    • 5.浏览器关闭后,再次打开session也能相同
    • 6.session是以键值对的形式存储的
    • 7.session依赖于cookie;唯一标识码保存在sessionid cookie
  • session操作
    request.session['name'] = 'jason'
      1.django自动产生一个随机字符串返回给客户端(对name加密)
      2.往django_session创建数据(对jason加密)
    request.session.get('name')
      1.自动从请求中回去sessionid对应的随机字符串
    	2.拿着随机字符串去django_session中匹配数据
    	3.如果匹配上还会自动解密数据并展示  
    
  • session的存储位置(五种模式)
      数据库
      缓存数据库
      文件
      缓存+数据库
      加密
    
  • session其他操作
    * 删除
      # 删除当前会话的所有Session数据
      request.session.delete()
      # 删除当前的会话数据并删除会话的Cookie。
      request.session.flush() 
    * 时间设置
      # 设置会话Session和Cookie的超时时间
      request.session.set_expiry(value)
          1.如果value是一个int类型,那么session将在value这个时间后过期,其中value代表的是秒。
          2.如果value是一个datetime或者timedelta对象,那么这个session将在指定的时间后过期。datetime必须是使用了PickleSerializer进行序列化的。
          3.如果value等于0,那么session将在web浏览器关闭后就直接过期。
          4.如果value等于None,那么session将用settings.py中设置的全局过期字段SESSION_COOKIE_AGE,这个字段默认是14天,也就是2个礼拜。
          5.读session的时候不会修改session的有效期,修改session的时候会重新设置session的有效期,会从修改的时间,重新计时。
          6.如果settings.py中设置了SESSION_EXPIRE_AT_BROWSER_CLOSE=True,那么默认讲不再使用SESSION_COOKIE_AGE了,而是浏览器一关闭,session数据就会过期。这个值默认是为False
    value的注意事项:
          1. 如果value是个整数,session会在些秒数后失效。
          2. 如果value是个datatime或timedelta,session就会在这个时间后失效。
          3. 如果value是0,用户关闭浏览器session就会失效。
          4. 如果value是None,session会依赖全局session失效策略
    

django中间件

    1. 所有的请求和响应都必须经过中间件
    1. django中间件默认自带七个,每个中间件负责不同的功能
    1. Django 中间件作用
    • 修改请求,即传送到view中的HttpRequest对象。
    • 修改响应,即view返回的HttpResponse对象。
    中间件的配置:
    MIDDLEWARE = [
      'django.middleware.security.SecurityMiddleware',
      'django.contrib.sessions.middleware.SessionMiddleware',
      'django.middleware.common.CommonMiddleware',
      'django.middleware.csrf.CsrfViewMiddleware',
      'django.contrib.auth.middleware.AuthenticationMiddleware',
      'django.contrib.messages.middleware.MessageMiddleware',
      'django.middleware.clickjacking.XFrameOptionsMiddleware',
    
  • 常见的中间件方法(五个)
    • 1.process_request
      1.请求来的时候会按照配置文件中注册了的中间件 从上往下依次执行每一个中间件里面的process_request方法 如果没有则直接跳过
      2.该方法如果返回了HttpResonse对象 那么请求不会再往后执行 原路返回
      
    • 2.process_response
      1.响应走的时候会按照配置文件中注册了的中间件 从下往上一次执行每一个中间件里面的process_response方法 没有没有则直接跳过
      2.该方法有两个形参requestresponse 并且默认情况下应该返回response
      3.该方法也可以自己返回HttpResponse对象 相当于狸猫换太子
          注意:如果请求的过程中process_request方法直接反悔了HttpResponse对象那么会原地执行同级别process_response方法返回(flask则不同)
      
    • 3.process_view
      当路由匹配成功之后 执行视图函数之前 自动触发
      
    • 4.process_excption
      当视图函数报错之后 自动触发
      
    • 5.process_template_response
      当视图函数返回的数据对象中含有render属性对应render函数才会触发
      
  • 自定义中间件
    1.  创建一个任意名的文件夹
    2.  文件夹内创建一个任意名的py文件
    3.  在py文件内编写中间件类
    4.  在配置文件中注册即可