在django使用视图集和路由集

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
可观测可视化 Grafana 版,10个用户账号 1个月
简介: 【6月更文挑战第11天】本文介绍Viewsets是Django REST框架中将多个视图逻辑整合到单个类的工具,减少了重复代码。当项目API变得复杂且有重复模式时,考虑使用它们;否则,保持视图和URL模式的简洁性。

1 视图集 Viewsets

视图集是一种将多个相关视图的逻辑组合到单个类中的方法。换个描述方式,也就是一个视图集可以替换多个视图。

mandala曼德罗符号.png

比如,这里有四个视图:两个用于博客文章和两个给用户。通过使用ModelViewSet,示例代码展示了如何为博客文章和用户创建视图集。路由器(如SimpleRouter)与视图集配合,自动生成URL模式,简化路由配置。虽然初期学习曲线较陡峭,但视图集和路由器能提高代码效率,减少重复工作。

我们可以使用两个视图集来模仿相同的功能:一个用于博客和一个供用户使用.代码如下 posts/views.py:

    from django.contrib.auth import get_user_model
    from rest_framework import viewsets # new
    from .models import Post
    from .permissions import IsAuthorOrReadOnly
    from .serializers import PostSerializer, UserSerializer
    class PostViewSet(viewsets.ModelViewSet): # new
        permission_classes = (IsAuthorOrReadOnly,)
        queryset = Post.objects.all()
        serializer_class = PostSerializer

    class UserViewSet(viewsets.ModelViewSet): # new
        queryset = get_user_model().objects.all()
        serializer_class = UserSerializer

它既提供了列表视图又提供了为我们提供详细视图。

而且我们不再对于每个视图都重复相同的queryset和serializer_class。

现在服务停止了,因为缺少路由。 接下来配置路由.

2 路由集 Routers

路由集直接与视图集一起使用,以自动为我们生成URL模式。

我们目前posts/urls.py文件具有四个URL模式:两个用于博客文章,两个用于用户。

我们可以 不用为每个视图集采用一条路线。

因此,使用两个路由而不是四个URL路由模式。

 SimpleRouter  与 DefaultRouter

我们将使用SimpleRouter,但也可以创建自定义路由器以获得更多高级功能。 posts/urls.py

from django.urls import path
from rest_framework.routers import SimpleRouter
from .views import UserViewSet, PostViewSet
    router = SimpleRouter()
    router.register('users', UserViewSet, basename='users')
    router.register('', PostViewSet, basename='posts')
    urlpatterns = router.urls

重启服务,查看效果

python manager.py runserver 0.0.0.0:2000

可以看到现在称为“用户实例”而不是“用户详细信息”,并且内置了一个附加的“删除”选项到ModelViewSet。

可以自定义视图集,但这是一个重要的折衷,以换取更少的编写空间带有视图集的代码是默认设置,可能需要一些其他配置才能匹配您想要的。

但是,如果我们使用超级用户帐户(该博客文章的作者)登录,那么我们就拥有完整的读写编辑删除权限。

3 小结

视图集和路由器集是功能强大的抽象,可减少我们作为开发人员必须写的重复代码量,但是,这种简洁性是以牺牲初始学习曲线为代价的。

几次使用视图集和路由器,而不是视图和URL模式,这很奇怪,然后会感觉头疼。

因此,何时向项目添加视图集和路由器的决定是非常主观的。一个好的经验法则是从视图和URL开始。

如果发现项目API随着复杂性的增长而增长,自己一遍又一遍地重复相同的端点模式,然后查看是否可以使用视图集和路由器。否则在此之前,请保持简单。

目录
相关文章
|
17天前
|
Python
Django——视图
Django——视图
|
11天前
|
缓存 JSON API
在django项目中使用装饰器管理路由
【6月更文挑战第12天】本文介绍了Python装饰器在API管理中的应用,包括用于延迟计算、缓存和转换函数的装饰器。实践中,以Django Rest Framework为例,演示了如何使用装饰器定义GET、POST、PUT和DELETE请求的视
13 1
|
13天前
|
API 数据库 网络架构
在django中应用视图和路由集
【6月更文挑战第10天】 本文介绍viewsets`和`Routers`是Django REST framework中用于简化API视图和路由的工具。它们提供了一个抽象层,允许用更少的代码替代多个相关视图,并能自动生成URL。定义`UserList`和`UserDetail`视图集,分别用于列表和详情展示。
14 3
|
17天前
|
Python
Django——路由
Django——路由
|
17天前
|
Python
创建Django项目,实现视图,路由
创建Django项目,实现视图,路由
|
17天前
|
Python
初识Django,以及路由设置
初识Django,以及路由设置
|
1月前
|
XML JSON 前端开发
Django视图函数技巧,从入门到实战
Django视图函数技巧,从入门到实战
|
1月前
|
缓存 API 数据库
Django中的视图装饰器:扩展视图功能的利器
【4月更文挑战第15天】Django视图装饰器用于扩展视图功能,如权限验证、缓存控制和日志记录。它们是Python的高级特性,能不修改原始函数代码就添加新功能。Django提供内置装饰器,如`@login_required`(强制用户登录)、`@cache_page`(缓存视图输出)和`@csrf_protect`(CSRF保护)。同时,开发者可自定义装饰器,例如上面的`timing_decorator`用于记录视图执行时间。使用装饰器时要注意性能影响、执行顺序和参数处理。装饰器增强了代码复用性和可维护性。
|
1月前
|
缓存 数据库 开发者
Django视图中的缓存机制:提升页面加载速度
【4月更文挑战第15天】本文介绍了Django的缓存机制在提升页面加载速度中的作用。Django提供视图缓存和片段缓存,通过`cache_page`装饰器和`CacheMixin`实现视图级别的缓存,使用`{% cache %}`模板标签实现页面片段缓存。开发者可选择不同的缓存后端,并在设置中配置缓存参数。同时,注意合理控制缓存粒度、及时更新和管理缓存,以优化用户体验和网站性能。
|
Python
Django入门-3:视图和网址
Django入门-3:视图和网址
105 0
Django入门-3:视图和网址