cookie 和 session 的一些事 中间件

cookie 和 session

cookie

1. 保存在浏览器上一组组键值对,服务器让浏览器进行设置。
2. 为什么要用cookie?
   HTTP协议是无状态。使用cookie保存状态。
3. django中的操作
   设置:
       response.set_cookie(key,value,max_age=5)
       response.set_signed_cookie(key,value,max_age=5,salt='xxx')
   获取:
       request.COOKIES
       request.COOKIES[key]  request.COOKIES.get(key)
       request.get_signed_cookie(key,salt='xxx',default='')
   删除:
       response.delete_cookie(key)  
   session
   1. 保存在服务器上一组组键值对,依赖于cookie
   2. 为什么要用session?
      1. cookie保存在浏览器上,不安全
      2. 长度大小收到限制
   3. django中的操作
      1. 设置
         request.session[key] = value
         request.session.setdefault(key,value)
      2. 获取
         request.session[key]
         request.session.get(key)
      3. 删除
         del request.session[key]
         request.session.delete()        # 删除当前回话的所有session数据,不删除cookie
         request.session.flush()          # 删除当前回话的所有session数据,删除cookie
      4. 其他
         request.session.clear_expired()   # 清除已过期的session
         request.session.set_expiry(value)   #设置过期时间  0时关闭浏览器就失效.
      5. 配置
             from django.conf import global_settings  #全局设置

django 中的中间件

django中的中间件是一个类,在全局范围内改变django的输入和输出

from django.utils.deprecation import MiddlewareMixin

五种方法:

process_request(self, request):

执行时间:在视图执行之前

执行顺序:按照 注册顺序 顺序 执行

返回值:

    None:正常流程

    HttpResponse对象:不执行下一个中间件中的process_request,不执行路由匹配,不执行视图,直接执行当前中间件的process_response方法。

process_response(self, request, response)

执行时间:在视图执行之后

执行顺序:按照注册顺序倒叙执行

返回值:

    HttpResponse对象

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

执行时间:在视图执行之前,路由匹配之后

执行顺序:按照注册顺序顺序执行

返回值:

    None:正常流程

    HttpResponse对象:不执行下一个中间件中的process_view,不执行视图,直接执行所有中间件中最后一个中间件的process_response方法。

process_exception(self, request, exception)

执行时间:视图层面报错时执行 

执行顺序:按照注册顺序倒序执行

返回值:

    None:交给下一个中间件处理异常

    HttpResponse对象:不执行下一个中间件中的process_exception,执行所有中间件中最后一个中间件的process_response方法。

process_template_response(self, request, response)

执行时间:返回的response对象是template_response,或者response对象有一个render的方法

执行顺序:按照注册顺序倒序执行

返回值:

    HttpResponse对象

csrf中间件

csrf 跨站请求伪造

django中跨站请求伪造的保护机制

装饰器

    from django.views.decorators.csrf import csrf_exempt,csrf_protect

csrf_exempt     加在视图上,表示当前视图不进行csrf校验

csrf_protect    加在视图上,表示当前视图进行csrf校验

注意点:

CBV情况,csrf_exempt装饰器要加在dispatch上

1. process_request(self, request):
   从cookie中获取csrftoken的值  —— 》 request.META['CSRF_COOKIE']
2. process_view:
   1. 判断视图是否加上csrf_exempt,
      1. 有就不在进行csrf校验
      2. 没有继续进行校验
   2. 判断请求方式是'GET', 'HEAD', 'OPTIONS', 'TRACE'1. 是的话,不进行校验
      2. 不是的话,进行校验
   3. 进行校验的:
      1.     csrf_token = request.META.get('CSRF_COOKIE')   #  csrf_token = cookie中获取csrftoken的值
      2.     先尝试从request.POST获取csrfmiddlewaretoken对应的值
             request_csrf_token = request.POST.get('csrfmiddlewaretoken', '')  # 获取隐藏标签的csrfmiddlewaretoken对应的值
             再尝试从请求头中获取X-csrftoken的值
             request_csrf_token = request.META.get(settings.CSRF_HEADER_NAME, '')
      3. 拿csrf_token和request_csrf_token 进行对比
         1. 对比成功,校验成功
         2. 对比不成功,校验失败,拒绝

猜你喜欢

转载自www.cnblogs.com/zhangchen-sx/p/10386183.html