版本说明:
Django: V4.2.20
Django Rest Framework: V3.15.2
一、核心封装流程示意图
二、源码实现解析
1. 请求封装入口(APIView.dispatch)
# rest_framework/views.py
class APIView(View):
def dispatch(self, request, *args, **kwargs):
# 将原生request封装为DRF Request对象
request = self.initialize_request(request, *args, **kwargs)
self.request = request # 替换原生request对象
try:
# 执行认证/权限校验
self.initial(request, *args, **kwargs)
# 调用对应的HTTP方法处理器
response = handler(request, *args, **kwargs)
except Exception as exc:
response = self.handle_exception(exc)
# 渲染响应内容
self.response = self.finalize_response(request, response, *args, **kwargs)
return self.response
2. Request对象初始化源码
# rest_framework/request.py
class Request:
def __init__(self, request, parsers=None, authenticators=None):
self._request = request # 存储原生Django请求对象
self.parsers = parsers or ()
self.authenticators = authenticators or ()
self._data = Empty # 延迟加载请求体数据
@property
def data(self):
# 统一解析不同格式的请求体
if not _hasattr(self, '_full_data'):
self._load_data_and_files()
return self._full_data
def __getattr__(self, attr):
# 代理访问原生request属性,此处不同的版本可能代码有差异,逻辑是一致的
try:
_request = self.__getattribute__("_request")
return getattr(_request, attr)
except AttributeError:
return self.__getattribute__(attr)
三、关键实现原理
1. 请求数据统一处理
DRF通过Parser解析器类
自动处理不同Content-Type
的请求数据:
- 表单数据:request.POST → request.data
- JSON数据:自动解析为字典格式
- 文件上传:request.FILES → request.data
2. 属性访问代理机制
通过__getattr__
方法实现属性穿透访问:
# 访问原生request的method属性
drf_request.method → drf_request._request.method
# 访问原生request的GET参数
drf_request.query_params → drf_request._request.GET
3. 请求处理流程优化
# 传统Django视图
def view(request):
json_data = json.loads(request.body) # 需要手动解析
# 业务处理...
# DRF视图
class APIView(APIView):
def post(self, request):
data = request.data # 自动解析后的数据
# 直接使用结构化数据
四、完整封装流程图解
五、开发注意事项
- 避免直接访问原生request,应通过request._request访问原生对象
- 自定义解析器配置,在settings.py中配置:
REST_FRAMEWORK = {
'DEFAULT_PARSER_CLASSES': [
'rest_framework.parsers.JSONParser',
'rest_framework.parsers.FormParser'
]
}
- 请求方法扩展
DRF Request新增方法:
request.query_params # 替代request.GET
request.user # 通过认证后的用户对象
request.auth # 认证令牌等凭证信息
六、性能优化建议
减少重复数据解析,对频繁访问的request.data进行缓存
选择性禁用解析器,在视图级别指定解析器:
class MyAPI(APIView):
parser_classes = [JSONParser]
- 批量请求处理,使用drf-flex-fields等扩展库优化大数据量请求
通过上述封装机制,DRF实现了:
- 请求处理逻辑标准化
- 不同数据格式的统一访问接口
- 认证/权限系统的无缝集成
- 开发者体验的大幅提升