失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > python Django Rest_Framework框架 视图集与路由Routers详解(图文并茂版)

python Django Rest_Framework框架 视图集与路由Routers详解(图文并茂版)

时间:2018-11-11 15:34:38

相关推荐

python Django Rest_Framework框架 视图集与路由Routers详解(图文并茂版)

视图集与路由Routers详解

视图集ViewSet视图集代码实现GenericViewSet视图集代码实现ModelViewSet视图集ReadOnlyModelViewSet视图集路由Routers使用方法具体实现操作视图集中附加action的声明

视图集

ViewSet视图集

继承自APIView与ViewSetMixin,作用也与APIView基本类似,提供了身份认证、权限校验、流量管理等

ViewSet主要通过继承ViewSetMixin来实现在调用as_view()时传入字典{“http请求”:“视图方法名称”}的映射处理请求,如{‘get’:‘list’}

在ViewSet中,没有提供任何动作action方法,需要我们自己实现action方法

使用视图集ViewSet,可以将一系列视图方法相关的操作和相关的http请求动作封装到一个类中:

list() 提供一组数据retrieve() 根据传入pk值,提供一个数据create() 创建数据update() 更新数据destory() 删除数据

ViewSet视图集类不再限制视图方法名只允许get()、post()等这样的方法名,而是实现允许开发者根据自己的需求自定义方法名,例如 list() 、create() 等,然后在路由中将这些视图方法名与http请求进行绑定,调用

代码实现

创建一个新的子应用方便操作,并将此子应用进行注册:

python manage.py startapp viewset

模型类还是使用前面博客中的学生模型

views.py文件:

from rest_framework import serializersfrom rest_framework import statusfrom rest_framework.response import Responsefrom rest_framework.viewsets import ViewSetfrom .models import Students# 定义模型序列化器class StudentSerializers(serializers.ModelSerializer):class Meta:model = Studentsfields = '__all__'# viewset视图集class StudentsViewSet(ViewSet):# 获取一组数据def get_all_student(self, request):student = Students.objects.all()ser = StudentSerializers(instance=student, many=True)return Response(ser.data, status=status.HTTP_200_OK)# 创建数据def create_student(self, request):ser = StudentSerializers(data=request.data)if not ser.is_valid():return Response(ser.errors, status=status.HTTP_404_NOT_FOUND)ser.save()return Response(ser.data, status=status.HTTP_201_CREATED)# 获取单个数据def get_one_student(self, request, pk):student = Students.objects.get(pk=pk)ser = StudentSerializers(instance=student)return Response(ser.data, status=status.HTTP_200_OK)# 修改数据def update_student(self, request, pk):student = Students.objects.get(pk=pk)ser = StudentSerializers(instance=student, data=request.data)if not ser.is_valid():return Response(ser.errors, status=status.HTTP_404_NOT_FOUND)ser.save()return Response(ser.data, status=status.HTTP_201_CREATED)# 删除数据def delete_student(self, reqeust, pk):Students.objects.get(pk=pk).delete()return Response(status=status.HTTP_204_NO_CONTENT)

查看一组数据:

添加一条数据:

查看是否添加成功:

查看单个学生数据信息:

修改单个学生信息:查看是否修改成功:

删除单个学生信息:

查看是否删除成功:

GenericViewSet视图集

继承自GenericAPIView和ViewSetMixin,作用让视图集的视图代码变得更加通用,抽取独特代码,作为视图类的类属性

前面我们使用ViewSet通常并不方便,因为list、retrieve、create、update、destory等方法都需要自己编写,而这些方法与前面讲过的Mixin扩展类提供的方法同名,所以我们可以通过继承Mixin扩展类来复用这些方法而无需自己编写。但是Mixin扩展类依赖于GenericAPIView,所以还需要继承GenericAPIView

GenericViewSet就帮助我们完成了这样的继承工作,继承自GenericAPIView与ViewSetMixin,在实现了调用as_view()时传入字典(如{‘get’:‘list’})的映射处理工作的同时,还提供了GenericAPIView提供的基础方法,可以直接搭配Mixin扩展类使用

代码实现

