Django Rest Framework的request源码解析
1. Django CBV下的request#
# 路由层 from app import views urlpatterns = [ url(r'^cbv/', views.CBVTest.as_view()), ]
# 视图层 from django.shortcuts import render, HttpResponse from django.views import View class CBVTest(View): # 通过调度(dispatch)分发请求 def dispatch(self, request, *args, **kwargs): pass super().dispatch(request, *args, **kwargs) pass def get(self, request): return render(request, 'cbv.html') def post(self, request): return HttpResponse('cbv post method')
<!-- 模板层 --> <form action="/cbv/" method="post"> {% csrf_token %} <input type="text" name="usr"> <button type="submit">提交</button> </form>
2. DRF的简单示例#
# 1)安装drf:pip3 install djangorestframework # 2)settings.py注册app:INSTALLED_APPS = [..., 'rest_framework'] # 3)基于cbv完成满足RSSTful规范的接口
# 路由层 from app import views urlpatterns = [ url(r'^drf/', views.Drf.as_view()), ]
# 视图层 from rest_framework.views import APIView from rest_framework.response import Response
user_list = [{'id': 1, 'name': 'Bob'}, {'id': 2, 'name': 'Tom'}] class Drf(APIView): def get(self, request, *args, **kwargs): return Response({ 'status': 0, 'msg': 'ok', 'results': user_list }) def post(self, request, *args, **kwargs): # request对formdata,urlencoded,json三个格式参数均能解析 name = request.data.get('name') id = len(user_list) + 1 user = {'id': id, 'name': name} user_list.append(user) return Response({ 'status': '0', 'msg': 'ok', 'results': user })
3.request流程#
# as_view() # 核心走了父类as_view view = super(APIView, cls).as_view(**initkwargs) # 返回的是局部禁用csrf认证的view视图函数 return csrf_exempt(view) # dispatch(self, request, *args, **kwargs) # 二次封装request对象 request = self.initialize_request(request, *args, **kwargs) # 自定义request规则 self.initial(request, *args, **kwargs) # initialize_request(self, request, *args, **kwargs) # 原生request封装在request._request # initial(self, request, *args, **kwargs) # 认证 self.perform_authentication(request) # 权限 self.check_permissions(request) # 频率 self.check_throttles(request)
走一遍:
1 as_view()#
查看APIview 源码,我们可以发现它的 as_view()方法同样返回了view(),但是它的view其实是执行了父类的as_view()方法,所以也就是说APIView的as_view()方法依然返回了View的view() 如下图:
2. dispath()#
进而继续跟进源码,View的view()方法返回self.dispatch(),但此时的self不是 View的实例对象,而是APIView的对象,所以我们需要去看APIView中的dispatch 方法,如下图所示
分类:
RESTful
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2018-04-10 第十一篇 中间件