Django API 开发:一个 Todo 应用的后端(下)

简介: 在接下来的两章中,我们将构建一个 Todo API 后端,然后将其与 React 前端连接。 我们已经制作了第一个 API,并回顾了 HTTP 和 REST 的抽象工作原理,但是您仍然可能还没有“完全”了解它们如何结合在一起。 在这两章的最后,您将学到。

Consuming the API

传统上使用 API 是一个挑战。 对于给定的 HTTP 响应或请求的正文和标头中包含的所有信息,根本没有很好的可视化效果。


取而代之的是,大多数开发人员使用命令行 HTTP 客户端(例如 cURL)(如上一章所述)或 HTTPie。


2012 年,第三方软件产品 Postman 投放市场,现在全球有数百万希望通过可视化,功能丰富的方式与 API 交互的开发人员使用。


但是 Django REST 框架最令人惊奇的事情之一是,它附带了功能强大的可浏览 API,我们可以立即使用它。 如果您发现需要使用 API 进行更多自定义,则可以使用 Postman 之类的工具。 但是通常内置的可浏览 API 绰绰有余。

Browsable API

现在让我们使用可浏览的 API 与我们的数据进行交互。 确保本地服务器正在运行。

(backend) $ python manage.py runserver


然后导航到http://127.0.0.1:8000/api/以查看我们的工作 API 列表视图端点。

网络异常,图片无法展示
|


该页面显示了我们先前在数据库模型中创建的三个待办事项。 API 终结点称为集合,因为它显示多个项目。


我们的可浏览 API 可以做很多事情。 首先,让我们看一下原始的 JSON 视图,即实际通过互联网传输的视图。 单击右上角的“ GET”按钮,然后选择 JSON。


网络异常,图片无法展示
|


如果您返回http://127.0.0.1:8000/api/的列表视图页面,我们可以看到其他信息。 回想一下,HTTP 动词 GET 用于读取数据,而 POST 用于更新或创建数据。


在“列表待办事项”下显示 GET / api /,它告诉我们我们在此端点上执行了 GET。 下方显示的是 HTTP 200 OK,这是我们的状态代码,一切正常。 最重要的是,它下面显示允许:GET,HEAD,OPTIONS。 请注意,由于这是一个只读端点,因此不包括 POST,我们只能执行 GET。


我们还为每个模型制作了一个 DetailTodo 视图。 这称为实例,在http://127.0.0.1:8000/api/1/上可见。


网络异常,图片无法展示
|


您也可以导航至以下端点:


CORS

我们需要做的最后一步是跨源资源共享(CORS)。 每当客户端与不同域(mysite.com 与 yoursite.com)或端口(localhost:3000 与 localhost:8000)上托管的 API 进行交互时,都会存在潜在的安全问题。


具体来说,CORS 要求服务器包含特定的 HTTP 标头,以允许客户端确定是否以及何时应允许跨域请求。


我们的 Django API 后端将与专用前端通信,该前端位于用于本地开发的不同端口上,并在部署后位于另一个域上。


处理此问题的最简单方法(以及 Django REST 框架建议的一种方法)是使用中间件,该中间件将根据我们的设置自动包括适当的 HTTP 标头。


我们将使用的软件包是 django-cors-header,可以轻松将其添加到我们现有的项目中。


首先使用 Control + c 退出我们的服务器,然后使用 Pipenv 安装 django-cors-headers。

(backend) $ pipenv install django-cors-headers==3.1.1


接下来,在三个位置更新我们的 settings.py 文件:


  • corsheaders添加到 INSTALLED_APPS
  • 在 MIDDLEWARE 中把 CorsMiddleware 添加到 CommonMiddleWare 的上方
  • 创建一个 CORS_ORIGIN_WHITELIST
