使用Django REST framework构建RESTful API

使用Django REST framework构建RESTful API

Django REST framework (DRF) 是一个功能强大的工具包,用于构建Web API。它与Django框架无缝集成,提供了许多开箱即用的功能,如序列化、认证、权限、分页和视图等。本文将详细介绍如何使用Django REST framework构建RESTful API。

Django REST framework简介

Django REST framework 是一个用于构建Web API的框架,它旨在使构建API变得简单和快速。DRF提供了许多强大的功能,如自动化的API浏览界面、序列化器、视图集、路由等。

安装Django REST framework

首先,需要安装Django和Django REST framework。

pip install django djangorestframework

创建Django项目

使用Django创建一个新的项目。

django-admin startproject myproject
cd myproject

创建Django应用

在项目中创建一个新的应用。

python manage.py startapp myapp

配置Django项目

在项目的 settings.py文件中,添加 rest_framework和新创建的应用到 INSTALLED_APPS列表中。

INSTALLED_APPS = [
    # ...
    'rest_framework',
    'myapp',
]

创建模型

models.py文件中定义一个简单的模型。

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()
    price = models.DecimalField(max_digits=5, decimal_places=2)

    def __str__(self):
        return self.title

迁移数据库

运行迁移命令以创建数据库表。

python manage.py makemigrations
python manage.py migrate

创建序列化器

serializers.py文件中创建一个序列化器。

from rest_framework import serializers
from .models import Book

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

创建视图

views.py文件中创建视图。

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

class BookViewSet(viewsets.ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

配置URL

urls.py文件中配置URL路由。

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

router = DefaultRouter()
router.register(r'books', BookViewSet)

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

配置全局URL

在项目的 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')),
]

配置认证和权限

settings.py文件中配置认证和权限。

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

测试API

启动Django开发服务器,访问API。

python manage.py runserver

打开浏览器,访问http://127.0.0.1:8000/api/books/,可以看到API的浏览界面。

使用Postman测试API

可以使用Postman等工具来测试API的各个端点。

分页

settings.py文件中配置分页。

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

过滤和排序

views.py文件中配置过滤和排序。

from rest_framework import filters

class BookViewSet(viewsets.ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    filter_backends = [filters.SearchFilter, filters.OrderingFilter]
    search_fields = ['title', 'author']
    ordering_fields = ['published_date', 'price']

自定义视图

可以创建自定义视图来处理特定的业务逻辑。

from rest_framework.decorators import api_view
from rest_framework.response import Response

@api_view(['GET'])
def book_list(request):
    books = Book.objects.all()
    serializer = BookSerializer(books, many=True)
    return Response(serializer.data)

异常处理

views.py文件中配置异常处理。

from rest_framework.exceptions import NotFound

class BookViewSet(viewsets.ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

    def retrieve(self, request, *args, **kwargs):
        try:
            return super().retrieve(request, *args, **kwargs)
        except Http404:
            raise NotFound(detail='Book not found')

文档

可以使用Swagger或Redoc等工具生成API文档。

pip install drf-yasg

urls.py文件中配置Swagger。

from django.urls import path, include
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='My API',
      default_version='v1',
      description='Test description',
      terms_of_service='https://www.google.com/policies/terms/',
      contact=openapi.Contact(email='contact@myapi.local'),
      license=openapi.License(name='BSD License'),
   ),
   public=True,
   permission_classes=(permissions.AllowAny,),
)

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include('myapp.urls')),
    path('swagger/', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'),
    path('redoc/', schema_view.with_ui('redoc', cache_timeout=0), name='schema-redoc'),
]

总结

通过本文,你已经学习了如何使用Django REST framework构建RESTful API。我们介绍了Django REST framework的基本概念、安装方法、创建Django项目和应用、定义模型、创建序列化器、创建视图、配置URL、配置认证和权限、测试API、使用Postman测试API、分页、过滤和排序、自定义视图、异常处理、生成API文档等内容。掌握了这些知识,将有助于你在实际工作中更好地利用Django REST framework来构建高效、可靠的Web API。

使用Django REST framework可以显著简化RESTful API的开发过程。