在django中应用视图和路由集

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
可观测可视化 Grafana 版,10个用户账号 1个月
简介: 【6月更文挑战第10天】 本文介绍viewsets`和`Routers`是Django REST framework中用于简化API视图和路由的工具。它们提供了一个抽象层,允许用更少的代码替代多个相关视图,并能自动生成URL。定义`UserList`和`UserDetail`视图集,分别用于列表和详情展示。

简介

本文档介绍了如何添加列出所有用户和单个用户的新端点,涉及创建新的序列化器、视图集和URL路由。首先,通过get_user_model引用User模型并创建UserSerializer。接着,在django中要从视图和URL切换到视图集,可以减少代码量,如在config/urls.py中所示。

1 视图集和路由集 Viewsets and Routers

  • viewsets

         rest_framework 的api视图开发工具
    
  • routers

          rest_framework的 api 路由开发工具
    

它们是视图和URL之上的附加抽象层。首要的好处是单个视图集可以替换多个相关视图。而且路由器可以自动为开发人员生成网址。

如何从视图和URL切换到视图集?路由器可以实现相同的功能,而所需的功能要少得多代码。config/urls.py 现有的路由

     admin/     
    api/ 
    api/auth/
    api/v1/
    api/v1/dj-rest-auth/
    api/v1/dj-rest-auth/registration/ 
    api/v1/dj-rest-auth/
    api/v1/dj-rest-auth/registration/

前两个端点是我们创建的,而dj-rest-auth提供了另外五个端点。

现在让我们添加两个附加端点以列出所有用户和单个用户。

2 基本步骤

传统的Django有一个内置的User模型类,我们在认证一章的前面的版本中已经使用过。因此,我们不需要创建新的数据库模型。

相反,我们只是需要连接新的端点。此过程始终涉及以下三个步骤

     新的 serializer 类
     新的 views 视图集
     为每个端点的新的 URL 路由集

修改serializers,添加新的 用户类, posts/serializers.py

    from django.contrib.auth import get_user_model # new
    from rest_framework import serializers
    from .models import Post
    class PostSerializer(serializers.ModelSerializer):
        class Meta:
            model = Post
            fields = ('id', 'author', 'title', 'body', 'created_at',)
    class UserSerializer(serializers.ModelSerializer): # new
        class Meta:
            model = get_user_model()
            fields = ('id', 'username',)

这里将使用了get_user_model来引用User模型,在Django中,实际上有三种不同的方式来引用User模型。

通过使用get_user_model,我们可以确保我们引用的是正确的用户模型,无论它是否是默认用户或自定义用户模型,通常在新的Django项目中定义。

3 配置的过程

我们需要为每个端点定义视图。首先将UserSerializer添加到列表中。

然后创建列出所有用户的UserList类和UserDetail类提供单个用户的详细视图。就像我们的帖子视图一样,在这里我们可以使用ListCreateAPIView和RetrieveUpdateDestroyAPIView。

我们还需要参考用户通过get_user_model进行建模,以便将其导入到第一行。

修改视图, posts/views.py

    from django.contrib.auth import get_user_model # new
    from .serializers import PostSerializer, UserSerializer 

    class UserList(generics.ListCreateAPIView): # new

        queryset = get_user_model().objects.all()
        serializer_class = UserSerializer

    class UserDetail(generics.RetrieveUpdateDestroyAPIView): 

        queryset = get_user_model().objects.all()
        serializer_class = UserSerializer

”视图和“用户”视图都具有完全相同的queryset和serializer_class。也许可以通过某种方式将它们组合在一起保存代码。

修改 posts/urls.py 应用路由

urlpatterns = [path('users/', UserList.as_view()), 

        path('users/<int:pk>/', UserDetail.as_view()), # new
        ...]

确保本地服务器仍在运行,并跳至可浏览的API.

    http://127.0.0.1:2000/api/v1/users/

3 小结

在具有多个端点的大型项目中,这意味着开发人员可以编写更少的代码。可以说,对于有经验的开发人员来说也更好理解。

这是一个共同的特征,在许多API开发中有这个需求,这将使我们更加清楚为什么将我们的视图和URL重构为视图集和路由器。

目录
相关文章
|
17天前
|
Python
Django——视图
Django——视图
|
14天前
|
API 数据安全/隐私保护 网络架构
在django3中配置应用的权限
【6月更文挑战第9天】该文档介绍了Django REST Framework的权限管理。总结来说,本文介绍如何设置严格项目权限和如何通过自定义权限控制对特定资源的访问。
29 10
在django3中配置应用的权限
|
15天前
|
存储 JSON API
在django3应用中使用现代的JWT鉴权
【6月更文挑战第8天】本文介绍流行的鉴权方式,JSON Web Tokens (JWT) 是一种验证JSON数据所有者的机制,它是一个编码的、安全的字符串,包含可信任的数据且能加密签名。无状态的令牌认证允许客户端存储令牌并将其在每次请求。
26 8
在django3应用中使用现代的JWT鉴权
|
16天前
|
存储 安全 API
在django中创建项目时应用基础鉴权
【6月更文挑战第7天】本文探讨了在django中的API权限管理,即用户认证的两种方法:基础认证和会话认证。Django REST Framework默认使用会话认证,但也提供基础、令牌和JWT等其他选项。根据项目需求,应谨慎选择适合的认证方案。
63 3
在django中创建项目时应用基础鉴权
|
9天前
|
存储 流计算 Python
使用Django构建即时通讯应用的最简单方法
使用Django构建即时通讯应用的最简单方法
|
11天前
|
存储 安全 数据库
在django应用中使用会话提示用户体验
【6月更文挑战第12天】该文档介绍了Django中如何利用会话(session)为用户提供定制体验。通过会话,开发者能更好地管理和个性化匿名用户的网站体验。参考[Django官方文档](https://docs.djangoproject.com/en/4.0/top
20 2
|
12天前
|
API 网络架构 Python
在django使用视图集和路由集
【6月更文挑战第11天】本文介绍Viewsets是Django REST框架中将多个视图逻辑整合到单个类的工具,减少了重复代码。当项目API变得复杂且有重复模式时,考虑使用它们;否则,保持视图和URL模式的简洁性。
18 3
|
11天前
|
缓存 JSON API
在django项目中使用装饰器管理路由
【6月更文挑战第12天】本文介绍了Python装饰器在API管理中的应用,包括用于延迟计算、缓存和转换函数的装饰器。实践中,以Django Rest Framework为例,演示了如何使用装饰器定义GET、POST、PUT和DELETE请求的视
13 1
|
12天前
|
缓存 运维 Serverless
Serverless 应用引擎产品使用合集之基于django应用模板创建的FC,如何配置数据库
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
17天前
|
Python
Django——路由
Django——路由