当前位置: 首页 > 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.lryc.cn/news/617115.html

相关文章:

  • 低代码开发实战案例,如何通过表单配置实现数据输入、数据存储和数据展示?
  • 智能双行框!百度全量上线AI搜索,是革新浪潮还是昙花一现?
  • ECCV 2024 论文解读丨具身智能、机器人研究最新突破创先点分享合集
  • SQL刷题
  • 使用行为树控制机器人(三) ——通用端口
  • 想冲华为AI认证,怎么选方向?
  • 疯狂星期四文案网第36天运营日记
  • 【Docker-Day 13】超越默认Bridge:精通Docker Host、None与自定义网络模式
  • IDE认知革命:JetBrains AI Assistant插件深度调教手册(终极实战指南)
  • 随身WiFi技术军备赛白热化:WiFi6架构下放中端市场,格行中兴华为三足鼎立;从芯片到场景的 10 款标杆产品深度解析
  • 标准IO详解(fgets、gets、fread、fwrite、fseek 等应用)
  • 面试题-----微服务业务
  • 【PRML】分类
  • VSCode编辑器常用24款基础插件
  • HRM分层推理模型在医疗AI上的应用探析
  • word的正则替换
  • FlinkSql(详细讲解二)
  • 时序数据库选型指南:Apache IoTDB为何成为工业物联网首选?
  • Apache IoTDB 全场景部署:基于 Apache IoTDB 的跨「端-边-云」的时序数据库 DB+AI
  • “底层闭源 + Lua 脚本” 开发模式
  • 鸿蒙Des 加密解密 C++版本
  • vscode的wsl环境,怎么打开linux盘的工程?
  • 第十六届蓝桥杯大赛青少组 C++ 省赛真题解析(2025年8月10日)
  • 未来物联网大模型:物联网硬件+底层驱动+AI 自动生成和调优LUA脚本,
  • 【排序算法】⑤冒泡排序
  • 编程技能:递归
  • 【Lua】XLua加载lua文件
  • (一)vscode搭建espidf环境
  • Linux Web服务器与WordPress部署笔记
  • 量子神经网络:从NISQ困境到逻辑比特革命的破局之路