Django REST Framework `Request` 对象
Django REST Framework Request
对象
1. 概念
- 在 DRF 中,
Request
对象是对 Django 原生HttpRequest
的封装。 - 作用:
- 统一处理各种客户端请求(GET、POST、PUT、PATCH、DELETE 等)。
- 提供更丰富、更易用的接口来访问请求数据和元信息。
- 支持内容解析、认证、权限、文件上传等功能。
2. Request
对象的来源
-
当客户端发起 HTTP 请求时,Django 会生成一个
HttpRequest
对象。 -
DRF 在视图中接收到
HttpRequest
后,会封装成 DRF 的Request
对象:HttpRequest → Request
-
封装增强了:
- 数据访问:支持 JSON、表单、文件等多种格式统一处理。
- 认证信息:通过 DRF 的认证机制,封装
user
、auth
。 - 内容协商:根据客户端
Accept
头自动选择解析器。
3. 主要属性
.data
- 请求体数据(POST、PUT、PATCH)解析后的结果。
- 统一为字典或列表,支持 JSON、表单数据等格式。
.query_params
- URL 查询参数(GET 参数)
- 类似
request.GET
,但统一在 DRF 中使用。
.method
- 请求方法:GET、POST、PUT、PATCH、DELETE 等。
.user
- 当前请求的用户对象,由 DRF 认证系统解析。
.auth
- 当前请求的认证信息,例如 Token、Session 等。
.FILES
/.files
- 上传的文件集合。
.content_type
- 请求体的内容类型,例如
application/json
。
- 请求体的内容类型,例如
.stream
- 请求体的原始字节流,适合自定义解析器读取。
4. 请求数据解析机制
- DRF 通过 Parser(解析器) 将请求体转换成
.data
:JSONParser
→ JSON 数据FormParser
→ 表单数据MultiPartParser
→ 文件上传
- 使用
.data
时,DRF 会自动选择合适的解析器,无需手动解析。
5. 与 Django 原生 HttpRequest 的区别
特性 | HttpRequest | DRF Request |
---|---|---|
数据访问 | request.POST , request.GET | request.data , request.query_params |
文件访问 | request.FILES | request.FILES (兼容) |
用户认证 | request.user | request.user , request.auth (增强) |
数据解析 | 需要手动处理 JSON | 自动解析 JSON、表单、文件 |
可扩展性 | 需要自己处理内容协商 | 内置 Parser、Renderer、认证、权限等 |
6. 使用场景
- 获取请求数据:
.query_params
→ GET 参数.data
→ POST / PUT / PATCH 请求体
- 文件上传:
.FILES
/.files
→ 文件对象
- 用户认证与权限检查:
.user
/.auth
→ 用于视图权限判断
- 自定义解析器或中间件:
.stream
→ 原始请求体流
总结:
- DRF 的
Request
是对 DjangoHttpRequest
的封装,提供统一的数据访问接口、自动解析机制和认证信息。 - 核心属性:
.data
、.query_params
、.user
、.auth
、.FILES
- 核心作用:简化 REST API 请求处理,让视图直接处理解析后的数据和认证信息。