Django REST Framework响应类Response详解

概述

Response 类是一个智能的 HTTP 响应类,能够根据客户端请求的内容类型(Content-Type)自动将数据渲染成合适的格式(JSON、XML、HTML等)。

基本用法

python 复制代码
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 实例
python 复制代码
# 正确用法
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 (服务器错误)
python 复制代码
return Response(data, status=201)  # 创建成功
return Response({'error': 'Not found'}, status=404)  # 资源不存在

3. template_name (模板名称)

  • 作用: 指定用于渲染的模板(当需要HTML输出时)
  • 使用场景: 通常用于可浏览的API或需要HTML格式的响应
python 复制代码
# 返回HTML格式的响应
return Response(
    {'users': user_list},
    template_name='user_list.html'
)

4. headers (自定义头部)

  • 作用: 添加自定义HTTP头部
  • 类型: 字典
python 复制代码
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 中的使用

python 复制代码
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status

class 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 类的强大之处在于它能自动处理多种格式:

python 复制代码
# 客户端请求 Accept: application/json → 返回JSON
# 客户端请求 Accept: text/html → 返回HTML(可浏览API)
# 客户端请求 Accept: application/xml → 返回XML

def api_endpoint(request):
    data = {
        'user': {
            'id': 1,
            'name': 'John Doe',
            'email': 'john@example.com'
        }
    }
    return Response(data)

注意事项

  1. 不要直接传递Serializer实例 :必须使用 serializer.dataserializer.errors
  2. 状态码使用常量 :建议使用 rest_framework.status 中的常量而不是数字
  3. 头部设置 :使用 headers 参数而不是直接操作响应头
  4. 内容协商 :DRF会自动处理内容协商,通常不需要手动指定 content_type

总结

Response 类是 DRF 中构建 API 响应的标准方式,它提供了:

  • 自动的内容协商和渲染
  • 灵活的响应配置
  • 与 DRF 序列化器的无缝集成
  • 符合 RESTful 原则的响应构建

通过合理使用这些参数,你可以构建出符合各种需求的 API 响应。

相关推荐
Abadbeginning2 小时前
FastSoyAdmin centos7云服务器+宝塔部署
vue.js·后端·python
kida_yuan3 小时前
【从零开始】13. 数据增强(Data Augmentation)
数据结构·python·nlp
xuejianxinokok3 小时前
PostgreSQL 18 新功能:虚拟生成列
数据库·后端
未来影子3 小时前
SpringAI(GA):Neo4j向量数据库存储快速上手
后端
武子康3 小时前
大数据-95 Spark 集群 SparkSQL Action与Transformation操作 详细解释与测试案例
大数据·后端·spark
知其然亦知其所以然3 小时前
MySQL8.x 面试高频题:为什么一定要有主键?99%的人答不全
后端·mysql·面试
FE_C_P小麦3 小时前
Git 常用指令
前端·后端·github