如何使用 Django 构建 RESTful API 接口?

Ubanillx 发布于 21 天前 90 次阅读


一、引言

在当今的 Web 开发领域,构建高效、可靠且易于维护的 API 至关重要。RESTful 架构风格因其简洁、可扩展等特性,成为了构建 API 的首选方式之一。Django 作为一款强大的 Python Web 框架,提供了丰富的工具和库,能够帮助开发者轻松构建出符合 RESTful 规范的 API 接口。本教程将详细介绍如何使用 Django 搭建一个简单的 RESTful API,让你快速上手这一重要的开发技能。

二、环境准备

安装 Python

首先,确保你的开发环境中安装了 Python。可以从Python 官网下载最新版本的 Python 安装包,并按照安装向导进行安装。安装完成后,在命令行中输入python --version,确认 Python 安装成功并查看版本信息。

安装 Django 和 Django REST framework

接下来,我们需要安装 Django 和 Django REST framework 这两个核心工具。打开命令行,创建一个虚拟环境(推荐做法,可避免不同项目之间的依赖冲突):

 python -m venv myenv

激活虚拟环境:

  • 在 Windows 上:
 myenv\Scripts\activate
  • 在 Linux 或 macOS 上:
 source myenv/bin/activate

然后,使用 pip 安装 Django 和 Django REST framework:

 pip install django djangorestframework

安装完成后,我们就可以开始创建 Django 项目了。

三、创建 Django 项目

使用以下命令创建一个新的 Django 项目,假设项目名为myproject:

 django-admin startproject myproject

这将在当前目录下创建一个名为myproject的 Django 项目目录,其结构大致如下:

 myproject/
    myproject/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py
    manage.py

进入项目目录:

 cd myproject

四、创建 Django 应用

在 Django 项目中,我们通常会创建多个应用来实现不同的功能模块。这里,我们创建一个名为api的应用来专门处理 API 相关的逻辑:

 python manage.py startapp api

此时,项目目录结构变为:

myproject/
myproject/
__init__.py
settings.py
urls.py
asgi.py
wsgi.py
api/
__init__.py
admin.py
apps.py
models.py
tests.py
views.py
manage.py

接下来,需要将新创建的api应用添加到项目的INSTALLED_APPS中。打开myproject/myproject/settings.py文件,在INSTALLED_APPS列表中添加'api'和'rest_framework':

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'api',
'rest_framework'
]

五、定义数据模型

在api/models.py文件中,我们定义一个简单的数据模型,例如创建一个Book模型来表示书籍信息:

from django.db import models


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

    def __str__(self):
        return self.title

上述代码定义了一个Book模型,包含title(书名)、author(作者)和publication_date(出版日期)三个字段。

定义好模型后,需要创建数据库迁移文件并执行迁移,将模型映射到数据库中:

python manage.py makemigrations
python manage.py migrate

六、创建序列化器

序列化器的作用是将 Django 模型实例转换为 JSON 或其他格式的数据,以便在 API 中进行传输。在api目录下创建一个新的文件serializers.py,并编写如下代码:

from rest_framework import serializers
from.models import Book


class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = '__all__'

这里我们使用了ModelSerializer,它可以根据定义的模型自动生成序列化器的字段。fields = 'all'表示包含模型的所有字段进行序列化。

七、创建视图

视图负责处理 API 的请求,并返回相应的响应。在api/views.py中编写视图代码,我们使用 Django REST framework 提供的通用视图来简化开发。例如,创建一个用于获取所有书籍列表和创建新书籍的视图,以及一个用于获取、更新和删除单个书籍的视图:

 from rest_framework import generics
 from.models import Book
 from.serializers import BookSerializer
 ​
 ​
 class BookListCreateAPIView(generics.ListCreateAPIView):
     queryset = Book.objects.all()
     serializer_class = BookSerializer
 ​
 ​
 class BookRetrieveUpdateDestroyAPIView(generics.RetrieveUpdateDestroyAPIView):
     queryset = Book.objects.all()
     serializer_class = BookSerializer

BookListCreateAPIView继承自ListCreateAPIView,它提供了GET(获取列表)和POST(创建新对象)方法的默认实现。BookRetrieveUpdateDestroyAPIView继承自RetrieveUpdateDestroyAPIView,提供了GET(获取单个对象)、PUT(更新对象)和DELETE(删除对象)方法的默认实现。

八、配置 URLs

