Django REST Framework响应类Response详解
概述
Response
类是一个智能的 HTTP 响应类,能够根据客户端请求的内容类型(Content-Type)自动将数据渲染成合适的格式(JSON、XML、HTML等)。
基本用法
from rest_framework.response import Response# 最简单的用法
def my_view(request):data = {'message': 'Hello, World!', 'status': 'success'}return Response(data)# 带状态码的响应
def create_item(request):# 创建逻辑...return Response({'id': 123, 'name': 'New Item'}, status=201)# 带自定义头部的响应
def download_file(request):data = {'file_url': '/files/sample.pdf'}headers = {'X-Custom-Header': 'value'}return Response(data, headers=headers)
参数详解
1. data
(主要参数)
- 作用: 要返回的序列化数据
- 类型: 通常是字典、列表等可序列化的Python对象
- 注意: 不能直接传递 Serializer 实例
# 正确用法
serializer = MySerializer(instance)
return Response(serializer.data) # 访问 .data 属性# 错误用法(会抛出AssertionError)
return Response(serializer) # 直接传递Serializer实例
2. status
(状态码)
- 作用: HTTP 状态码
- 默认: 200
- 常用值:
200
- OK (成功)201
- Created (创建成功)400
- Bad Request (客户端错误)404
- Not Found (资源不存在)500
- Internal Server Error (服务器错误)
return Response(data, status=201) # 创建成功
return Response({'error': 'Not found'}, status=404) # 资源不存在
3. template_name
(模板名称)
- 作用: 指定用于渲染的模板(当需要HTML输出时)
- 使用场景: 通常用于可浏览的API或需要HTML格式的响应
# 返回HTML格式的响应
return Response({'users': user_list},template_name='user_list.html'
)
4. headers
(自定义头部)
- 作用: 添加自定义HTTP头部
- 类型: 字典
headers = {'X-RateLimit-Limit': '1000','X-RateLimit-Remaining': '999','Cache-Control': 'max-age=3600'
}
return Response(data, headers=headers)
5. exception
(异常标志)
- 作用: 标识这是一个异常响应
- 使用场景: 通常由框架内部使用
6. content_type
(内容类型)
- 作用: 显式指定响应内容类型
- 通常: 不需要手动指定,DRF会根据渲染器自动设置
实际应用示例
在 APIView 中的使用
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import statusclass UserListView(APIView):def get(self, request):users = User.objects.all()serializer = UserSerializer(users, many=True)return Response({'count': len(users),'results': serializer.data})def post(self, request):serializer = UserSerializer(data=request.data)if serializer.is_valid():serializer.save()return Response(serializer.data, status=status.HTTP_201_CREATED)return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
处理不同的响应格式
Response
类的强大之处在于它能自动处理多种格式:
# 客户端请求 Accept: application/json → 返回JSON
# 客户端请求 Accept: text/html → 返回HTML(可浏览API)
# 客户端请求 Accept: application/xml → 返回XMLdef api_endpoint(request):data = {'user': {'id': 1,'name': 'John Doe','email': 'john@example.com'}}return Response(data)
注意事项
- 不要直接传递Serializer实例:必须使用
serializer.data
或serializer.errors
- 状态码使用常量:建议使用
rest_framework.status
中的常量而不是数字 - 头部设置:使用
headers
参数而不是直接操作响应头 - 内容协商:DRF会自动处理内容协商,通常不需要手动指定
content_type
总结
Response
类是 DRF 中构建 API 响应的标准方式,它提供了:
- 自动的内容协商和渲染
- 灵活的响应配置
- 与 DRF 序列化器的无缝集成
- 符合 RESTful 原则的响应构建
通过合理使用这些参数,你可以构建出符合各种需求的 API 响应。