概述
Response
類是一個智能的 HTTP 響應類,能夠根據客戶端請求的內容類型(Content-Type)自動將數據渲染成合適的格式(JSON、XML、HTML等)。
基本用法
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 實例
# 正確用法
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 (服務器錯誤)
return Response(data, status=201) # 創建成功
return Response({'error': 'Not found'}, status=404) # 資源不存在
3. template_name
(模板名稱)
- 作用: 指定用于渲染的模板(當需要HTML輸出時)
- 使用場景: 通常用于可瀏覽的API或需要HTML格式的響應
# 返回HTML格式的響應
return Response({'users': user_list},template_name='user_list.html'
)
4. headers
(自定義頭部)
- 作用: 添加自定義HTTP頭部
- 類型: 字典
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 中的使用
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import statusclass 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
類的強大之處在于它能自動處理多種格式:
# 客戶端請求 Accept: application/json → 返回JSON
# 客戶端請求 Accept: text/html → 返回HTML(可瀏覽API)
# 客戶端請求 Accept: application/xml → 返回XMLdef api_endpoint(request):data = {'user': {'id': 1,'name': 'John Doe','email': 'john@example.com'}}return Response(data)
注意事項
- 不要直接傳遞Serializer實例:必須使用
serializer.data
或serializer.errors
- 狀態碼使用常量:建議使用
rest_framework.status
中的常量而不是數字 - 頭部設置:使用
headers
參數而不是直接操作響應頭 - 內容協商:DRF會自動處理內容協商,通常不需要手動指定
content_type
總結
Response
類是 DRF 中構建 API 響應的標準方式,它提供了:
- 自動的內容協商和渲染
- 靈活的響應配置
- 與 DRF 序列化器的無縫集成
- 符合 RESTful 原則的響應構建
通過合理使用這些參數,你可以構建出符合各種需求的 API 響應。