百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

使用 Django Rest Framework 在 10 分钟内开发 API

itomcoil 2025-03-01 14:18 7 浏览

#记录我的9月生活#

在当今快速发展的开发世界中,能够快速构建可靠、可扩展且易维护的 API 是一项必备技能。Django Rest Framework(DRF)提供了一个强大而灵活的工具包,可以快速构建 Web API。本指南将带您从头开始,在不到 10 分钟内使用 DRF 创建一个 API。无论您是经验丰富的开发人员还是 Django 新手,本教程将帮助您快速掌握最佳实践。

1. Django Rest Framework 简介

Django Rest Framework(DRF)是一个构建在 Django 之上的开源框架,能够轻松创建 RESTful API。它简化了处理 HTTP 请求、数据库交互以及返回 JSON 等格式数据的复杂性。借助 DRF 的灵活模块化设计,您可以根据需要扩展和自定义框架,而无需重写现有功能。

2. 设置开发环境

在开始编写代码之前,我们需要准备好开发环境。确保系统已准备好运行 Django 项目。

2.1 安装 Python

如果尚未安装 Python,请访问 python.org 并下载最新的稳定版本(Python 3.10 或更高版本)。在安装过程中,确保将 Python 添加到系统的 PATH 中。

通过以下命令验证安装是否成功:

python --version

2.2 创建虚拟环境

使用虚拟环境可以将项目依赖与系统隔离开来,保持项目的独立性。通过以下命令创建虚拟环境:

python -m venv drf_env

激活虚拟环境:

  • macOS/Linux 用户:
source drf_env/bin/activate
  • Windows 用户:
drf_env\Scripts\activate

此时,终端提示符应显示虚拟环境的名称,表明已成功激活。

2.3 安装 Django 和 Django Rest Framework

激活虚拟环境后,运行以下命令安装 Django 和 DRF:

pip install django djangorestframework

这将安装 Django 和 DRF,提供构建 API 所需的库。

3. 创建 Django 项目

现在,开发环境已经准备好,我们可以创建一个 Django 项目来容纳我们的 API。

3.1 启动新项目

运行以下命令启动一个新项目:

django-admin startproject quickapi
cd quickapi

此命令将为您的 Django 项目创建基本结构,包括 settings.pyurls.py 等重要文件。

3.2 创建 Django 应用

Django 项目通常由应用程序(app)组成,应用是功能的模块化单元。在本例中,我们将创建一个名为 books 的应用:

python manage.py startapp books

随后,别忘了在 settings.py 中将该应用注册到 INSTALLED_APPS 中:

# 在 quickapi/settings.py 中
INSTALLED_APPS = [
    # 默认的 Django 应用...
    'rest_framework',  # 添加 DRF 到已安装的应用
    'books',           # 添加 books 应用
]

4. 定义 API 模型

我们的 API 需要处理数据,在 Django 中,数据由模型表示。模型是直接映射到数据库表的 Python 类。

4.1 创建一个简单的模型

books/models.py 中定义一个简单的书籍模型:

from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=100)
    publication_date = models.DateField()

    def __str__(self):
        return self.title

这里我们创建了一个 Book 模型,包含三个字段:titleauthorpublication_date,这些字段将在数据库中存储。

4.2 应用迁移

要将模型保存到数据库中,我们需要创建并应用迁移。迁移是 Django 跟踪模型更改并将其反映到数据库架构中的方式。运行以下命令:

python manage.py makemigrations
python manage.py migrate

这将为 Book 模型创建数据库架构。

5. 序列化模型

要通过 API 公开数据,我们需要将其转换(即 序列化)为 JSON 等格式。DRF 提供了一个强大的序列化框架来处理这项工作。

5.1 创建序列化类

books/serializers.py 中创建一个 BookSerializer 类,将 Book 模型转换为 JSON:

from rest_framework import serializers
from .models import Book

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = ['id', 'title', 'author', 'publication_date']

此序列化器将处理将 Book 模型实例转换为 JSON 格式,并验证传入的数据。

5.2 理解序列化字段

默认情况下,ModelSerializer 会自动包含模型中的所有字段,除非另行指定。在此例中,我们明确定义了 idtitleauthorpublication_date。序列化字段可确保数据在通过 API 公开时得到验证。

6. 构建 API 视图

