REST_FRAMEWORK之视图 View / 路由 Routers / 渲染器 Render

REST_FRAMEWORK重要组件--->View

7.视图(View)

  1. 过去写FBV/CBV很可能都是直接用的View类
  2. 现在写类增添了很多功能,会去使用APIView,且APIView是继承View的
  3. 复杂用:GenericAPIView
  4. 在settings中注册rest_framework方便调试内容、
from rest_framework.pagination import CursorPagination
class MyCursorPagination(CursorPagination):
    max_page_size = 5
    cursor_query_param = 'cursor'
    page_size_query_param = 'page_size'
    page_size = 2
    ordering = 'username'
    
from rest_framework import serializers
class PageSerianlizer(serializers.ModelSerializer):
    class Meta:
        model=models.Userinfo
        fields='__all__'
        
from rest_framework.generics import GenericAPIView
Class View(GenericAPIView):
	queryset=models.Userinfo.objects.all()
	Serializer_class=PageSerianlizer
	pagination_class=MyCursorPagination
	def get(self,request,*args,**kwargs):
		users=self.get_queryset()
		page_users=self.paginate_queryset(users)
		ser=self.get_serializer(instance=page_users,many=True)
		return Response(ser.data)   --->这里利用的是response.Response类
	
  1. GenericViewset 继承(ViewsetMixin,GenericAPIView)
from rest_framework.viewsets import GenericViewset
Class View1(GenericViewset):
	def get(self,request,*args,**kwargs):
		return Response("ok")
url----->re_path(r'^test/viewset/$',views.view1.as_view()), 报错 for example‘as_view({'get':'list'})’

因为处理的机制是不同的,因为GenericViewset是多继承的,进去会先去ViewsetMixin类中找as_view()方法,在内部做
一个对应的关系。当发出get请求的时候,会去as_view里面找get请求,然后去类中找相对应的函数。

方法:def get()换成 def list() 或者在url中as_view()函数中变成as_view({'get':'get'}).做一个手写的对应关系

Post同样也可以写成as_view({'post':'post'}),对应关系后的函数名必须和View视图里面的一样的,不然出错。

因为GenericViewset是继承GenericAPIView的所以将、3、路由改一下,其他的不用变。
  1. Mixins
from rest_framekwork import mixins
Class View1(mixins.ListModelMixin,mixins.CreateModelMixin,GenericViewset):
	queryset=models.Userinfo.all()
	Serializer_class=PageSerianlizer
	pagination_class=MyCursorPagination
url----->as_view({'get':'list','post':'create'}) 运行
因为view1是继承mixins.ListModelMixin,mixins.CreateModelMixin,在
mixins.ListModelMixin,mixins.CreateModelMixin中分别已经完成了对
list()和create()方法的编写,则只需要定义相对应的字段值就可以了。
mixins中还有RetrieveModelMixin/UpdateModelMixin/DestoryModelMixin类

如果只完成增删改查功能 -----> ModelViewset
如果只完成增删功能 —> mixins.ListModelMixin,mixins.CreateModelMixin,GenericViewset
复杂逻辑功能 —>GenericViewset / APIView

  1. ModelViewset
from rest_framework.viewsets import ModelViewset
Class view1(Modelviewset):
	queryset=models.Userinfo.objects.all()
	Serializer_class=PageSerianlizer
	pagination_class=MyCursorPagination

url—>re_path(r’^test/viewset/(?p\d+’)/$,) 加上了参数pk表示可以指定单条数据
因为加上了pk参数,所以get请求从list(列表全部)变成了retrieve(单条数据)

Views.View1.as_view({'get':'retrieve','delete':'destory',
'put':'update'(全部),'patch':‘partial_update’(部分)})

一个url应该写2个路由,分get请求变成’list’、‘retrieve’.
可以按照以前方法去判断url有无关键参数 (pk=id)

def get(self,request,*args,**kwargs):
	ret=kwargs.get('pk')
	if ret:               (有就是获取单条数据,没有就是list全部)

