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 响应。

相关推荐
AI_56781 天前
Selenium+Python可通过 元素定位→操作模拟→断言验证 三步实现Web自动化测试
服务器·人工智能·python
蒜香拿铁1 天前
【第三章】python算数运算符
python
浮尘笔记1 天前
Go语言临时对象池:sync.Pool的原理与使用
开发语言·后端·golang
52Hz1181 天前
力扣73.矩阵置零、54.螺旋矩阵、48.旋转图像
python·算法·leetcode·矩阵
梦梦代码精1 天前
BuildingAI vs Dify vs 扣子:三大开源智能体平台架构风格对比
开发语言·前端·数据库·后端·架构·开源·推荐算法
weixin_462446231 天前
Python 使用 openpyxl 从 URL 读取 Excel 并获取 Sheet 及单元格样式信息
python·excel·openpyxl
REDcker1 天前
RESTful API设计规范详解
服务器·后端·接口·api·restful·博客·后端开发
毕设源码-钟学长1 天前
【开题答辩全过程】以 基于Python的健康食谱规划系统的设计与实现为例,包含答辩的问题和答案
开发语言·python
百***78751 天前
Grok-4.1技术深度解析:双版本架构突破与Python API快速集成指南
大数据·python·架构
2501_942191771 天前
基于YOLO11-HSFPN的数字检测与识别模型实现详解
python