def register(request): """处理注册""" # 获取请求方法,判断是GET/POST请求 if request.method == 'GET': # 处理GET请求,返回注册页面 return render(request, 'register.html') else: # 处理POST请求,实现注册逻辑 return HttpResponse('这里实现注册逻辑')
在Django中也可以使用类来定义一个视图,称为类视图。
使用类视图可以将视图对应的不同请求方式以类中的不同方法来区别定义。
类视图的好处
类视图原理
from django.views import View class RegisterView(View): """类视图:处理注册""" def get(self, request): """处理GET请求,返回注册页面""" return JsonResponse({"name":"zhangsan"}) def post(self, request): """处理POST请求,实现注册逻辑""" return JsonResponse({"name":"zhangsan"})
1、 dispatch是父类中用来反射的函数,找对应的函数(比对应函数先执行)
2、 比如你发送post请求就可以通过dispatch找到对应的post函数进行处理,get就会找到get函数处理
添加路由 from django.urls import path, re_path from app01 import views urlpatterns = [ re_path('home/', views.Home.as_view()), ]
def my_decorator(func): def wrapper(request, *args, **kwargs): print('自定义装饰器被调用了') print('请求路径%s' % request.path) return func(request, *args, **kwargs) return wrapper
在类视图中使用为函数视图准备的装饰器时,不能直接添加装饰器
需要使用method_decorator将其转换为适用于类视图方法的装饰器。
method_decorator装饰器使用name参数指明被装饰的方法
from django.shortcuts import HttpResponse from django.views import View 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') # 只给get请求添加装饰器 @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')
from django.shortcuts import HttpResponse from django.views import View from django.utils.decorators import method_decorator # 为特定请求方法添加装饰器 class DemoView(View): @method_decorator(my_decorator) # 为get方法添加了装饰器 def get(self, request): print('get方法') return HttpResponse('ok') @method_decorator(my_decorator) # 为post方法添加了装饰器 def post(self, request): print('post方法') return HttpResponse('ok') def put(self, request): # 没有为put方法添加装饰器 print('put方法') return HttpResponse('ok')
使用面向对象多继承的特性,可以通过定义父类(作为扩展类)
在父类中定义想要向类视图补充的方法,类视图继承这些扩展父类,便可实现代码复用。
定义的扩展父类名称通常以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) ...