Django学习 day70之Django第十六日

一 django的session原理流程

在这里插入图片描述

二 自定义中间件

自定义步骤:

  1. 写一个类,继承MiddlewareMixin,导入语法:from django.utils.deprecation import MiddlewareMixin
  2. 里面写方法process_request(请求来了,一定会触发它的执行)
  3. 在setting中配置(注意顺序,是放在前还是放在后)
	MIDDLEWARE = [
  		'app01.mymiddle.MyMiddleware1',
	]

三 process_request,process_response,process_view,process_exception

MiddlewareMixin对象的四大方法

  1. process_request(request对象)

  2. process_response(request对象,response对象)

  3. 多个中间件,执行顺序是什么?
    请求来的时候从上往下执行:process_request
    请求走的时候,从下往上执行:process_response

  4. process_request可以干什么?

    1. 写一个中间件,不管前端用什么编码,在requset.data中都有post的数据
    2. 频率限制(限制某个ip地址,一分钟只能访问5次)
    3. 登录认证(只要没登录,重定向到login路径)
    4. 记录用户访问日志(ip,时间,访问路径)
  5. process_response可以干什么?内部有response对象

    1. 统一给所有(某几个路径)加cookie
    2. 统一给所有(某几个路径)加响应头
  6. process_view 路由匹配成功和视图函数执行之前执行(callback就是视图函数)
    在这里插入图片描述

    def process_view(self, request, callback, callback_args, callback_kwargs):
            # print(callback)
            # print(callback_args)
            # print(callback_kwargs)
            #
            res=callback(request)  # 使视图函数提前到process_view之前执行
            #
            print("中间件1的process_view")
            return res
    
  7. process_exception 视图函数出错,会执行它(全局异常捕获)(记录日志,哪个ip地址,访问哪个路径,出的错)

    # 全局异常捕获,返回4开头的
    def process_exception(self, request, exception):
        print(exception)
        return render(request,'error.html')
    

四 CSRF_TOKEN跨站请求伪造

详细资料点击这里

  1. django解决csrf攻击方法,利用中间件:django.middleware.csrf.CsrfViewMiddleware

  2. 后期中间件不能注释,每次发送post请求,都需要携带csrf_token随机字符串

    1. form表单提交
      在form表单中 {% csrf_token %}

    2. ajax提交(如何携带)

      1. 方式一:放到data中
        $.ajax({
               url: '/csrf_test/',
               method: 'post',
               data: {'name': $('[name="name"]').val(),
                   'password': $('[name="password"]').val(),
                   'csrfmiddlewaretoken':$('[name="csrfmiddlewaretoken"]').val()  /* 利用了元素查询的方法 */
               },
               success: function (data) {
                   console.log('成功了')
                   console.log(data)
        
               },
               error: function (data) {
                   console.log('xxxxx')
                   console.log(data)
        
               }
           })
        
      2. 方式二:放到data中
        'csrfmiddlewaretoken':'{{ csrf_token }}'
      3. 方式三:放到头中
        headers:{'X-CSRFToken':'{{csrf_token}}'},
  3. 全局使用,局部禁csrf
    在视图函数上加装饰器的方法

    from django.views.decorators.csrf import csrf_exempt,csrf_protect
    # 全局启用,局部禁用(中间件不能注释,这个视图函数,已经没有csrf校验了)
    @csrf_exempt
    def csrf_test(request):
        if request.method=='GET':
            return render(request,'csrf_test.html')
        else:
            name=request.POST.get('name')
            password=request.POST.get('password')
            print(name)
            print(password)
            return HttpResponse('登录成功')
    
  4. 全局禁用,局部使用csrf(需要注释掉csrf中间件)

    @csrf_protect
    def csrf_test(request):
        if request.method=='GET':
            return render(request,'csrf_test.html')
        else:
            name=request.POST.get('name')
            password=request.POST.get('password')
            print(name)
            print(password)
            return HttpResponse('登录成功')
    
  5. 古怪的使用方式,在urls.py中导入装饰器,并在路由中使用

    path('csrf_test/', csrf_exempt(views.csrf_test))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值