在 Django 中,视图负责处理传入的请求、与数据库交互并返回响应。DRF 提供了多种工具来简化这一过程。

6.1 使用通用视图

books/views.py 中创建一个简单的视图,允许列出所有书籍或创建新书籍:

from rest_framework import generics
from .models import Book
from .serializers import BookSerializer

class BookList(generics.ListCreateAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

ListCreateAPIView 是一个通用视图,处理列出和创建对象的操作。通过指定 querysetserializer_class,DRF 自动处理大部分样板代码。

7. 配置 URL 路由

现在我们已经构建了视图,接下来需要将它与 URL 绑定,使外界可以访问到它。

7.1. 设置 URL 路由

创建一个 books/urls.py 文件,并添加以下代码:

from django.urls import path
from .views import BookList

urlpatterns = [
    path('books/', BookList.as_view(), name='book-list'),
]

这将为我们的图书 API 端点创建一个路由。

7.2. 使用 DefaultRouter(适用于 ViewSets)

如果你使用的是 ViewSets,Django 的 DefaultRouter 会自动为所有可用操作(列出、检索、创建等)生成路由。

quickapi/urls.py 中,包含该应用的 URL:

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include('books.urls')),
]

8. 测试 API

在部署之前,确保 API 按预期工作至关重要。DRF 无缝集成了 Django 的测试工具,让我们可以直接测试 API 端点。

8.1. 使用 Django 内置测试客户端

books/tests.py 中为 BookList 视图创建一个测试用例:

from django.test import TestCase
from django.urls import reverse
from rest_framework import status
from rest_framework.test import APIClient
from .models import Book

class BookAPITest(TestCase):
    def setUp(self):
        self.client = APIClient()
        self.book_data = {'title': 'Django for Beginners', 'author': 'William S. Vincent', 'publication_date': '2020-01-01'}
        self.response = self.client.post(
            reverse('book-list'),
            self.book_data,
            format="json")
    
    def test_api_can_create_a_book(self):
        self.assertEqual(self.response.status_code, status.HTTP_201_CREATED)

8.2. 进行 API 请求

手动测试 API 时,运行 Django 开发服务器:

python manage.py runserver

你现在可以通过 http://localhost:8000/api/books/ 访问你的 API。

9. 增强 API 功能

在基本 API 工作正常后,你可能想要添加一些高级功能,如过滤、搜索和分页,以提升用户体验。

9.1. 添加过滤和搜索

DRF 让在 API 中添加搜索功能变得很简单。在 books/views.py 中修改视图:

from rest_framework import filters

class BookList(generics.ListCreateAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    filter_backends = [filters.SearchFilter]
    search_fields = ['author', 'title']

这允许用户通过查询参数(如 ?search=title)来按作者或标题搜索图书。

9.2. 实现分页

为防止客户端接收到过多数据,可以对 API 结果进行分页。在 quickapi/settings.py 中添加:

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 10
}

这样每页的响应数据将限制为 10 本书。

10. 保护 API

安全性是任何 API 的关键。DRF 提供了内置的身份验证和权限工具。

10.1. 添加身份验证

为了限制访问权限,可以在视图中添加身份验证类:

from rest_framework.authentication import SessionAuthentication, BasicAuthentication

class BookList(generics.ListCreateAPIView):
    authentication_classes = [SessionAuthentication, BasicAuthentication]

这为 API 添加了基本的会话和用户名/密码身份验证。

10.2. 实施权限控制

要进一步控制访问,可以使用权限类。例如,限制只有已验证的用户才能访问 API:

from rest_framework.permissions import IsAuthenticated

class BookList(generics.ListCreateAPIView):
    permission_classes = [IsAuthenticated]

11. 结论

恭喜!在不到 10 分钟内,你已经使用 Django Rest Framework 构建了一个功能齐全的 API。我们从环境设置开始,一直到实现过滤和身份验证等高级功能。DRF 的灵活性和易用性使其成为快速构建健壮 API 的绝佳选择。继续尝试,很快你就能构建具有更复杂功能的 API!

相关推荐

Excel新函数TEXTSPLIT太强大了,轻松搞定数据拆分!

我是【桃大喵学习记】,欢迎大家关注哟~,每天为你分享职场办公软件使用技巧干货!最近我把WPS软件升级到了版本号:12.1.0.15990的最新版本,最版本已经支持文本拆分函数TEXTSPLIT了,并...

