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

相关推荐
n8n12 分钟前
Spring AI 三层架构详解:ChatModel → ChatClient → Controller,同步调用 vs 流式调用(SSE)
后端
Cenxi13 分钟前
f-string 完全手册:60 题从入门到实战
python
2601_9622998817 分钟前
Python编写Linux命令指南
linux·python·开发·命令·指南
小傅哥17 分钟前
Java + DDD,1:1 复刻 Deepseek Harness 项目
前端·后端·ai编程
Lambert28118 分钟前
AgentScope Java 从零(03):Agent 的记性默认全开,我在第 50 轮翻了车
后端·aigc
此冬歌咏20 分钟前
自动化服务器运维监控系统(python+shell)
linux·运维·服务器·开发语言·python·自动化
zhanghaha131422 分钟前
Python进阶教程:23_Scrapy 爬虫框架 零基础超详细教程
python·信息可视化
积硅步致千里25 分钟前
Word 里的 .wmf 其实是 EMF:一次 metafile 转 PNG 排障
前端·后端
爱读源码的大都督38 分钟前
DeepSeek面试官问:生产RAG系统回答不准确,该如何定位和优化?这样回答,能让面试官当场给你Offer!
java·后端·python
“AI国潮设计-小江”1 小时前
【Python实战】SDXL精准控制“普宁英歌舞×星空蛋糕”IP落地,附核心Prompt与商用授权思路
开发语言·人工智能·python·prompt·aigc