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

相关文章:

  • (Arxiv-2025)Phantom:通过跨模态对齐实现主体一致性视频生成
  • 什么情况下会导致日本服务器变慢?解决办法
  • 第2节 大模型分布式推理架构设计原则
  • AIStarter修复macOS 15兼容问题:跨平台AI项目管理新体验
  • MySQL权限管理和MySQL备份
  • 大模型落地实践:从技术重构到行业变革的双重突破
  • C/C++练习面试题
  • Selenium动态元素定位
  • 【运维进阶】WEB 服务器
  • 学习观察和行动:机器人操作中任务-觉察的视图规划
  • docker安装searxng
  • C语言如何安全的进行字符串拷贝
  • 云原生环境 Prometheus 企业级监控实战
  • Centos 用http ftp搭建本地yum源 保姆级教程
  • QML开发:动画元素
  • 企业高性能web服务器Nginx的详细部署(实战篇)
  • [4.2-2] NCCL新版本的register如何实现的?
  • ResponseBodyAdvice是什么?
  • ChatML vs Harmony:深度解析OpenAI全新对话结构格式的变化
  • ARM基础概念 day51
  • Redis应⽤-缓存与分布式锁
  • Vue3从入门到精通:3.1 性能优化策略深度解析
  • 基于SpringBoot+Uniapp的血压监控小程序(Echarts图形化分析)
  • OV5640 相机开发流程
  • Apollo平台下相机和激光雷达手眼联合标定
  • 游戏引擎(Unreal Engine、Unity、Godot等)大对比:选择最适合你的工具
  • 2025世界机器人大会,多形态机器人开启商业化落地浪潮
  • ubuntu24.04设置登陆背景图片
  • 工业相机与智能相机的区别
  • word的正则替换