• 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校验    注释中间件下,@csrf_protect加在视图函数上,其他都不校验,只这个
     

    注意点:

    from django.shortcuts import render, HttpResponse
    from django.template.response import TemplateResponse
    from django.views.decorators.csrf import csrf_exempt, csrf_protect
    def index(request, pk):
        print('index')
        # print(id(request))
        ret = HttpResponse('o98k')
    
        def xxx():
            return HttpResponse('快开学了')
        ret.render = xxx
        ret.set_signed_cookie()
        return ret
    
        # return TemplateResponse(request, 'index.html', {'index': '放假了'})
    @csrf_exempt  #除了
    # @csrf_protect #保护
    def home(request):
        return render(request, 'home.html')
    
    from django.views import View
    from django.utils.decorators import method_decorator  #方法装饰器
    class Home(View):
        @method_decorator(csrf_exempt)
        def dispatch(self, request, *args, **kwargs):
            ret = super().dispatch(request, *args, **kwargs)
            return ret
        def get(self, request):
            return render(request, 'home.html')
        # @装饰器加在这里不行
        def post(self, request):
            return render(request, 'home.html')


    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. 对比不成功,校验失败,拒绝

     
  • 相关阅读:
    Python之杨辉三角算法实现
    iOS之UI--微博个人详情页
    iOS之UI--通讯录的实例关键知识技术点积累
    iOS之github第三方框架(持续更新)
    关于第三方IOS的checkBox框架的使用
    iOS之UI--Quartz2D的入门应用--重绘下载圆形进度条
    iOS之多控制器管理--项目中的常见文件
    iOS之微博UI实例--拟物化设计(成功了90%)
    主要责任、主要技术
    IOS之UI -- UITableView -- 2 -- 等高的Cell
  • 原文地址:https://www.cnblogs.com/zhangchen-sx/p/10386183.html
Copyright © 2020-2023  润新知