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

相关推荐
a20063801210 分钟前
ply(python版本的flex/bison or Lex/Yacc)
python
wokaoyan198117 分钟前
逻辑推演题——谁是骗子
python
九年义务漏网鲨鱼18 分钟前
利用AI大模型重构陈旧代码库 (Refactoring Legacy Codebase with AI)
python
AskHarries23 分钟前
Toolhub — 一个干净实用的在线工具集合
前端·后端
滑水滑成滑头30 分钟前
**标题:发散创新:智能交通系统的深度探究与实现**摘要:本文将详细
java·人工智能·python
一个专注写bug的小白猿43 分钟前
.net实现ftp传输文件保姆教程
后端·c#·.net
闭着眼睛学算法1 小时前
【双机位A卷】华为OD笔试之【哈希表】双机位A-跳房子I【Py/Java/C++/C/JS/Go六种语言】【欧弟算法】全网注释最详细分类最全的华子OD真题题解
java·c语言·c++·python·算法·华为od·散列表
无限码力1 小时前
华为OD技术面真题 - Python开发 - 2
python·华为od·华为od技术面真题·华为od技术面八股·华为od技术面python八股·华为od面试python真题·华为odpython八股
青皮桔1 小时前
Java+OpenCV实现图片切割
java·后端·opencv·计算机视觉
兮动人1 小时前
Spring中@Configuration注解的proxyBeanMethods属性详解
java·后端·spring