跳转至

Django RESTful

创建一个 Django RESTful API 是通过 Django REST Framework (DRF) 实现的。以下是一个详细的教程,介绍如何从头开始构建一个简单的 Django RESTful API。

1. 环境准备

1.1 安装 Django 和 Django REST Framework

首先,需要确保安装了 Django 和 Django REST Framework。可以使用 pip 来安装这些库:

pip install django djangorestframework

1.2 创建 Django 项目和应用

使用 Django 命令行工具创建一个新的项目和应用:

django-admin startproject myproject
cd myproject
python manage.py startapp myapp

2. 配置 Django REST Framework

2.1 修改 settings.py

myproject/settings.py 文件中,确保 INSTALLED_APPS 中包含以下内容:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',  # 添加 DRF
    'myapp',  # 添加你的应用
]

2.2 配置 REST Framework 设置

可以在 settings.py 中添加一些基本的 DRF 配置,例如:

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.AllowAny',
    ],
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.BasicAuthentication',
    ],
}

3. 创建模型

myapp/models.py 中定义一个简单的模型。例如,创建一个用于存储书籍信息的 Book 模型:

from django.db import models

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

    def __str__(self):
        return self.title

然后,运行以下命令来生成和应用数据库迁移:

python manage.py makemigrations
python manage.py migrate

4. 创建序列化器

序列化器用于将模型实例转换为 JSON 数据。在 myapp/serializers.py 文件中创建一个序列化器类:

from rest_framework import serializers
from .models import Book

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

5. 创建视图

myapp/views.py 中,使用 DRF 提供的通用视图类来处理 API 请求。我们将创建视图来列出所有书籍以及处理单个书籍的详细信息:

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

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

class BookRetrieveUpdateDestroy(generics.RetrieveUpdateDestroyAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

6. 配置路由

myapp/urls.py 中配置路由,将 API 端点映射到视图:

from django.urls import path
from .views import BookListCreate, BookRetrieveUpdateDestroy

urlpatterns = [
    path('books/', BookListCreate.as_view(), name='book-list-create'),
    path('books/<int:pk>/', BookRetrieveUpdateDestroy.as_view(), name='book-detail'),
]

然后,在 myproject/urls.py 中包含应用的 URL 路由:

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

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

7. 测试 API

启动开发服务器并测试 API:

python manage.py runserver

使用浏览器或工具(如 Postman)访问以下 URL 来测试您的 API:

  • http://127.0.0.1:8000/api/books/ - 获取所有书籍或创建新的书籍。
  • http://127.0.0.1:8000/api/books/1/ - 获取、更新或删除 ID 为 1 的书籍。

8. 扩展功能

8.1 过滤、排序和搜索

使用 django-filter 扩展来实现 API 数据的过滤、排序和搜索功能。

安装 django-filter

pip install django-filter

settings.py 中配置过滤器:

REST_FRAMEWORK = {
    'DEFAULT_FILTER_BACKENDS': [
        'django_filters.rest_framework.DjangoFilterBackend',
    ],
}

然后在视图中添加过滤、排序和搜索:

from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import filters

class BookListCreate(generics.ListCreateAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    filter_backends = [DjangoFilterBackend, filters.OrderingFilter, filters.SearchFilter]
    filterset_fields = ['author', 'published_date']
    search_fields = ['title', 'author']
    ordering_fields = ['published_date']

8.2 身份验证与权限控制

您可以为 API 添加身份验证和权限控制,例如限制某些 API 端点仅供已认证用户访问:

from rest_framework.permissions import IsAuthenticated

class BookListCreate(generics.ListCreateAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    permission_classes = [IsAuthenticated]

9. 部署

将 Django RESTful API 部署到生产环境时,需要考虑使用 WSGI 服务器(如 Gunicorn)和反向代理(如 Nginx)。另外,确保启用了 HTTPS、数据库优化、缓存等生产环境配置。

10. 进阶功能

10.1 自定义认证

可以扩展或创建自定义的认证系统,比如使用 JWT(JSON Web Token):

pip install djangorestframework-simplejwt

配置 settings.py

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ),
}

10.2 API 文档

DRF 可以与自动化文档工具(如 drf-yasg)集成,生成 API 的 Swagger 文档:

pip install drf-yasg

配置 URL 路由以生成文档:

from rest_framework import permissions
from drf_yasg.views import get_schema_view
from drf_yasg import openapi

schema_view = get_schema_view(
   openapi.Info(
      title="API 文档",
      default_version='v1',
      description="Test description",
   ),
   public=True,
   permission_classes=(permissions.AllowAny,),
)

urlpatterns = [
    path('swagger/', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'),
]

通过本教程,您应该能够创建一个基本的 Django RESTful API,并理解如何扩展和部署它。Django REST Framework 提供了灵活且功能强大的工具集,可以帮助您轻松构建复杂的 API。