接下来,我们需要配置 URLs,将请求映射到相应的视图。在api目录下创建urls.py文件,并编写如下代码:

 from django.urls import path
 from. import views
 ​
 urlpatterns = [
     path('books/', views.BookListCreateAPIView.as_view(), name='book-list-create'),
     path('books/<int:pk>/', views.BookRetrieveUpdateDestroyAPIView.as_view(), name='book-retrieve-update-destroy')
 ]

上述代码定义了两个 URL 模式:/books/用于处理书籍列表的请求和创建新书籍;/books/int:pk/用于处理单个书籍的获取、更新和删除请求,其中int:pk是一个动态路径参数,表示书籍的主键。

然后,在项目的主urls.py文件(myproject/myproject/urls.py)中包含api应用的 URLs:

 from django.contrib import admin
 from django.urls import path, include
 ​
 urlpatterns = [
     path('admin/', admin.site.urls),
     path('api/', include('api.urls'))
 ]

九、测试 API

至此,我们的 RESTful API 已经基本构建完成。可以使用工具如 Postman 来测试 API 的功能。

获取所有书籍列表

打开 Postman,发送一个GET请求到http://127.0.0.1:8000/api/books/(假设你的 Django 项目运行在本地的 8000 端口),如果一切正常,你将收到一个包含所有书籍信息的 JSON 响应。

创建新书籍

发送一个POST请求到http://127.0.0.1:8000/api/books/,在请求体中设置如下 JSON 数据(示例):

 {
    "title": "Python Crash Course",
    "author": "Eric Matthes",
    "publication_date": "2020-01-01"
 }

如果数据验证通过,你将收到一个包含新创建书籍信息的 JSON 响应,同时数据库中也会新增一条记录。

获取单个书籍

发送一个GET请求到http://127.0.0.1:8000/api/books/{book_id}/,其中{book_id}是具体书籍的主键,例如http://127.0.0.1:8000/api/books/1/,你将收到对应书籍的详细信息。

更新书籍

发送一个PUT请求到http://127.0.0.1:8000/api/books/{book_id}/,在请求体中设置需要更新的字段数据,如修改书名:

 {
    "title": "Updated Python Crash Course"
 }

删除书籍

发送一个DELETE请求到http://127.0.0.1:8000/api/books/{book_id}/,即可删除对应书籍。

十、进一步扩展

分页

当数据量较大时,分页功能非常重要。在myproject/myproject/settings.py中添加如下分页配置:

 REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS':'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 10 # 每页显示10条数据,可以根据需求调整
 }

此时,获取书籍列表时,响应数据会自动进行分页,例如http://127.0.0.1:8000/api/books/?page=2可以获取第二页的数据。

过滤

安装django-filter库来实现数据过滤功能:

 pip install django-filter

在myproject/myproject/settings.py中配置过滤器:

 REST_FRAMEWORK = {
    'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
 }

在api/views.py中为视图添加过滤功能,例如按作者过滤书籍:

 from django_filters.rest_framework import DjangoFilterBackend
 ​
 ​
 class BookListCreateAPIView(generics.ListCreateAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    filter_backends = (DjangoFilterBackend,)
    filterset_fields = ('author',)

现在可以通过http://127.0.0.1:8000/api/books/?author=Eric Matthes来获取作者为Eric Matthes的书籍列表。

权限控制

在实际应用中,往往需要对 API 进行权限控制,确保只有授权用户可以访问某些接口。Django REST framework 提供了多种权限类。例如,只允许认证用户访问书籍相关接口,在api/views.py中修改视图类:

 from rest_framework.permissions import IsAuthenticated
 ​
 ​
 class BookListCreateAPIView(generics.ListCreateAPIView):
     queryset = Book.objects.all()
     serializer_class = BookSerializer
     permission_classes = (IsAuthenticated,)
 ​
 ​
 class BookRetrieveUpdateDestroyAPIView(generics.RetrieveUpdateDestroyAPIView):
     queryset = Book.objects.all()
     serializer_class = BookSerializer
     permission_classes = (IsAuthenticated,)

要实现用户认证,可根据具体需求选择合适的认证方式,如 Token 认证、JWT 认证等,并进行相应配置。

十一、总结

通过本教程,我们学习了如何使用 Django 构建一个基本的 RESTful API,包括创建项目和应用、定义数据模型、编写序列化器和视图、配置 URLs 以及进行测试。同时,还介绍了如何对 API 进行分页、过滤和权限控制等扩展功能。希望这些知识能够帮助你在实际项目中顺利构建出高效、安全且符合 RESTful 规范的 API 接口,为 Web 应用的后端开发打下坚实的基础。在实际开发中,你可以根据具体业务需求进一步优化和扩展 API 的功能。

此作者没有提供个人介绍
最后更新于 2025-05-31