视图可以是函数,也可以是类,类视图同样能够实现视图的功能。类视图最大的特点是可以利用不同的实例方法响应不同的HTTP请求方法(GET、POST),且可以利用面向对象的技术将代码分解为可重用的组件
from django.shortcuts import HttpResponse from django.views import View from django.views.decorators.csrf import csrf_exempt from django.utils.decorators import method_decorator class FirstView(View): s = '(%s) Hello Django!' def get(self, request): return HttpResponse(self.s % 'GET') def post(self, request): return HttpResponse(self.s % 'POST') @method_decorator(csrf_exempt) def dispatch(self, request, *args, **kwargs): return super(FirstView, self).dispatch(request, *args, **kwargs)
FirstView继承自View,它是所有基于类的视图的基类。其中定义了get和post方法,映射到GET和POST请求类型
另外,FirstView重写了父类的dispatch方法,dispatch根据HTTP类型实现请求分发。例如,如果是GET请求,则分发给get方法。如果View中没有实现对应请求类型的方法,则会返回HttpResponseNotAllowed
应用于函数的装饰器不能直接应用到类方法上,需要将它转换为类方法的装饰器。可以看到在dispatch方法上添加了@method_decorator装饰器🧨
url解析器:
Django的URL解析器会将请求发送到一个函数而不是一个类,所以,需要用到View提供的as_view方法完成URL的定义:
from post.views import FirstView urlpatterns = [ path('watch_class/', FirstView.as_view()), ]