一、类定义与顶层配置属性
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
作用:权限控制(
AllowAny
、IsAuthenticated
、DjangoModelPermissions
……),在请求前 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})
评论