Django Request 与 DRF Request 的区别

发布于:2025-08-12 ⋅ 阅读:(23) ⋅ 点赞:(0)

在 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. 实际使用建议

  1. 在 Django View 中

    • 使用 request.GET 获取查询参数

    • 使用 request.POST 获取表单数据

    • 使用 request.body 手动解析 JSON 等数据

  2. 在 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. 重要注意事项

  1. 在 DRF 中

    • 不要使用 request.POST 或 request.GET,而应使用 request.data 和 request.query_params

    • request.data 是"全能的",包含所有解析后的数据

  2. 性能考虑

    • DRF 的 Request 包装会带来轻微性能开销

    • 对于简单API,纯Django可能更快

  3. 兼容性

    • DRF Request 仍然可以通过 request._request 访问原始 Django Request

    • 所有原始 Django Request 的属性和方法仍然可用

理解这些区别有助于您根据项目需求选择合适的框架和请求处理方式。


网站公告

今日签到

点亮在社区的每一天
去签到