结合我们前面博客讲解的模型扩展类,实现操作:

from rest_framework import serializersfrom rest_framework.mixins import ListModelMixin, CreateModelMixin, RetrieveModelMixin, UpdateModelMixin, \DestroyModelMixinfrom rest_framework.viewsets import GenericViewSetfrom .models import Students# 定义模型序列化器class StudentSerializers(serializers.ModelSerializer):class Meta:model = Studentsfields = '__all__'# 将模型扩展类与GenericViewSet视图集结合高效使用class StudentsGenericViewSet(GenericViewSet, ListModelMixin, CreateModelMixin, RetrieveModelMixin, UpdateModelMixin,DestroyModelMixin):queryset = Students.objectsserializer_class = StudentSerializers

实现的结果与上面viewset效果相同!!!

ModelViewSet视图集

上述完成的模型类继承了很多的扩展类,书写不方便,可以将这么多扩展类简写为:ModelViewSetModelViewSet继承自GenericViewSet,同时包括了ListModelMixin、RetrieveModelMixin、CreateModelMixin、UpdateModelMixin、DestoryModelMixin这些扩展类

ReadOnlyModelViewSet视图集

ReadOnlyModelViewSet承自GenericViewSet,同时包括了ListModelMixin、RetrieveModelMixin

路由Routers

对于视图集ViewSet,我们除了可以自己手动指明请求方式与动作action之间的对应关系外,还可以使用路由Routers来帮助我们快速实现路由信息绑定、调用

REST framework提供了两个router类

SimpleRouterDefaultRouter

使用方法

创建router对象,并注册视图集

from rest_framework import routersrouter = routers.DefaultRouter()router.register('students/', StudnetsView, basename='students')

注册视图集参数如下:

register(prefix, viewset, base_name)

prefix 该视图集的子路由前缀viewset 视图集base_name 路由别名的前缀,可用书路由的重定向

生成路由如下:

^studnets/$ name: stduents-list # 全部数据操作^studnets/{pk}/$ name: studnets-detail # 单个数据操作

添加路由

两种方法:

urlpatterns = [...]urlpatterns += router.urls

或者:

urlpatterns = [...path('^', include(router.urls))]

具体实现操作

from rest_framework.routers import DefaultRouterfrom . import views# 实例化路由类router = DefaultRouter()# 注册视图集router.register('students', views.StudentsGenericViewSet)# 将生成的路由集添加到urlpatterns中urlpatterns = []urlpatterns += router.urls

上述的操作,会将StudentsGenericViewSet的路由更换为自动生成的路由集,与不使用路由routers的实现效果相同

视图集中附加action的声明

在视图集中,如果想要让Router自动生成我们自定义动作的路由信息,需要使用rest_framework.decorators.action装饰器

以action装饰器装饰的方法名会作为action动作名,与list、retrieve等同

action装饰器可以接收两个参数:

methods: 声明该action对应的请求方式,列表

detail: 声明该action的路径是否与单一资源对应,True:单个数据操作,False:多个数据操作

路由生成如下:

路由前缀/< pk >/action方法名/

True 表示路径格式是xxx/< pk >/action方法名/

False 表示路径格式是xxx/action方法名/

url_path:声明该action的路由尾缀

简单举例如下:

from rest_framework import serializersfrom rest_framework.decorators import actionfrom rest_framework.response import Responsefrom rest_framework.viewsets import ModelViewSetfrom .models import Students# 定义模型序列化器class StudentSerializers(serializers.ModelSerializer):class Meta:model = Studentsfields = '__all__'class StudentsModelView(ModelViewSet):queryset = Students.objectsserializer_class = StudentSerializers@action(methods=['get'], detail=False, url_path='login')def login(self, request):"""登录"""return Response({'message': '成功!!'})

路由文件如下:

from rest_framework.routers import DefaultRouterfrom . import views# 实例化路由类router = DefaultRouter()# 注册视图集router.register('students', views.StudentsModelView)# 将生成的路由集添加到urlpatterns中urlpatterns = []urlpatterns += router.urls

如果觉得《python Django Rest_Framework框架 视图集与路由Routers详解(图文并茂版)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。