Django-视图CBV执行流程详解
2019-01-08 本文已影响47人
f050d162bcc1
- FBV和CBV其实就是要么写函数要么写类,那么内部原理是怎么实现?
FBV写法
def func_view(request):
"Function views"
if request.method == "GET":
return HttpResponse("GET-请求")
elif request.method == "POST":
return HttpResponse('POST-请求')
elif request.method == "PUT":
return HttpResponse('PUT-请求')
elif request.method == "DELETE":
return HttpResponse('DELETE-请求')
else:
return HttpResponse("不支持的请求类型")
CBV写法
class MyClassView(View):
def get(self, request, *args, **kwargs):
return HttpResponse("GET-请求")
def post(self, request, *args, **kwargs):
return HttpResponse("POST-请求")
def put(self, request, *args, **kwargs):
return HttpResponse("PUT-请求")
def delete(self, request, *args, **kwargs):
return HttpResponse("DELETE-请求")
原理
- FBV可以直接通过路由,调用到相应的视图函数,那么CBV呢?
![](https://img.haomeiwen.com/i728151/c7299a432eedd70c.png)
- 在我们的MyClassViewl里面没有as_view(),所以我们可以去父类找
![](https://img.haomeiwen.com/i728151/a4f3a4c6b144bf25.png)
- 父类的as_view()方法
![](https://img.haomeiwen.com/i728151/5f18cb6672ecd0c3.png)
- 在as_view()中也返回一个view
![](https://img.haomeiwen.com/i728151/d846d7fd3b4a6aa9.png)
- 分析as_view()当中的代码,调用了dispatch()方法
![](https://img.haomeiwen.com/i728151/93d2e3301367c24d.png)
- 在分析dispatch()方法前,我们先看看,当请求进来,通过URL先执行了as_view()函数,本质还是在执行内部的view()函数,而view()函数内部是执行了dispatch()方法
![](https://img.haomeiwen.com/i728151/aec13bdade01113e.png)
- 不管什么请求进来,都执行dispatch()
![](https://img.haomeiwen.com/i728151/65f44b1ca5d43db1.png)
- 由于我们MyClassView里面没有dispatch()方法,所以会调用父类的dispatch(),如果我们有,那么会调用我们自己写的dispatch()方法
![](https://img.haomeiwen.com/i728151/391b6f661cba21b3.png)
- postman验证(http://127.0.0.1:8000/myclass_view/) 我们发现调用了我们自己写的dispatch()方法
![](https://img.haomeiwen.com/i728151/98c8141448c58371.png)
- 我们可以不看父类如何实现,我们可以自己尝试的写一下
![](https://img.haomeiwen.com/i728151/2b7a59cdac8f715e.png)
- 通过postman验证,发现也完成了这个相同的功能
![](https://img.haomeiwen.com/i728151/a500445b5dcbc3f7.png)
- 修正错误
![](https://img.haomeiwen.com/i728151/9628c571cf96438e.png)
- postman验证效果
![](https://img.haomeiwen.com/i728151/f8e9018d5a479167.png)
- 观察父类的dispatch做什么?(其实本质就是基于反射实现)
![](https://img.haomeiwen.com/i728151/d15c140bf9722e62.png)
结论: CBV基于反射实现根据请求方式不同,执行不同方法
原理总结:
路由url -- > view函数 --> dispatch方法(根据反射来执行:GET/POST/PUT/DELETE等等....)