# todo_project/settings.py
INSTALLED_APPS = [ 
    'django.contrib.admin', 
    'django.contrib.auth', 
    'django.contrib.contenttypes',
    'django.contrib.sessions', 
    'django.contrib.messages', 
    'django.contrib.staticfiles',
    # 3rd party
    'rest_framework', 
    'corsheaders', # new
    # Local
    'todos.apps.TodosConfig', 
]
MIDDLEWARE = [    
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'corsheaders.middleware.CorsMiddleware', # new   
    'django.middleware.common.CommonMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
# new
CORS_ORIGIN_WHITELIST = (
    'http://localhost:3000', 
    'http://localhost:8000',
)


将 corsheaders.middleware.CorsMiddleware 出现在正确的位置非常重要。 由于中间件是从上到下加载的,因此它位于 MIDDLEWARE 设置中的 django.middleware.common.CommonMiddleware 之上。 另外请注意,我们已将两个域列入白名单:localhost:3000 和 localhost:8000。 前者是 React 的默认端口,下一章将在前端使用它。 后者是默认的 Django 端口。

测试

您应该始终为 Django 项目编写测试。 前期花费的少量时间将为您节省大量的时间和以后的调试错误。 让我们添加两个基本测试,以确认标题和正文内容的行为符合预期。


打开 todos / tests.py 文件,并添加以下内容:

# todos/tests.py
from django.test import TestCase 
from .models import Todo
class TodoModelTest(TestCase):
    @classmethod
    def setUpTestData(cls):
        Todo.objects.create(title='first todo', body='a body here')
    def test_title_content(self):
        todo = Todo.objects.get(id=1)
        expected_object_name = f'{todo.title}'
        self.assertEquals(expected_object_name, 'first todo')
    def test_body_content(self):
        todo = Todo.objects.get(id=1)
        expected_object_name = f'{todo.body}'
        self.assertEquals(expected_object_name, 'a body here')


它使用 Django 的内置 TestCase 类。 首先,我们在 setUpTestData 中设置数据,然后编写两个新测试。 然后使用 python manage.py test 命令运行测试。

(backend) $ python manage.py test 
...
Ran 2 tests in 0.002s
OK


就是这样! 我们的后端现已完成。 确保服务器正在运行,因为我们将在下一章中使用它。

(backend) $ python manage.py runserver

总结

只需最少的代码,Django REST Framework 便允许我们从头开始创建 Django API。 我们从传统 Django 需要的唯一组件是 models.py 文件和 urls.py 路由。 views.py 和 serializers.py 文件完全是 Django REST Framework 特有的。


与上一示例不同,我们没有为该项目构建任何网页,因为我们的目标只是创建一个 API。 但是,在将来的任何时候,我们都可以轻松实现! 只需添加一个新视图,URL 和一个模板即可公开我们现有的数据库模型。


在此示例中,重要的一点是我们添加了 CORS 标头,并且仅将域 localhost:3000 和 localhost:8000 明确设置为可以访问我们的 API。 第一次开始构建 API 时,很容易混淆正确设置 CORS 标头。


我们可以做更多的配置,以后再做,但最终,创建 Django API 的过程是建立模型,编写一些 URL 路由,然后添加 Django REST Framework 的序列化程序和视图所提供的一些魔术。

相关文章
|
5天前
|
运维 数据可视化 测试技术
从混乱到清晰:API开发追踪工具实用技巧与工具配置完整拆解
API开发追踪工具是提升团队协作效率、实现接口全流程管理的关键。它整合任务看板、文档同步、版本控制与多角色协作,助力前后端及第三方高效对接。本文详解其核心功能、选型建议与落地实践,助你打造透明、规范的API协作体系。
|
2天前
|
数据采集 缓存 JSON
1688商品API全链路开发实践
本文介绍了对接1688开放平台的核心要点,涵盖OAuth2.0认证流程、商品列表接口调用技巧、高并发优化策略及异常处理清单。内容包含获取access_token示例、隐藏参数解析、数据清洗方案与缓存设计,并强调合规调用注意事项。
1688商品API全链路开发实践
|
人工智能 前端开发 测试技术
Apipost 与 Apifox 深度对比:2025全方位解析助力 API 开发的利器
本文对比了Apipost与Apifox两款API开发与管理工具在功能、使用场景及用户评价等方面的差异。Apipost在API设计、调试、文档管理、Mock服务、离线支持及AI能力方面表现更优,尤其适合大型企业级项目和高效率需求的团队。而Apifox则适用于小型项目或对功能要求较低的团队。综合来看,Apipost在多方面具备明显优势,是高效、高质量API开发的理想选择。
112 24
|
1天前
|
人工智能 自然语言处理 测试技术
Apipost 与 Apifox 深度对比:谁是 API 开发的最佳拍档?
在 API 开发中,Apipost 与 Apifox 是两款流行的国产工具。本文通过实际项目的对比发现,Apipost 在 AI 功能方面表现突出,如 AI 自动生成文档、测试用例、脚本等,显著提升开发效率。基础功能上,Apipost 也更全面,支持离线使用、OpenAPI 格式导出、多种协议及数据库字典导入,界面简洁易用,综合性能优于 Apifox。
30 5
|
2天前
|
消息中间件 缓存 JSON
亚马逊SP-API开发实战:商品数据获取与操作
本文介绍了亚马逊SP-API接入流程,包括开发者注册、OAuth2.0认证示例及核心商品接口的使用。涵盖商品信息查询、批量查询、限流规则与错误处理,并提供最佳实践建议,如使用AWS Lambda与SQS实现高效数据同步。
亚马逊SP-API开发实战:商品数据获取与操作
|
11天前
|
人工智能 前端开发 jenkins
2025 API 开发管理工具 Apipost 与 Apifox 全维度对比
本文深入对比了 Apipost 与 Apifox 两款 API 开发管理工具在设计、调试、文档管理、Mock 服务、离线支持、AI 能力及 CI/CD 集成等方面的优劣,全面评估其适用场景,为研发测试团队提供选型参考。
118 5
|
22天前
|
人工智能 安全 测试技术
Apipost vs Apifox:AI 能力决定 API 开发管理工具的真正价值
2025年,AI技术深度融入企业运营,提升生产力与竞争力。在API开发工具领域,Apipost与Apifox在AI能力上有显著差异。Apipost实现AI全流程覆盖,从文档生成、测试、开发辅助到协作优化,大幅提升效率并降低维护成本;而Apifox主要聚焦文档优化,功能较基础。在团队协作、安全合规、企业适配等方面,Apipost亦表现更优,尤其适合追求高效、安全与全流程自动化的团队。
55 1
|
24天前
|
Java API 网络架构
基于 Spring Boot 框架开发 REST API 接口实践指南
本文详解基于Spring Boot 3.x构建REST API的完整开发流程,涵盖环境搭建、领域建模、响应式编程、安全控制、容器化部署及性能优化等关键环节,助力开发者打造高效稳定的后端服务。
105 1
|
17天前
|
缓存 JSON 算法
电商数据API开发实战经验分享(实操)
本文分享了一位电商开发者在API实战中的经验总结,涵盖签名生成、数据解析、缓存策略及测试方案,附完整代码示例,助你避开开发“深坑”。
|
23天前
|
JavaScript API 开发者
Uniapp开发鸿蒙应用教程之选项式api和组合式api
本文介绍了在Uniapp开发鸿蒙应用时,如何通过选项式API和组合式API进行数据操作。以修改年龄值为例,对比展示了两种API的代码结构与区别,并重点演示了组合式API中更简洁、灵活的写法,帮助开发者理解并掌握现代Vue开发模式。#鸿蒙三方框架 #Uniapp