一、类定义与顶层配置属性

class APIView(View):

继承自 django.views.generic.View

  • 获得了 Django 的 URL 分发与 dispatch() 逻辑。

示例:

from django.views.generic import View
from rest_framework.views import APIView

class HelloView(APIView):
    def get(self, request):
        return Response({"msg": "hello"})

APIView 当作普通 View 使用,get()/post() 等方法会被 dispatch 调用。

    renderer_classes = api_settings.DEFAULT_RENDERER_CLASSES
  • 作用:定义可用的渲染器(如 JSON、Browsable API HTML)。DRF 根据客户端 Accept 头或 URL 后缀选择。

  • 默认[JSONRenderer, BrowsableAPIRenderer]

  • 示例:仅返回纯 JSON,不要浏览器界面

from rest_framework.renderers import JSONRenderer

class JSONOnlyView(APIView):
    renderer_classes = [JSONRenderer]
    def get(self, request):
        return Response({"a": 1})

    parser_classes = api_settings.DEFAULT_PARSER_CLASSES

  • 作用:定义请求体解析器(JSON、表单、多部件上传等),DRF 自动把 request.body 转成 request.data

  • 示例:只支持 JSON,不接受表单

from rest_framework.parsers import JSONParser

class JSONPostView(APIView):
    parser_classes = [JSONParser]
    def post(self, request):
        # request.data 只会从 JSONBody 中取数据
        return Response(request.data)

    authentication_classes = api_settings.DEFAULT_AUTHENTICATION_CLASSES
  • 作用:列出认证方式(Session、Token、Basic、JWT 等)。DRF 根据定义顺序尝试,认证失败则 401。

  • 示例:只用 Token 认证

from rest_framework.authentication import TokenAuthentication

class TokenView(APIView):
    authentication_classes = [TokenAuthentication]
    permission_classes = [IsAuthenticated]
    def get(self, request):
        return Response({"user": request.user.username})
    throttle_classes = api_settings.DEFAULT_THROTTLE_CLASSES
  • 作用:限流策略,防止接口被刷爆。

  • 示例:用户级每小时 100 次(需在 settings.py 中配置 THROTTLE_RATES)

    permission_classes = api_settings.DEFAULT_PERMISSION_CLASSES
  • 作用:权限控制(AllowAnyIsAuthenticatedDjangoModelPermissions……),在请求前 DRF 会执行 has_permission()has_object_permission()

  • 示例:公开/私有视图

class PublicView(APIView):
    permission_classes = [AllowAny]

class PrivateView(APIView):
    permission_classes = [IsAuthenticated]
    content_negotiation_class = api_settings.DEFAULT_CONTENT_NEGOTIATION_CLASS
  • 作用:当有多种 renderer_classes 时,决定选哪个渲染器(检查 URL 后缀 → Accept 头 → 默认)。

  • 示例:定制一个简单协商类

from rest_framework.negotiation import DefaultContentNegotiation

class CustomNegotiation(DefaultContentNegotiation):
    def select_renderer(self, request, renderers, format):
        # 强制总是用第一个
        return (renderers[0], renderers[0].media_type)

class MyView(APIView):
    content_negotiation_class = CustomNegotiation
    metadata_class = api_settings.DEFAULT_METADATA_CLASS
  • 作用:生成元信息(字段、过滤器、分页等),用于 Browsable API 和 OPTIONS 请求。

  • 示例:自定义 metadata 只返回字段名列表

from rest_framework.metadata import SimpleMetadata

class NamesOnlyMetadata(SimpleMetadata):
    def determine_metadata(self, request, view):
        meta = super().determine_metadata(request, view)
        return list(meta.get('actions', {}).get(request.method, {}).keys())

class MetaView(APIView):
    metadata_class = NamesOnlyMetadata
    versioning_class = api_settings.DEFAULT_VERSIONING_CLASS
  • 作用:支持 API 版本控制(URLPath、QueryParam、Header 等),在 request.version 中放入当前版本。

  • 示例:在 URL /v1/hello/ 中读取版本

from rest_framework.versioning import URLPathVersioning

class VersionedView(APIView):
    versioning_class = URLPathVersioning

    def get(self, request, version):
        return Response({"version": request.version})