- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
这篇文章会详细介绍Django REST Framework的核心组成部分,包括Serializers、ViewSets、Routers、权限和认证系统以及测试和调试工具。文章从基础开始,逐步深入,旨在帮助读者掌握使用Django REST Framework构建复杂API的技能.
Django REST框架,通常简称为DRF,是一个强大而灵活的Web API工具包。使用DRF,开发者可以快速构建可扩展的、可维护的RESTful API服务。DRF提供了一整套的工具和模块,包括认证、权限、序列化、视图、路由等,帮助我们处理许多Web开发中常见的问题.
DRF的主要目的是使Django应用程序能够轻松地构建和管理API。此外,DRF还关注API的可浏览性和易用性,使得开发者可以通过Web浏览器访问API,并进行交互.
虽然Django REST框架和其他Python的Web框架(如Flask)有着共同的目标,即帮助开发者构建Web应用,但是它们在设计理念、功能和使用场景上有所不同.
# Django view示例
from django.http import HttpResponse
def hello_world(request):
return HttpResponse("Hello, World!")
# Flask view示例
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
功能 :DRF提供了许多内建的功能,如认证、权限、序列化、反序列化、视图、路由等,这些功能都经过了精心设计,使得开发者可以更加专注于业务逻辑,而不是基础设施的建设。而Flask则更加注重灵活性,它允许开发者选择和定制所需要的功能.
使用场景 :如果你的项目需要快速构建RESTful API,或者需要与Django的其他部分(如ORM、模板系统等)紧密集成,那么DRF可能是一个更好的选择。如果你需要更大的灵活性,或者只需要构建一个简单的Web服务,那么Flask可能更合适.
在开始使用Django REST框架前,首先需要安装和配置相关环境。假设你已经安装了Python和Django,你可以使用pip来安装DRF:
pip install djangorestframework
然后,需要将 rest_framework 添加到你的Django项目的 INSTALLED_APPS 配置中:
# settings.py
INSTALLED_APPS = [
...,
'rest_framework',
]
这样,我们就成功安装和配置好了Django REST框架,接下来可以开始构建我们的第一个DRF项目了.
在本教程中,我们将创建一个简单的API,用于管理图书信息。首先,我们需要创建一个新的Django app:
python manage.py startapp books
然后,我们需要在 books app中定义我们的模型:
# models.py
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.CharField(max_length=100)
published_date = models.DateField()
def __str__(self):
return self.title
接着,我们需要定义对应的Serializer和Viewset:
# serializers.py
from rest_framework import serializers
from .models import Book
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = ['id', 'title', 'author', 'published_date']
# views.py
from rest_framework import viewsets
from .models import Book
from .serializers import BookSerializer
class BookViewSet(viewsets.ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
最后,我们需要在 urls.py 中添加路由:
# urls.py
from django.urls import include, path
from rest_framework.routers import DefaultRouter
from .views import BookViewSet
router = DefaultRouter()
router.register(r'books', BookViewSet)
urlpatterns = [
path('', include(router.urls)),
]
以上就是一个基本的Django REST框架项目的搭建过程。在这个例子中,我们创建了一个可以进行CRUD操作的图书信息API.
在上面的例子中,我们使用了DRF的三个主要组件:Serializers, Viewsets, 和 Routers。以下是它们的简单介绍:
Serializers :负责将复杂的数据类型(如Django模型实例)转换为可以被渲染成JSON、XML等格式的Python数据类型。同时,也可以用于解析上述格式的数据,转换为复杂的数据类型.
Viewsets :一个用于封装视图逻辑的类。与Django的类视图类似,但提供了更多与REST相关的功能,例如默认的GET、POST、PUT、PATCH和DELETE方法.
Routers :负责自动生成URL路由。与Django的URLconf类似,但是对于DRF的Viewsets有更好的支持,可以根据Viewset中的方法自动创建对应的路由.
在接下来的部分,我们将深入探讨这三个组件的工作原理和使用方法.
在Django REST框架中,Serializers扮演着至关重要的角色。它们负责转换复杂的数据类型,如Django模型实例或者复杂的查询集,使得它们可以被渲染为像JSON或者XML这样的可传输格式。同时,Serializers也负责在数据接收时完成反序列化的工作,将接收的数据转换为Python数据类型.
Serializer类似于Django的Form和ModelForm类,但它们不仅包含了简单的数据验证功能,还包含了复杂的类型转换功能。它们可以对复杂的数据类型进行序列化(转换为Python基本数据类型),也可以对已序列化的数据进行反序列化(转换为复杂的数据类型).
# serializers.py
from rest_framework import serializers
from .models import Book
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = ['id', 'title', 'author', 'published_date']
在上述例子中, BookSerializer 就是一个Serializer,它继承自ModelSerializer类,用于序列化和反序列化Book模型实例.
当序列化对象时,Serializers首先将对象转换为Python内置的数据类型,然后再将这些数据类型转换为可传输的格式。反序列化时,Serializers会进行相反的过程,先将接收的数据转换为Python内置的数据类型,然后再将这些数据类型转换为复杂的数据类型.
以下是一个简单的例子,演示了如何使用 BookSerializer 进行序列化和反序列化:
# 使用Serializer进行序列化
book = Book.objects.get(id=1)
serializer = BookSerializer(book)
print(serializer.data)
# 输出:{'id': 1, 'title': 'Django for Beginners', 'author': 'William S. Vincent', 'published_date': '2022-07-01'}
# 使用Serializer进行反序列化
data = {'title': 'REST API with Django', 'author': 'William S. Vincent', 'published_date': '2023-07-01'}
serializer = BookSerializer(data=data)
if serializer.is_valid():
book = serializer.save()
print(book)
# 输出:<Book: REST API with Django>
Serializers最常见的使用场景就是在视图中,用于序列化和反序列化视图处理的数据.
例如,我们可以在视图中使用Serializer,来处理客户端发来的POST请求,创建新的图书:
# views.py
from rest_framework import status
from rest_framework.response import Response
from rest_framework.views import APIView
from .models import Book
from .serializers import BookSerializer
class BookList(APIView):
def post(self, request):
serializer = BookSerializer(data=request.data)
if serializer.is_valid():
book = serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
在上述例子中,我们在视图的POST方法中使用了 BookSerializer ,将接收的数据反序列化为Book模型实例,并保存到数据库中.
Serializers的使用非常广泛,它们不仅可以用于基本的数据验证和转换,还可以用于复杂的场景,如处理嵌套的数据、自定义字段、动态字段等。在掌握了基本用法后,你可以根据你的需求,进一步探索Serializers的各种高级用法.
在Django REST框架中,ViewSets是一个重要的组件,它提供了一种高级的视图抽象,使我们能够更方便地实现基于RESTful原则的API接口.
ViewSet可以看作是多个视图的集合。在Django REST框架中,ViewSet类似于Django中的类视图(Class-Based Views),但是它提供了更多的默认行为和更广泛的功能,比如默认实现的GET、POST、PUT、PATCH和DELETE操作.
# views.py
from rest_framework import viewsets
from .models import Book
from .serializers import BookSerializer
class BookViewSet(viewsets.ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
在上述例子中, BookViewSet 就是一个ViewSet。它继承自 ModelViewSet 类,为 Book 模型实现了一整套的CRUD操作.
ViewSet的工作原理与Django的类视图非常相似。它将HTTP方法映射到ViewSet中的相应方法,比如GET请求会映射到 list 或者 retrieve 方法,POST请求会映射到 create 方法,PUT和PATCH请求会映射到 update 方法,DELETE请求会映射到 destroy 方法.
以下是一个简单的例子,演示了如何使用 BookViewSet 处理GET和POST请求:
# 使用ViewSet处理GET请求
from rest_framework.test import APIRequestFactory
factory = APIRequestFactory()
request = factory.get('/books/')
response = BookViewSet.as_view({'get': 'list'})(request)
print(response.status_code)
# 输出:200
# 使用ViewSet处理POST请求
request = factory.post('/books/', {'title': 'Django REST Framework', 'author': 'Tom Christie', 'published_date': '2023-07-01'})
response = BookViewSet.as_view({'post': 'create'})(request)
print(response.status_code)
# 输出:201
ViewSet最常见的使用场景就是在URLconf中,用于为API接口创建URL路由.
例如,我们可以在URLconf中使用 BookViewSet ,来创建图书API的URL路由:
# urls.py
from django.urls import include, path
from rest_framework.routers import DefaultRouter
from .views import BookViewSet
router = DefaultRouter()
router.register(r'books', BookViewSet)
urlpatterns = [
path('', include(router.urls)),
]
在上述例子中,我们在URLconf中注册了 BookViewSet ,Django REST框架会自动为 BookViewSet 创建一套URL路由,对应到其定义的各种操作.
ViewSet的使用非常灵活,它们不仅可以用于实现基本的CRUD操作,还可以用于实现复杂的逻辑,如权限控制、过滤、分页等。在掌握了基本用法后,你可以根据你的需求,进一步探索ViewSet的各种高级用法.
在 Django REST 框架中,Routers 为视图集 (ViewSets) 提供了一种简洁的方式来创建和管理 URL 配置。使用 Routers,我们可以快速创建并配置 URL,减少重复的工作.
Router 可以自动地为视图集创建 URL 配置,它为每个视图集提供了一套标准的增删改查(CRUD)操作的 URL 配置。Router 的使用可以极大地提高开发效率,避免了手动创建每个 URL 的繁琐工作.
以下是一个简单的使用 Router 的例子:
# urls.py
from django.urls import include, path
from rest_framework.routers import DefaultRouter
from .views import BookViewSet
router = DefaultRouter()
router.register(r'books', BookViewSet)
urlpatterns = [
path('', include(router.urls)),
]
在上述例子中,我们使用 DefaultRouter 创建了一个 router,然后调用其 register 方法注册了 BookViewSet。这会自动为 BookViewSet 创建一套标准的 URL 配置.
当你向 Router 注册一个视图集时,Router 会自动为这个视图集创建一套 URL 配置。这套 URL 配置对应到视图集的各个方法,如 list、create、retrieve、update 和 destroy.
router = DefaultRouter()
router.register(r'books', BookViewSet)
在上述例子中,router 会为 BookViewSet 创建以下的 URL 配置:
/books/
:对应到 BookViewSet
的 list
和 create
方法,分别处理 GET 和 POST 请求; /books/{pk}/
:对应到 BookViewSet
的 retrieve
、 update
和 destroy
方法,分别处理 GET、PUT/PATCH 和 DELETE 请求。 在 Django REST 框架中,有两种常见的 Router: DefaultRouter 和 SimpleRouter 。 DefaultRouter 提供了一套包含额外的浏览器界面的路由配置,而 SimpleRouter 则提供了一套简单的基础路由配置.
Router 的使用非常灵活,你可以根据需要注册任意数量的视图集,也可以在不同的 Django app 中使用不同的 Router。在掌握了基本用法后,你还可以深入研究如何自定义 Router,如自定义 URL 配置,自定义 URL 名称等.
在构建API时,权限和认证是非常重要的一环,它们决定了用户能否访问你的API以及用户可以做什么。Django REST Framework提供了一套完善的权限和认证系统,让你可以轻松地控制用户的访问权限.
认证是确定用户身份的过程。Django REST Framework支持多种认证方式,如SessionAuthentication、TokenAuthentication、BasicAuthentication等.
以下是如何在视图中使用TokenAuthentication的示例:
# views.py
from rest_framework.authentication import TokenAuthentication
from rest_framework.permissions import IsAuthenticated
from rest_framework import viewsets
from .models import Book
from .serializers import BookSerializer
class BookViewSet(viewsets.ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
authentication_classes = [TokenAuthentication]
permission_classes = [IsAuthenticated]
在这个例子中,我们为BookViewSet设置了authentication_classes属性,指定了使用TokenAuthentication。当用户请求BookViewSet时,Django REST Framework会检查请求的HTTP头部是否包含有效的令牌,以确定用户的身份.
权限是决定已经认证的用户可以做什么的规则。Django REST Framework提供了多种权限管理方式,如IsAuthenticated、IsAdminUser、IsAuthenticatedOrReadOnly等.
在上述例子中,我们为BookViewSet设置了permission_classes属性,指定了使用IsAuthenticated。这意味着只有认证过的用户才可以访问BookViewSet.
除了使用Django REST Framework提供的认证和权限管理方式,你还可以自定义认证和权限。自定义认证和权限可以让你更灵活地控制用户的访问权限.
以下是一个自定义权限的例子,这个权限类只允许作者访问他们自己的图书:
# permissions.py
from rest_framework import permissions
class IsAuthor(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
return obj.author == request.user
然后你可以在视图中使用这个自定义权限:
# views.py
from .permissions import IsAuthor
# 其他导入...
class BookViewSet(viewsets.ModelViewSet):
# 其他代码...
permission_classes = [IsAuthenticated, IsAuthor]
在这个例子中,IsAuthor权限类会对每个请求进行检查,如果请求的用户不是图书的作者,那么请求将被拒绝.
测试和调试是保证代码质量的重要步骤。Django REST Framework提供了一套用于测试和调试API的工具.
Django REST Framework集成了Django的测试框架,并提供了一些额外的功能用于测试API。你可以使用Django REST Framework的APIClient类来模拟API请求,然后检查响应.
以下是一个测试示例:
# tests.py
from django.urls import reverse
from rest_framework import status
from rest_framework.test import APITestCase, APIClient
from .models import Book
class BookTests(APITestCase):
def setUp(self):
self.client = APIClient()
self.book = Book.objects.create(title='Test Book', author='Test Author')
def test_get_book(self):
url = reverse('book-detail', kwargs={'pk': self.book.pk})
response = self.client.get(url)
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(response.data['title'], 'Test Book')
self.assertEqual(response.data['author'], 'Test Author')
在这个例子中,我们首先在setUp方法中创建了一个APIClient和一个Book实例。然后,在test_get_book方法中,我们使用APIClient发出GET请求,然后检查响应的状态码和数据.
Django REST Framework提供了一个浏览器界面用于调试API。你可以在浏览器中直接访问API,查看响应数据,或者发出POST、PUT、PATCH和DELETE请求。浏览器界面非常直观,是调试API的好工具.
要使用浏览器界面,你只需要在settings.py中启用它:
# settings.py
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': [
'rest_framework.renderers.BrowsableAPIRenderer',
'rest_framework.renderers.JSONRenderer',
# 其他渲染器...
]
}
在上述设置中,我们启用了BrowsableAPIRenderer,这将启用浏览器界面。你现在可以在浏览器中访问API了.
有许多工具可以帮助你调试API,如Postman、Insomnia等。这些工具可以模拟各种HTTP请求,查看请求和响应的详细信息,以及保存和组织API请求。如果你需要进行复杂的API调试,这些工具可能会很有帮助.
虽然测试和调试可能会花费一些时间,但它们是保证代码质量的关键。在编写代码时,不要忘记写测试和进行调试.
至此,我们对Django REST Framework进行了一次深入的概览。我们开始时介绍了Django REST Framework的基础知识,然后深入学习了Serializers、ViewSets和Routers。我们还讨论了权限和认证系统,以及如何进行测试和调试.
Django REST Framework提供了许多强大的工具,使得构建复杂的API变得轻松。然而,掌握这些工具需要时间和实践。我希望这篇文章能帮助你开始你的Django REST Framework之旅.
最后,我想重申一下我们在文章中讨论的一些关键点:
如有帮助,请多关注 个人微信公众号:【Python全视角】 TeahLead_KrisChang,10+年的互联网和人工智能从业经验,10年+技术和业务团队管理经验,同济软件工程本科,复旦工程管理硕士,阿里云认证云服务资深架构师,上亿营收AI产品业务负责人.
最后此篇关于深入探索DjangoRestFramework的文章就讲到这里了,如果你想了解更多关于深入探索DjangoRestFramework的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
接上篇 通过一个示例形象地理解C# async await 非并行异步、并行异步、并行异步的并发量控制 前些天写了两篇关于C# async await异步的博客, 第一篇博客看的人多,点
前言 在 SwiftUI 中,我们可以通过添加不同的交互来使我们的应用程序更具交互性,这些交互可以响应我们的点击,点击和滑动。 今天,我们将回顾SwiftUI基本手势:
今年我一直在想,2022年我想做些什么,做哪方面的改变,这周末在家终于想到了! 2021 轻描淡写 年底就一直想对2021年写一篇总结的,起码不得写个千八百字,可是思来想去不知道怎么写,直到最后都没想
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
在 Eclipse 中使用 Java 进行开发时,它非常方便:您可以像自己一样附加源代码并探索核心 Java 代码。在 Visual Studio 中,我知道只有在调试时才能查看 .net 源代码(我
我正在尝试创建自己的字符串数据类型,谁能告诉我 typedef 和初始化做错了什么。 #include #include typedef char string[10]; int main(){
我期待开发一些东西来分析在服务器上运行的应用程序的 JVM 线程,要求如下: 访问在单独应用程序中运行的所有线程 打印线程栈 了解事件的详细信息 - 记录执行时间和方法详细信息(在特定线程中执行) 我
是否可以探索 Android 内部存储?我需要这个用于调试目的,以帮助我的开发工作。 最佳答案 您可以在模拟器上,或在 Root设备上。只是 adb shell 连接设备,然后从那里导航。 关于and
我有一个使用大量外键的 innoDB 表,但我们只想从中查找一些基本信息。 我做了一些研究,但还是迷路了。 如何判断我的主机是否有 Sphinx已经安装了吗?我没看到作为表格存储的选项方法(即 inn
我有一个创建列表的 GWT 代码(作为结果的网格),我将样式设置为 CSS 类,如 .test tr { height: 26px; } 现在...如果在渲染未完成或网格没有元素时我需要从代码
我需要使用 Javascript 和 HTML 为 Rally 敏捷工具开发一个 View 。我没有处理过在我作为开发人员的新职业中经常使用的网络语言。 我只是在探索他们的 API,但不知道如何探索他
我想了解 Hadoop 而不是一个黑盒子。我想探索 Hadoop 代码本身。我怎样才能不从主干下载 bundle ,我应该从哪里开始?任何帮助都会很有帮助谢谢舒佳特 最佳答案 Hadoop 代码在 S
想象一下这样的情况。您获得了一些遗留代码或获得了一些新框架。您需要尽快调查并了解如何使用此代码。没有机会向以前的开发人员寻求帮助。什么是最佳实践/方法/方式/步骤/工具(首选 .NET Framewo
我注意到我的 git 存储库中的某些 makefile 缺少变量定义的问题,我想搜索所有提交历史以查找我的变量 TESTDIR 在变更集中出现的位置 我该怎么做? 干杯 最佳答案 你可以使用 git
有什么方法可以探索 GO 包吗? 在 java 中,我使用“javap java.lang.String”命令来查看类内部的方法。像这样,有没有命令是他们用 GO 语言写的? 我在谷歌中搜索了相同的内
我注意到 docker 我需要了解容器内发生了什么或其中存在哪些文件。一个示例是从 docker 索引下载图像 - 您不知道图像包含什么,因此无法启动应用程序。 理想的情况是能够通过 ss
近日,华为 分析服务 6.9.0版本发布,正式上线 探索能力 。开发者可自由定义与配置分析模型,支持报告实时预览,数据洞察体验更加灵活与便捷. 新上线的探索能力中,有漏斗分析、事件归因、会话路径分析
我有一个 4 列的 excel 2010 电子表格。 A 列:我销售的产品的 UPC 代码列表。大约300行。 B 列:公式(稍后会详细介绍) C 列:另一个 UPC 代码列表。这些 UPC 代码大约
我有 3 个表格如下: CREATE TABLE USER_STATUS ("UID" varchar2(7), "STAT_ID" varchar2(11)) ; INSERT ALL IN
有什么方法可以探索 java 脚本对象(如 telerik 菜单或任何其他第 3 方对象)的属性和/或功能?我可以通过调试和破坏然后在 watch 中添加对象或在 VS 中使用智能感知来实现。 我使用
我是一名优秀的程序员,十分优秀!