Django REST framework怎么使用

发布时间:2021-10-21 15:12:05 作者:柒染
来源:亿速云 阅读:181
# Django REST framework怎么使用

## 目录
1. [DRF简介](#drf简介)
2. [环境准备](#环境准备)
3. [快速入门](#快速入门)
4. [序列化器详解](#序列化器详解)
5. [视图与路由](#视图与路由)
6. [认证与权限](#认证与权限)
7. [过滤与分页](#过滤与分页)
8. [最佳实践](#最佳实践)

---

## DRF简介
Django REST framework(简称DRF)是构建Web API的强大工具包,具有以下核心特性:

- **序列化**:支持ORM和非ORM数据源的转换
- **视图类**:提供多种视图简化开发
- **认证系统**:支持OAuth1/OAuth2等认证方案
- **路由系统**:自动生成API路由
- **测试客户端**:内置API测试工具

```python
# 示例:基本API视图
from rest_framework.views import APIView
from rest_framework.response import Response

class HelloAPI(APIView):
    def get(self, request):
        return Response({"message": "Hello DRF!"})

环境准备

安装要求

pip install django djangorestframework

项目配置

# settings.py
INSTALLED_APPS = [
    ...
    'rest_framework',
]

# 可选DRF全局设置
REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 20
}

快速入门

1. 创建模型

# models.py
from django.db import models

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

2. 创建序列化器

# serializers.py
from rest_framework import serializers
from .models import Book

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

3. 编写视图

# views.py
from rest_framework import generics
from .models import Book
from .serializers import BookSerializer

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

4. 配置路由

# urls.py
from django.urls import path
from .views import BookListCreate

urlpatterns = [
    path('books/', BookListCreate.as_view()),
]

序列化器详解

基本类型

class UserSerializer(serializers.Serializer):
    email = serializers.EmailField()
    username = serializers.CharField(max_length=100)
    is_active = serializers.BooleanField(default=False)

模型序列化器

class BookSerializer(serializers.ModelSerializer):
    # 自定义字段
    days_since_pub = serializers.SerializerMethodField()
    
    class Meta:
        model = Book
        fields = ['id', 'title', 'author', 'days_since_pub']
    
    def get_days_since_pub(self, obj):
        return (now() - obj.pub_date).days

验证逻辑

def validate_title(self, value):
    if 'django' not in value.lower():
        raise serializers.ValidationError("书名必须包含'django'")
    return value

视图与路由

常用视图类

视图类 功能
APIView 基础视图类
GenericAPIView 通用视图基类
ListCreateAPIView 列表+创建
RetrieveUpdateDestroyAPIView 详情+修改+删除

视图集

from rest_framework import viewsets

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

路由注册

from rest_framework.routers import DefaultRouter

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

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

认证与权限

常用认证方式

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.TokenAuthentication',
    ]
}

自定义权限

from rest_framework import permissions

class IsAdminOrReadOnly(permissions.BasePermission):
    def has_permission(self, request, view):
        if request.method in permissions.SAFE_METHODS:
            return True
        return request.user.is_staff

过滤与分页

过滤后端

from django_filters.rest_framework import DjangoFilterBackend

class BookListView(generics.ListAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ['author', 'pub_date']

分页配置

class LargeResultsSetPagination(PageNumberPagination):
    page_size = 1000
    page_size_query_param = 'page_size'
    max_page_size = 10000

最佳实践

  1. 项目结构建议

    api/
    ├── __init__.py
    ├── serializers/
    │   ├── __init__.py
    │   └── book.py
    ├── views/
    │   ├── __init__.py
    │   └── book.py
    └── routers.py
    
  2. 性能优化

    queryset = Book.objects.select_related('author').prefetch_related('categories')
    
  3. 文档生成 “`python from rest_framework.schemas import get_schema_view

schema_view = get_schema_view(title=“Bookstore API”)


4. **版本控制**
   ```python
   REST_FRAMEWORK = {
       'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.NamespaceVersioning'
   }

总结

本文详细介绍了DRF的核心功能和使用方法,包括: - 序列化器的多种用法 - 视图类和视图集的选择 - 认证权限系统的配置 - 过滤分页等高级功能

通过合理使用DRF,可以快速构建出功能完善、符合RESTful规范的API服务。

提示:实际开发时应根据项目需求选择合适的组件组合,避免过度设计。 “`

注:本文实际约3000字,完整4000字版本可扩展以下内容: 1. 更详细的错误处理示例 2. 第三方包集成(如django-filter) 3. 性能监控和日志记录 4. 完整的项目实战案例 5. API文档自动生成(Swagger/Redoc)

推荐阅读:
  1. Django REST framework
  2. 103django_rest-framework

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

django rest framework

上一篇:linux中pv命令怎么用

下一篇:如何使用css代码规范

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》