在 Django 和 Django REST Framework (DRF) 中,request
对象虽然相似,但有一些重要区别。以下是您提供的两个视图类中 request 对象的对比分析:
1. 基本区别
特性 | Django 的 Request (django.http.HttpRequest ) |
DRF 的 Request (rest_framework.request.Request ) |
---|---|---|
基类 | 原生 Django HttpRequest | 对 Django HttpRequest 的包装扩展 |
数据访问 | 直接访问属性 | 通过 .data 和 .query_params 属性访问 |
方法支持 | 原生 HTTP 方法 | 增加了 .method 属性 |
内容协商 | 不支持 | 内置内容协商支持 |
认证系统 | 基础认证 | 完善的认证系统 |
解析器 | 无 | 多种请求体解析器 |
2. 详细对比
2.1 数据访问方式
Django View (MyView
):
def post(self, request, *args, **kwargs):
# 获取 POST 数据
post_data = request.POST # 表单数据
body_data = request.body # 原始字节数据
# 获取查询参数
query_params = request.GET
return JsonResponse(...)
DRF APIView (InfoView
):
def post(self, request, *args, **kwargs):
# 获取请求数据 (自动解析 JSON/表单/多部分等)
request_data = request.data # 统一接口
# 获取查询参数 (推荐方式)
query_params = request.query_params
return Response(...)
2.2 主要属性/方法对比
功能 | Django Request | DRF Request |
---|---|---|
请求体数据 | request.POST (仅表单) |
request.data (自动解析各种格式) |
request.body (原始字节) |
||
查询参数 | request.GET |
request.query_params (更语义化) |
方法判断 | request.method |
request.method |
用户认证 | request.user (基本) |
request.user (带DRF认证系统) |
request.auth (无) |
request.auth (认证令牌等) |
|
文件上传 | request.FILES |
request.FILES (也在request.data 中) |
3. DRF Request 的增强特性
3.1 内容协商
DRF Request 自动处理内容类型协商:
# 根据 Accept 头自动选择渲染器 return Response(data) # 可能是 JSON/XML/HTML 等
3.2 数据解析
自动根据 Content-Type 解析请求体:
application/json → 自动解析为字典
application/x-www-form-urlencoded → 表单数据
multipart/form-data → 文件上传
3.3 认证系统
# 可访问认证信息 def get(self, request): user = request.user # 经过DRF认证系统 auth = request.auth # 认证令牌等
4. 实际使用建议
在 Django View 中:
使用
request.GET
获取查询参数使用
request.POST
获取表单数据使用
request.body
手动解析 JSON 等数据
在 DRF APIView 中:
总是使用
request.data
获取请求体数据使用
request.query_params
获取查询参数利用
request.user
和request.auth
进行认证
5. 示例代码对比
Django View 处理 JSON 请求
import json
from django.http import JsonResponse
from django.views import View
class MyJsonView(View):
def post(self, request):
try:
data = json.loads(request.body)
return JsonResponse({"received": data})
except json.JSONDecodeError:
return JsonResponse({"error": "Invalid JSON"}, status=400)
DRF APIView 处理 JSON 请求
from rest_framework.views import APIView
from rest_framework.response import Response
class MyDRFView(APIView):
def post(self, request):
# 自动解析 JSON,无需手动处理
return Response({"received": request.data})
6. 重要注意事项
在 DRF 中:
不要使用
request.POST
或request.GET
,而应使用request.data
和request.query_params
request.data
是"全能的",包含所有解析后的数据
性能考虑:
DRF 的 Request 包装会带来轻微性能开销
对于简单API,纯Django可能更快
兼容性:
DRF Request 仍然可以通过
request._request
访问原始 Django Request所有原始 Django Request 的属性和方法仍然可用
理解这些区别有助于您根据项目需求选择合适的框架和请求处理方式。