8.路由(Router)

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

rest_framework提供了两个router:SimpleRouter、DefaultRouter

from rest_framework import routers
 
router = routers.SimpleRouter()
router.register(r'users', models.Userinfo.as_view(), base_name='user')
                   前缀          视图                  路由名称的前缀

如上述代码会形成的路由如下:

^users/$    name:user-list
^users/{pk}/$   name: user-detail

可以通过这两种形式添加进路由里面:

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

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

视图集中包含附加action的

class BookInfoViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet):
    queryset = UserInfo.objects.all()
    serializer_class = UserInfoSerializer
 
    @action(methods=['get'], detail=False)
    def latest(self, request):
        ...
 
    @action(methods=['put'], detail=True)
    def read(self, request, pk):
    ...

此视图集会形成的路由:

^users/latest/$    name: user-latest
^users/{pk}/read/$  name: user-read

1) SimpleRouter

在这里插入图片描述

2)DefaultRouter
在这里插入图片描述

DefaultRouter与SimpleRouter的区别是,DefaultRouter会多附带一个默认的API根视图,返回一个包含所有列表视图的超链接响应数据。

from rest_framework import routers
router=routers.DefaultRouter()
router.register(r'***',View.view1)     #通过routers类自动生成4个url,完成增删改查功能
url(r'^(?p<version>[v1][v2]+)/',include(router.urls)),

Router会根据视图里面的增删改查方法来决定产生几个路由
比如继承了ModelViewset会自动生成4个url如果继承mixins.ListModelMixin,mixins.CreateModelMixin,GenericViewset就只会产生2个url。

9.渲染器(Render)

from rest_framework.renders import JsonRenderer,BrowsableAPIRenderer
from rest_framework.response import Response
Class TestView(APIView):
	def get(self,request,*args,**kwargs):
		.......
		return Response () 利用rest_framework中的response.Response返回。

其实可以在TestView中写入

renderer_classes=[JsonRenderer,BrowsableAPIRenderer]

意义为json类型返回和浏览器模式显示

也可以在全局settings中写入   "DEFAULT_RENDERER_CLASSES":['类路径',]

再URL上写上?format=json即用json类型显示数据。

用浏览器打开默认用BrowsableAPIRenderer显示。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`rest_framework.routers.DefaultRouter`是 Django REST framework 提供的一个路由器类,用于自动注册视图集(Viewset)并为它们生成 URL。 在 Django ,我们可以使用 `urls.py` 文件来定义 URL 和视图之间的映射关系。但是,随着 RESTful API 的流行,单独编写每个 URL 映射的代码变得非常繁琐。为此,Django REST framework 提供了 `DefaultRouter`,它可以自动将视图集注册到路由,并为每个视图集生成标准的 URL 模式。 使用 `DefaultRouter`,我们可以将视图集注册到路由,并将其分配给特定的 URL 前缀。例如,如果我们有一个视图集 `MyModelViewSet`,我们可以将其注册到路由,然后将其分配给 `/api/mymodel/` URL 前缀: ```python from rest_framework import routers from myapp.views import MyModelViewSet router = routers.DefaultRouter() router.register(r'mymodel', MyModelViewSet) urlpatterns = [ # ... path('api/', include(router.urls)), # ... ] ``` 这样,我们就可以通过以下 URL 访问 `MyModelViewSet` 定义的不同操作: - `GET /api/mymodel/`:获取 `MyModel` 对象列表 - `POST /api/mymodel/`:创建一个新的 `MyModel` 对象 - `GET /api/mymodel/{pk}/`:获取具有给定 ID 的 `MyModel` 对象的详细信息 - `PUT /api/mymodel/{pk}/`:更新具有给定 ID 的 `MyModel` 对象 - `DELETE /api/mymodel/{pk}/`:删除具有给定 ID 的 `MyModel` 对象 总之,`DefaultRouter` 简化了 Django REST framework URL 和视图之间的映射关系的配置,使得代码更加简洁和易于维护。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值