您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 用Django REST framework写API的示例分析
## 目录
1. [Django REST framework简介](#django-rest-framework简介)
2. [环境准备与项目创建](#环境准备与项目创建)
3. [快速创建第一个API](#快速创建第一个api)
4. [序列化器(Serializer)详解](#序列化器serializer详解)
5. [视图(Views)的多种实现方式](#视图views的多种实现方式)
6. [路由(Routers)配置](#路由routers配置)
7. [认证与权限控制](#认证与权限控制)
8. [分页与过滤](#分页与过滤)
9. [API文档生成](#api文档生成)
10. [最佳实践与性能优化](#最佳实践与性能优化)
---
## Django REST framework简介
Django REST framework(简称DRF)是建立在Django框架之上的强大而灵活的工具包,用于构建Web API。它提供了以下核心功能:
- **序列化**:支持ORM和非ORM数据源的转换
- **视图和路由**:简化API端点的创建
- **认证与权限**:内置多种认证方案
- **测试客户端**:方便API测试
- **可浏览的API界面**:自动生成Web界面
```python
# 典型DRF项目结构
project/
├── settings.py # Django配置
├── urls.py # 主路由
└── api/
├── serializers.py # 序列化器
├── views.py # 视图
└── urls.py # API路由
pip install django djangorestframework
django-admin startproject api_project
cd api_project
python manage.py startapp books
INSTALLED_APPS = [
...
'rest_framework',
'books',
]
# DRF全局配置
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated',
],
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 10
}
# books/models.py
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.CharField(max_length=100)
published_date = models.DateField()
isbn = models.CharField(max_length=13)
def __str__(self):
return self.title
# books/serializers.py
from rest_framework import serializers
from .models import Book
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = '__all__'
# books/views.py
from rest_framework import generics
from .models import Book
from .serializers import BookSerializer
class BookListCreateView(generics.ListCreateAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
class BookRetrieveUpdateDestroyView(generics.RetrieveUpdateDestroyAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
# api_project/urls.py
from django.urls import path, include
from books import views
urlpatterns = [
path('api/books/', views.BookListCreateView.as_view()),
path('api/books/<int:pk>/', views.BookRetrieveUpdateDestroyView.as_view()),
]
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = ['id', 'title', 'author', 'isbn']
def validate_isbn(self, value):
if len(value) not in [10, 13]:
raise serializers.ValidationError("ISBN必须是10或13位")
return value
class AuthorSerializer(serializers.ModelSerializer):
books = BookSerializer(many=True, read_only=True)
class Meta:
model = Author
fields = ['id', 'name', 'books']
from rest_framework.decorators import api_view
@api_view(['GET'])
def book_list(request):
books = Book.objects.all()
serializer = BookSerializer(books, many=True)
return Response(serializer.data)
from rest_framework.views import APIView
class BookList(APIView):
def get(self, request):
books = Book.objects.all()
serializer = BookSerializer(books, many=True)
return Response(serializer.data)
from rest_framework import generics
class BookListCreate(generics.ListCreateAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
from rest_framework import viewsets
class BookViewSet(viewsets.ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
from django.urls import path
from . import views
urlpatterns = [
path('books/', views.BookList.as_view()),
path('books/<int:pk>/', views.BookDetail.as_view()),
]
from rest_framework.routers import DefaultRouter
from .views import BookViewSet
router = DefaultRouter()
router.register(r'books', BookViewSet)
urlpatterns = [
path('', include(router.urls)),
]
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.BasicAuthentication',
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.TokenAuthentication',
]
}
from rest_framework.permissions import BasePermission
class IsAdminOrReadOnly(BasePermission):
def has_permission(self, request, view):
if request.method in ['GET', 'HEAD', 'OPTIONS']:
return True
return request.user and request.user.is_staff
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 20
}
from django_filters.rest_framework import DjangoFilterBackend
class BookList(generics.ListAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
filter_backends = [DjangoFilterBackend]
filterset_fields = ['author', 'published_date']
from rest_framework.documentation import include_docs_urls
urlpatterns = [
path('docs/', include_docs_urls(title='Book API')),
]
from drf_yasg.views import get_schema_view
from drf_yasg import openapi
schema_view = get_schema_view(
openapi.Info(
title="Book API",
default_version='v1',
),
public=True,
)
urlpatterns = [
path('swagger/', schema_view.with_ui('swagger', cache_timeout=0)),
]
select_related
和prefetch_related
api_project/
├── apps/
│ ├── books/
│ └── users/
├── config/
│ ├── settings/
│ └── urls.py
└── requirements/
from rest_framework.test import APITestCase
class BookAPITestCase(APITestCase):
def setUp(self):
self.book = Book.objects.create(title="Test Book", author="Test Author")
def test_get_books(self):
response = self.client.get('/api/books/')
self.assertEqual(response.status_code, 200)
通过本文的详细示例,您应该已经掌握了使用Django REST framework构建API的核心技术。DRF的强大之处在于它的灵活性和可扩展性,可以适应从简单到复杂的各种API开发需求。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。