Django REST framework 详解:构建高效 RESTful API 的利器

2025-02-27 08:30:13

Django REST Framework Logo

在现代 Web 开发中,RESTful API 已成为前后端分离架构中的重要组成部分。为了简化 RESTful API 的开发过程,Django REST framework(DRF)应运而生。它基于 Django 框架,提供了丰富的工具和库来快速构建安全、可靠的 API。本文将深入探讨 DRF 的核心功能和使用方法,帮助读者全面掌握这一强大的工具。

Django REST Framework Screenshot

核心功能与特性

1. 安装与配置

下载与安装

首先,确保已经安装了 Django 和 DRF。可以通过以下命令安装:

pip install django djangorestframework

安装完成后,在 Django 项目的 settings.py 文件中添加 rest_frameworkINSTALLED_APPS 列表中:

INSTALLED_APPS = [
    ...
    'rest_framework',
]

配置文件说明

DRF 提供了许多可配置项,可以在 settings.py 中进行全局配置。例如,设置默认的渲染器、解析器和分页类:

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
        'rest_framework.renderers.BrowsableAPIRenderer',
    ),
    'DEFAULT_PARSER_CLASSES': (
        'rest_framework.parsers.JSONParser',
    ),
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 10,
}

2. 视图集与路由

DRF 提供了多种方式来定义视图,其中最常用的是使用视图集(ViewSet)和路由器(Router)。视图集可以将一组相关的操作封装在一起,并自动生成相应的 URL 路由。

创建视图集

假设你有一个名为 snippet 的模型,可以通过以下代码创建一个视图集:

from rest_framework import viewsets
from .models import Snippet
from .serializers import SnippetSerializer

class SnippetViewSet(viewsets.ModelViewSet):
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer

注册路由

接下来,使用路由器自动注册视图集到 URL 中:

from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import SnippetViewSet

router = DefaultRouter()
router.register(r'snippets', SnippetViewSet)

urlpatterns = [
    path('', include(router.urls)),
]

3. 序列化器

序列化器是 DRF 中用于将复杂数据类型(如查询集或模型实例)转换为原生 Python 数据类型的关键组件。这些数据类型可以轻松地被渲染成 JSON 或其他格式。

创建序列化器

对于上面提到的 Snippet 模型,可以创建一个简单的序列化器:

from rest_framework import serializers
from .models import Snippet

class SnippetSerializer(serializers.ModelSerializer):
    class Meta:
        model = Snippet
        fields = ['id', 'title', 'code', 'linenos', 'language', 'style']

使用序列化器

在视图集中,直接使用序列化器来处理请求和响应:

class SnippetViewSet(viewsets.ModelViewSet):
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer

4. 认证与权限

DRF 提供了多种内置的认证和权限机制,以确保 API 的安全性。常见的认证方式包括基本认证、令牌认证和会话认证。

设置认证类

可以在 settings.py 中全局设置认证类:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    ),
}

自定义权限

如果需要更细粒度的权限控制,可以创建自定义权限类:

from rest_framework import permissions

class IsOwnerOrReadOnly(permissions.BasePermission):
    def has_object_permission(self, request, view, obj):
        if request.method in permissions.SAFE_METHODS:
            return True
        return obj.owner == request.user

然后在视图集中应用该权限:

class SnippetViewSet(viewsets.ModelViewSet):
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer
    permission_classes = [permissions.IsAuthenticatedOrReadOnly, IsOwnerOrReadOnly]

    def perform_create(self, serializer):
        serializer.save(owner=self.request.user)

示例介绍

假设你正在开发一个博客系统,并希望为其提供 RESTful API 接口。你可以使用 DRF 来简化这个过程。

示例 1:创建博客文章模型

  1. models.py 中定义博客文章模型:
from django.db import models
from django.contrib.auth.models import User

class Post(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title
  1. 运行迁移命令以创建数据库表:
python manage.py makemigrations
python manage.py migrate

示例 2:实现 RESTful API

  1. 创建序列化器:
from rest_framework import serializers
from .models import Post

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = ['id', 'title', 'content', 'author', 'created_at']
  1. 创建视图集:
from rest_framework import viewsets
from .models import Post
from .serializers import PostSerializer

class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer
    permission_classes = [permissions.IsAuthenticatedOrReadOnly]

    def perform_create(self, serializer):
        serializer.save(author=self.request.user)
  1. 注册路由:
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import PostViewSet

router = DefaultRouter()
router.register(r'posts', PostViewSet)

urlpatterns = [
    path('', include(router.urls)),
]

总结

Django REST framework 是构建 RESTful API 的强大工具,提供了丰富的功能和灵活的配置选项。通过本文的介绍,相信读者已经对 DRF 的核心功能有了较为全面的了解。DRF 的设计目标是简化复杂的 API 开发任务,同时保持代码的简洁性和可读性。希望本文能够为读者在实际项目中应用 DRF 提供有价值的参考。

encode
Django 的 Web API。
Python
Other
28.9 k