1 类视图
1.1 函数视图
以函数的方式定义的视图称为函数视图。
def register(request):
"""处理注册"""
if request.method == 'GET':
return render(request, 'register.html')
else:
return HttpResponse('这里实现注册逻辑')
1.2 类视图
在Django中也可以使用类来定义一个视图,称为类视图。
from django.views import View
class RegisterView(View):
"""类视图:处理注册"""
def get(self, request):
"""处理GET请求,返回注册页面"""
return render(request, 'register.html')
def post(self, request):
"""处理POST请求,实现注册逻辑"""
return HttpResponse('这里实现注册逻辑')
类视图的好处:
代码可读性好
类视图相对于函数视图有更高的复用性,
2 类视图使用
定义类视图需要继承自Django提供的父类View,可使用from django.views import View
配置路由时,使用类视图的as_view()方法来添加。
from django.views import View
urlpatterns = [
url(r'^register/$', views.RegisterView.as_view(), name='register'),
]
3 类视图使用装饰器
def my_decorator(func):
def wrapper(request, *args, **kwargs):
print('自定义装饰器被调用了')
print('请求路径%s' % request.path)
return func(request, *args, **kwargs)
return wrapper
class DemoView(View):
def get(self, request):
print('get方法')
return HttpResponse('ok')
def post(self, request):
print('post方法')
return HttpResponse('ok')
3.1 在URL配置中装饰
urlpatterns = [
url(r'^demo/$', my_decorate(DemoView.as_view()))
]
此种方式最简单,但因装饰行为被放置到了url配置中,
单看视图的时候无法知道此视图还被添加了装饰器,不利于代码的完整性,不建议使用。
此种方式会为类视图中的所有请求方法都加上装饰器行为
3.2 在类视图中装饰
在类视图中使用为函数视图准备的装饰器时,不能直接添加装饰器,
需要使用method_decorator将其转换为适用于类视图方法的装饰器。
method_decorator装饰器使用name参数指明被装饰的方法
from django.utils.decorators import method_decorator
@method_decorator(my_decorator, name='dispatch')
class DemoView(View):
def get(self, request):
print('get方法')
return HttpResponse('ok')
def post(self, request):
print('post方法')
return HttpResponse('ok')
@method_decorator(my_decorator, name='get')
class DemoView(View):
def get(self, request):
print('get方法')
return HttpResponse('ok')
def post(self, request):
print('post方法')
return HttpResponse('ok')
class DemoView(View):
@method_decorator(my_decorator)
def get(self, request):
print('get方法')
return HttpResponse('ok')
@method_decorator(my_decorator)
def post(self, request):
print('post方法')
return HttpResponse('ok')
def put(self, request):
print('put方法')
return HttpResponse('ok')
4 类视图Mixin扩展类
使用面向对象多继承的特性,可以通过定义父类(作为扩展类),
在父类中定义想要向类视图补充的方法,类视图继承这些扩展父类,便可实现代码复用
举例如下
class ListModelMixin(object):
"""
list扩展类
"""
def list(self, request, *args, **kwargs):
...
class CreateModelMixin(object):
"""
create扩展类
"""
def create(self, request, *args, **kwargs):
...
class BooksView(CreateModelMixin, ListModelMixin, View):
"""
同时继承两个扩展类,复用list和create方法
"""
def get(self, request):
self.list(request)
...
def post(self, request):
self.create(request)
...
class SaveOrderView(CreateModelMixin, View):
"""
继承CreateModelMixin扩展类,复用create方法
"""
def post(self, request):
self.create(request)
...