在Django中还可以通过类来定义一个视图,称为类视图。
定义一个类视图:定义一个类,需继承 Django 提供的 View 类 。
from django.views.generic import View
 class TestView(View):
     def get(self, request):
         """get请求"""
         return render(request, ‘index.html‘)
     def post(self, request):
         """post请求"""
         # 代码略
         return HttpResponse(‘操作结果‘)
路由配置:调用类视图的 as_view() 方法
 urlpatterns = [
     ...
     url(r‘^Test$‘, views.PostView.as_view()),
 ]
as_view()的作用是按照不同请求方式调用不同请求方法,详情查看 as_view() 方法源码,以及其内部调用的 dispatch()
定义的扩展父类名称通常以Mixin结尾,类视图可以直接通过多继承,继承他们的方法。
ListModelMixin 查询多条数据(列表数据)
CreateModelMixin 新增一条数据
RetrieveModelMixin 查询一条数据
UpdateModelMixin 修改一条数据
DestroyModelMixin 删改一条数据
这些 Mixin 类分别提供了不同的类视图方法{{TODO:后续补充详情}})
class DepartmentView(CreateModelMixin, ListModelMixin, View):
    """
    同时继承两个扩展类
    """
    def get(self, request):
        # 复用父类ListModelMixin的list方法
        return self.list(request)    
    def post(self, request):
        # 复用父类CreateModelMixin的create方法
        return self.create(request) 
class EmployeeView(CreateModelMixin, View):
    """
    继承CreateModelMixin扩展类
    """
    def post(self, request):
        # 复用父类ListModelMixin的list方法
        return self.create(request)
装饰器:不在改变原有函数的前提下,在函数调用之前或之后执行额外的操作
def check_ip(view_fun):
     """装饰器:禁止黑名单ip访问"""
     def wrapper(request, *args, **kwargs):
         # 在视图函数执行前做额外的操作:
         # 禁止ip黑名单访问
         IP = request.META.get(‘REMOTE_ADDR‘)
         if IP in [‘192.168.210.160‘]:
             return HttpResponse(‘IP禁止访问‘)
         return view_fun(request, *args, **kwargs)
     return wrapper
需要使用method_decorator 装饰器,函数装饰器补充第一个self参数,使它可以应用到类的方法中。
@method_decorator(check_ip)
class PostView(View):
    @method_decorator(check_ip)
    def post(self, request):
        return HttpResponse(‘处理发帖操作‘)
给 dispatch 方法加上@method_decorator(check_ip),就能给给类视图的所有方法应用装饰器:
class PostView(View):
    @method_decorator(check_ip)
    def dispatch(self, request, *args, **kwargs):
        return super().dispatch(request, *args, **kwargs)
在类上面添加装饰器,指定对哪个方法进行装饰 :@method_decorator(装饰器名, name=‘视图方法名‘)
@method_decorator(check_ip, name=‘get‘)
class PostView(View):
    def get(self, request):
        return render(request, ‘index.html‘)
    def post(self, request):
        return HttpResponse(‘操作结果‘)
一个轻量级、底层的插件系统,用于在视图函数调用之前或之后执行额外操作,在全局上修改Django的输入或输出。
| 方法名 | 作用 | 返回值 | 
|---|---|---|
__init__(self, get_response=None) | 
服务器启动(重启)时执行一次 | 无 | 
process_request(self, request) | 
在视图执行之前调用 | 返回 None: 会执行视图;返回 HttpResponse: 不会再执行视图 | 
process_response(self, request, response) | 
在视图执行完之后调用 | 必须返回HttpResponse对象 | 
通过继承Django的MiddlewareMixin扩展类实现
class MyMiddleware(MiddlewareMixin):
    def process_request(self, request):
        print(‘before 视图‘)
    def process_response(self, request, response):
        print(‘after 视图‘)
        return response     # 必须要有返回值
process_request():可以返回None或者response对象,如果返回response对象,则视图函数就不会再执行了
MIDDLEWARE = [
     ‘middlewares.MyMiddleware‘,  # 注册中间件
 ]
要注意多个中间件之间的依赖关系, 被依赖的中间件要声明在前面
原文:https://www.cnblogs.com/mzfly/p/9978612.html