溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Django REST framework怎么使用

發布時間:2021-10-21 15:12:05 來源:億速云 閱讀:191 作者:柒染 欄目:大數據
# 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)

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女