Django中间件
django 的 中间件
process_request 最早执行
process_view 执行视图前
process_template_response 视图函数返回 render的时候
process_exception 异常执行
process_response 最后执行
应用场景:
基于角色的权限控制
用户认证
csrf --- prcocess-view方法
cors 跨域
session
黑白名单
日志管理
Django 实现 csrf验证的方式
去请求体 或者 cookie中获取 token 验证
(1) csrf_token 中间件 -- 全局配置
基于中间件的process_view函数中实现
(2) 视图函数中 -- 通过装饰器 局部实现
(在视图中是否被 csrf_exempt,csrf_protect装饰器 装饰)
FBV模式下的 csrf 验证与免验证
函数 装饰器
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
from django.views.decorators.csrf import csrf_protect
@csrf_protect
CBV模式下的 csrf 验证与免验证 method_decorators---需要装饰dispatch函数
方式一 写在基类中,继承
from django.utils.decorators import method_decorator
class MyBaseView(object):
@method_decorator(csrf_exempt|csrf_protect)
def dispatch(self, request, *args, **kwargs):
print('before')
ret = super(MyBaseView,self).dispatch(request, *args, **kwargs)
print('after')
return ret
class LoginView(MyBaseView,APIView):
def get(self,request,*args,**kwargs):
ret = {
'code':1000,
'data':'ddd'
}
response = JsonResponse(ret)
return response
方式二 指定 name = 'dispatch' 属性
@method_decorator(csrf_protect,name='dispatch')
class LoginView(MyBaseView,APIView):
def get(self,request,*args,**kwargs):
ret = {
'code':1000,
'data':'ddd'
}
response = JsonResponse(ret)
return response
方式三 直接在视图中 重写 dispatch ,加装饰器
class LoginView(MyBaseView,APIView):
@method_decorator(csrf_protect)
def dispatch(self, request, *args, **kwargs):
print('before')
ret = super(LoginView,self).disptch(request, *args, **kwargs)
print('after')
return ret
def get(self,request,*args,**kwargs):
ret = {
'code':1000,
'data':'ddd'
}
response = JsonResponse(ret)
return response
Django 基于CBV 实现登录控制的方式
基于FBV -- login_reqeuired 装饰器
基于CBV
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
(1) 继承基类
class LoginRequiredMixin(object):
@method_decorator(login_required(login_url=reverse('login')))
def dispatch(self,request,*args,**kwargs):
return super(LoginRequiredMixin,self).dispatch(self,request,*args,**kwargs)
class CourseView(LoginRequiredMixin,View):
pass
(2) method_decorator + name = 'dispatch'
@method_decorator(login_required(login_url=reverse('login')),name='dispatch')
class CourseView(View):
pass
(3) 直接写在视图中,重载 dispatch 函数
class CourseView(View):
@method_decorator(login_required(login_url=reverse('login')))
def dispatch(self,request,*args,**kwargs):
return super(Course,self).dispatch(self,request,*args,**kwargs)
补充
反射的应用:
(1) CBV -- dispatch方法中通过method获取 方法
(2) 中间件的导入 'dasdsa.aDd.xxxmiddleware' -- 导入settings
from importlib import import_module
module = import_module(module_path)
cls = getattr(module,class_name)
cls() # 类的实例化
读书使人心眼明亮