Excel超强数据拆分函数TEXTSPLIT,从入门到精通!

我是【桃大喵学习记】,欢迎大家关注哟~,每天为你分享职场办公软件使用技巧干货!今天跟大家分享的是Excel超强数据拆分函数TEXTSPLIT,带你从入门到精通!TEXTSPLIT函数真是太强大了,轻松...

看完就会用的C++17特性总结(c++11常用新特性)

作者:taoklin,腾讯WXG后台开发一、简单特性1.namespace嵌套C++17使我们可以更加简洁使用命名空间:2.std::variant升级版的C语言Union在C++17之前,通...

plsql字符串分割浅谈(plsql字符集设置)

工作之中遇到的小问题,在此抛出问题,并给出解决方法。一方面是为了给自己留下深刻印象,另一方面给遇到相似问题的同学一个解决思路。如若其中有写的不好或者不对的地方也请不加不吝赐教,集思广益,共同进步。遇到...

javascript如何分割字符串(javascript切割字符串)

javascript如何分割字符串在JavaScript中,您可以使用字符串的`split()`方法来将一个字符串分割成一个数组。`split()`方法接收一个参数,这个参数指定了分割字符串的方式。如...

TextSplit函数的使用方法(入门+进阶+高级共八种用法10个公式)

在Excel和WPS新增的几十个函数中,如果按实用性+功能性排名,textsplit排第二,无函数敢排第一。因为它不仅使用简单,而且解决了以前用超复杂公式才能搞定的难题。今天小编用10个公式,让你彻底...

Python字符串split()方法使用技巧

在Python中,字符串操作可谓是基础且关键的技能,而今天咱们要重点攻克的“堡垒”——split()方法,它能将看似浑然一体的字符串,按照我们的需求进行拆分,极大地便利了数据处理与文本解析工作。基本语...

go语言中字符串常用的系统函数(golang 字符串)

最近由于工作比较忙,视频有段时间没有更新了,在这里跟大家说声抱歉了,我尽快抽些时间整理下视频今天就发一篇关于go语言的基础知识吧!我这我工作中用到的一些常用函数,汇总出来分享给大家,希望对...

无规律文本拆分,这些函数你得会(没有分隔符没规律数据拆分)

今天文章来源于表格学员训练营群内答疑,混合文本拆分。其实拆分不难,只要规则明确就好办。就怕规则不清晰,或者规则太多。那真是,Oh,mygod.如上图所示进行拆分,文字表达实在是有点难,所以小熊变身灵...

Python之文本解析:字符串格式化的逆操作?

引言前面的文章中,提到了关于Python中字符串中的相关操作,更多地涉及到了字符串的格式化,有些地方也称为字符串插值操作,本质上,就是把多个字符串拼接在一起,以固定的格式呈现。关于字符串的操作,其实还...

忘记【分列】吧,TEXTSPLIT拆分文本好用100倍

函数TEXTSPLIT的作用是:按分隔符将字符串拆分为行或列。仅ExcelM365版本可用。基本应用将A2单元格内容按逗号拆分。=TEXTSPLIT(A2,",")第二参数设置为逗号...

Excel365版本新函数TEXTSPLIT,专攻文本拆分

Excel中字符串的处理,拆分和合并是比较常见的需求。合并,当前最好用的函数非TEXTJOIN不可。拆分,Office365于2022年3月更新了一个专业函数:TEXTSPLIT语法参数:【...

站长在线Python精讲使用正则表达式的split()方法分割字符串详解

欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是《在Python中使用正则表达式的split()方法分割字符串详解》。使用正则表达式分割字符串在Python中使用正则表达式的split(...

Java中字符串分割的方法(java字符串切割方法)

技术背景在Java编程中,经常需要对字符串进行分割操作,例如将一个包含多个信息的字符串按照特定的分隔符拆分成多个子字符串。常见的应用场景包括解析CSV文件、处理网络请求参数等。实现步骤1.使用Str...

因为一个函数strtok踩坑,我被老工程师无情嘲笑了

在用C/C++实现字符串切割中,strtok函数经常用到,其主要作用是按照给定的字符集分隔字符串,并返回各子字符串。但是实际上,可不止有strtok(),还有strtok、strtok_s、strto...