Django中的类视图
类视图使用
1.定义类视图
- 在Django中也可以使用类来定义一个视图,称为类视图。
- 使用类视图可以将视图对应的不同请求方式以类中的不同方法来区别定义。如下所示
from django.views.generic import View class RegisterView(View): """类视图:处理注册""" def get(self, request): """处理GET请求,返回注册页面""" return render(request, 'register.html') def post(self, request): """处理POST请求,实现注册逻辑""" return HttpResponse('这里实现注册逻辑')
说明:
- 定义类视图需要继承自Django提供的父类View,可使用
from django.views.generic import View
或者from django.views.generic.base import View
导入,定义方式如上所示
2.定义类视图的路由
- 配置路由时,使用类视图的
as_view()
方法来添加。
urlpatterns = [ # 视图函数:注册 # url(r'^register/$', views.register, name='register'), # 类视图:注册 url(r'^register/$', views.RegisterView.as_view(), name='register'), ]
3. 类视图的好处:
- 代码可读性好
- 类视图相对于函数视图有更高的复用性 , 如果其他地方需要用到某个类视图的某个特定逻辑,直接继承该类视图即可
类视图原理
@classonlymethod def as_view(cls, **initkwargs): """ Main entry point for a request-response process. """ ...省略代码... def view(request, *args, **kwargs): self = cls(**initkwargs) if hasattr(self, 'get') and not hasattr(self, 'head'): self.head = self.get self.request = request self.args = args self.kwargs = kwargs # 调用dispatch方法,按照不同请求方式调用不同请求方法 return self.dispatch(request, *args, **kwargs) ...省略代码... # 返回真正的函数视图 return view def dispatch(self, request, *args, **kwargs): # Try to dispatch to the right method; if a method doesn't exist, # defer to the error handler. Also defer to the error handler if the # request method isn't on the approved list. if request.method.lower() in self.http_method_names: handler = getattr(self, request.method.lower(), self.http_method_not_allowed) else: handler = self.http_method_not_allowed return handler(request, *args, **kwargs)
说明:as_view方法返回一个方法,这个方法执行时,最终会根据请求方式,调用我们在视图类中定义的方法