Django基于Rest Framework的CBV封装详解
什么是CBV?
CBV全称为Class-Based Views,中文名为基于类的视图,是Django框架中的一种视图函数封装方式。与FBV不同,CBV重点是通过类的继承和重载的方式,对通用的视图功能进行封装,提高代码的重用性。
在实际开发中,CBV通常比FBV更加优雅、简洁、易于维护和扩展,因此,深入了解和掌握CBV的使用,对于Django开发者来说是非常重要的。
Rest Framework与CBV的结合
Django Rest Framework(以下简称DRF)提供了一系列和RESTful API开发相关的扩展,可以大大简化API的开发流程和代码量。
在DRF中,CBV得到了充分的支持和推广,特别是基于generics
和mixins
的CBV,致力于提供更加灵活、强大的API视图函数封装方式。
下面我们将一步步的讲解DRF如何使用CBV来封装API视图。
生成项目
首先,我们需要生成一个Django项目和应用,通过命令行输入以下指令:
django-admin startproject myproject
cd myproject
python manage.py startapp myapp
其中,myproject和myapp分别为项目和应用的名称,读者可以根据实际需求进行修改。
安装依赖
在使用DRF之前,我们需要安装对应的依赖库,输入以下指令:
pip install djangorestframework==3.12.4
pip install markdown # Markdown support for the browsable API.
pip install django-filter # Filtering support
安装完成后,在myproject
目录下的settings.py
文件中加入DRF,并设置REST_FRAMEWORK参数,示例如下:
INSTALLED_APPS = [
# ...
'rest_framework',
]
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAdminUser',
],
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.BasicAuthentication',
'rest_framework.authentication.SessionAuthentication',
],
}
引入基础视图类
在Django Rest Framework中,通常会使用到如下这些基础视图类,需要在我们的视图中进行引用:
from rest_framework import generics
from rest_framework import mixins
from rest_framework import viewsets
from rest_framework.response import Response
generics.GenericAPIView
:通用视图类,主要提供一些常用的方法,如get()
,post()
等。但是该类并没有提供具体实现,需要和mixins配合使用。mixins.CreateModelMixin
:提供了create()
方法,用于新建数据。mixins.RetrieveModelMixin
:提供了retrieve()
方法,用于查询单条数据。mixins.UpdateModelMixin
:提供了update()
方法,用于修改数据。mixins.DestroyModelMixin
:提供了destroy()
方法,用于删除数据。mixins.ListModelMixin
:提供了list()
方法,用于查询数据列表。
常用的API视图
基于GenericAPIView的视图
GenericAPIView
提供了get、post、put、delete等方法,但是不提供具体实现。需要配合mixins使用。这种视图适用于比较基础的增删改查操作。示例如下:
class UserListAPIView(generics.GenericAPIView, mixins.ListModelMixin, mixins.CreateModelMixin):
queryset = User.objects.all()
serializer_class = UserSerializer # 序列化器类
def get(self, request, *args, **kwargs):
# 在此进行get请求的一些相关业务操作
return self.list(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
# 在此进行post请求的一些相关业务操作
return self.create(request, *args, **kwargs)
基于ViewSet的视图
ViewSet
是另一种比较常用的视图API,它可以针对传入请求的类型自动分配处理方法。对于较为复杂的业务场景,我们可以通过继承ViewSet
并重载对应的方法来处理请求。示例如下:
class UserViewSet(viewsets.ViewSet):
def list(self, request):
# 在此进行list请求的一些相关业务操作
queryset = User.objects.all()
serializer = UserSerializer(queryset, many=True)
return Response(serializer.data)
def create(self, request):
# 在此进行create请求的一些相关业务操作
serializer = UserSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
使用路由
在过程中你需要将视图函数绑定至URL地址。我们需要配置一下路由,为API视图提供URL路由。示例如下:
from django.urls import path, include
from rest_framework import routers
router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet)
urlpatterns = [
path('', include(router.urls)),
path('api-auth/', include('rest_framework.urls', namespace='rest_framework')),
# 定义API视图路由
path('users/', views.UserListAPIView.as_view()),
path('users/<int:pk>/', views.UserDetailAPIView.as_view()),
]
示例1:基于GenericAPIView的视图实现用户的增删改查操作
class UserListAPIView(generics.GenericAPIView, mixins.ListModelMixin, mixins.CreateModelMixin):
queryset = User.objects.all()
serializer_class = UserSerializer # 需要定义UserSerializer
def get(self, request, *args, **kwargs):
# 在此进行get请求的一些相关业务操作
return self.list(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
# 在此进行post请求的一些相关业务操作
return self.create(request, *args, **kwargs)
class UserDetailAPIView(generics.GenericAPIView, mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin):
queryset = User.objects.all()
serializer_class = UserSerializer
def get(self, request, *args, **kwargs):
# 在此进行get请求的一些相关业务操作
return self.retrieve(request, *args, **kwargs)
def put(self, request, *args, **kwargs):
# 在此进行put请求的一些相关业务操作
return self.update(request, *args, **kwargs)
def delete(self, request, *args, **kwargs):
# 在此进行delete请求的一些相关业务操作
return self.destroy(request, *args, **kwargs)
示例2:基于ViewSet的视图实现用户的列表和详情查询操作
class UserViewSet(viewsets.ViewSet):
def list(self, request):
# 在此进行list请求的一些相关业务操作
queryset = User.objects.all()
serializer = UserSerializer(queryset, many=True)
return Response(serializer.data)
def retrieve(self, request, pk):
# 在此进行retrieve请求的一些相关业务操作
user = get_object_or_404(User, pk=pk)
serializer = UserSerializer(user)
return Response(serializer.data)
以上就是Django基于Rest Framework的CBV封装的详细攻略,希望能对读者有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:django基于restframework的CBV封装详解 - Python技术站