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

相关推荐
leobertlan4 小时前
2025年终总结
前端·后端·程序员
面向Google编程4 小时前
从零学习Kafka:数据存储
后端·kafka
冷雨夜中漫步5 小时前
Python快速入门(6)——for/if/while语句
开发语言·经验分享·笔记·python
郝学胜-神的一滴5 小时前
深入解析Python字典的继承关系:从abc模块看设计之美
网络·数据结构·python·程序人生
百锦再5 小时前
Reactive编程入门:Project Reactor 深度指南
前端·javascript·python·react.js·django·前端框架·reactjs
易安说AI5 小时前
Claude Opus 4.6 凌晨发布,我体验了一整晚,说说真实感受。
后端
易安说AI5 小时前
Ralph Loop 让Claude无止尽干活的牛马...
前端·后端
易安说AI5 小时前
用 Claude Code 远程分析生产日志,追踪 Claude Max 账户被封原因
后端
颜酱6 小时前
图结构完全解析:从基础概念到遍历实现
javascript·后端·算法
喵手7 小时前
Python爬虫实战:旅游数据采集实战 - 携程&去哪儿酒店机票价格监控完整方案(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·采集结果csv导出·旅游数据采集·携程/去哪儿酒店机票价格监控