当前位置: 首页 > news >正文

Django Request 与 DRF Request 的区别

在 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.GETreturn JsonResponse(...)

DRF APIView (InfoView):

def post(self, request, *args, **kwargs):# 获取请求数据 (自动解析 JSON/表单/多部分等)request_data = request.data  # 统一接口# 获取查询参数 (推荐方式)query_params = request.query_paramsreturn Response(...)

2.2 主要属性/方法对比

功能Django RequestDRF Request
请求体数据request.POST (仅表单)request.data (自动解析各种格式)
request.body (原始字节)
查询参数request.GETrequest.query_params (更语义化)
方法判断request.methodrequest.method
用户认证request.user (基本)request.user (带DRF认证系统)
request.auth (无)request.auth (认证令牌等)
文件上传request.FILESrequest.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 Viewclass 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 Responseclass 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 的属性和方法仍然可用

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

http://www.dtcms.com/a/325484.html

相关文章:

  • 从 GPT-2 到 gpt-oss:架构进步分析
  • 企业级 IT 运维服务平台数据备份方案:基于 rsync 的自动化实现
  • 时钟频率与带宽
  • 低延迟RTSP|RTMP视频链路在AI驱动无人机与机器人操控中的架构实践与性能优化
  • FlinkSql(详细讲解二)
  • 深入解析游戏引擎(OGRE引擎)通用属性系统:基于Any类的类型安全动态属性设计
  • 服务器配置实战:从 “密码锁” 到 “分工协作” 的知识点详解
  • 【linux】企业级WEB应用服务器tomcat
  • Uipath Studio中的文件管理
  • 基于Springboot+UniApp+Ai实现模拟面试小工具九:移动端框架搭建
  • 4种无需WiFi将数据从iPhone传输到iPhone的方法
  • GraphRAG:用知识图谱赋能检索增强生成,攻克复杂推理难题
  • 【MySQL基础篇】:MySQL索引——提升数据库查询性能的关键
  • 力扣109:有序链表转换二叉搜索树
  • 深入浅出设计模式——行为型模式之观察者模式 Observer
  • vlan (hybird) 实验
  • Python bisect 库详细介绍
  • 【Java基础】你认为Java的优势是什么
  • 【C语言入门级教】函数指针变量
  • 当 WAF 遇上黑客——一次混合式攻击的应急复盘
  • GO学习记录三
  • 5G 非地面网络(NTN)最专业的方案
  • Docker 详解(保姆级安装+配置+使用教程)
  • 【MySQL✨】服务器安装 MySQL 及配置相关操作
  • 零 shot 语义+在线闭环:深度学习让机器人学会“主动”
  • JavaWeb-后端Web实战(IOC + DI)
  • 第八篇:交互入门:鼠标拾取物体
  • TRS(总收益互换)系统架构设计:多市场交易的技术实现分析
  • 网络编程~
  • 套接字技术、视频加载技术、断点续传技术