django框架之自定义中间件及csrf跨站请求伪造等相关内容-75

今日内容

1 django的session原理流程

2 自定义中间件

1 自定义步骤:
-写一个类,继承MiddlewareMixin
   -里面写方法process_request(请求来了,一定会触发它的执行)
   -在setting中配置(注意,放在前和放在后)
  MIDDLEWARE = [
          ...
  'app01.mymiddle.MyMiddleware1',
          ...
]

 

3 process_request,process_response,process_view,process_exception

1 process_request(request对象)
2 process_response(request对象,response对象)
3 多个中间件,执行顺序是什么?
-请求来的时候从上往下执行:process_request
   -请求走的时候,从下往上执行:process_response
       
       
4 process_request可以干什么?
-写一个中间件,不管前端用什么编码,在requset.data中都有post的数据
   -频率限制(限制某个ip地址,一分钟只能访问5次)
   -登录认证(只要没登录,重定向到login路径)、
   -记录用户访问日志(ip,时间,访问路径)
   
5 process_response可以干什么?内部有response对象
-统一给所有(某几个路径)加cookie
   -统一给所有(某几个路径)加响应头
   
   
   
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)
           #
           print("中间件1的process_view")
           return res
7 process_exception 视图函数出错,会执行它(全局异常捕获)(记录日志,哪个ip地址,访问哪个路径,出的错)
   # 全局异常捕获,返回4开头的
   def process_exception(self, request, exception):
       print(exception)
       return render(request,'error.html')

 

4 CSRF_TOKEN跨站请求伪造

1 跨站请求伪造
2 代码演示


3 django解决了csrf攻击,中间件:django.middleware.csrf.CsrfViewMiddleware


4 后期中间件不能注释,每次发送post请求,都需要携带csrf_token随机字符串
-form表单提交
  -在form表单中 {% csrf_token%}
       
   -ajax提交(如何携带)
   方式一:放到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)

          }
      })
       方式二:放到data中
       'csrfmiddlewaretoken':'{{ csrf_token }}'
       方式三:放到头中
      headers:{'X-CSRFToken':'{{csrf_token}}'},
       
       
# jquery.cookie.js
-在浏览器中对cookie进行增,删,查,改
   -前后端分离(js操作cookie)
   
   
   
# 全局使用,局部禁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('登录成功')

# 全局禁用,局部使用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('登录成功')



# 古怪的使用方式,在urls.py中
path('csrf_test/', csrf_exempt(views.csrf_test))
原文地址:https://www.cnblogs.com/usherwang/p/14169457.html