在 view 文件中编写一个类, 并配置好路由
- class Test(View):
- def get(self, request, *args, **kwargs):
- return HttpResponse('cbv_get')
- def post(self, request, *args, **kwargs):
- return HttpResponse('cbv_post')
- url(r'test/',views.Test.as_view()),
通过 as_view() 进入查看源码
实际上 views.Test.as_view() 是存的一个内存地址, 加括号被调用, 执行了 as_view 方法里的 view 方法, 具体看下图:
核心是 dispatch 方法, 在 dispatch 方法中完成了分发功能.
若要在 Test 类中自定义 dispatch 方法, 代码如下:
- class Test(View):
- def dispatch(self, request, *args, **kwargs):
- # 加代码
- obj = super().dispatch(self, request, *args, **kwargs)
- # 加代码
- # 实现了一个类似装饰器的效果, 比如 post 请求, 如果是 JSON, 手动从 request 里 body 取出来 再转一下
- # 或者走的时候加点 cookie
- return obj
- def get(self, request, *args, **kwargs):
- return HttpResponse('cbv_get')
- def post(self, request, *args, **kwargs):
- return HttpResponse('cbv_post')
流程总结:
CBV 模型
在 views 中写一个类, 继承 View, 里面写 get 方法, post 方法
在路由中配置: url(r'^test/', views.Test.as_view()), 实际上第二个参数位置, 放的还是一个函数内存地址
当请求来了, 就会执行第二个参数 (request, 参数), 本质上执行 view()
view 内部调用了 dispatch() 方法
dispatch 分发方法, 根据请求方式不同, 执行的方法不同
来源: https://www.cnblogs.com/wanlei/p/10403476.html