昨天听老男孩it教育视频课的时候听到了fbv和cbv视图方式, 以前用django的时候用过这两种实现方式, 但是不知道专业的名字和区别, 直到昨天get到了.
一. 概念
FBV(function base views) 顾名思义基于函数的视图类
CBV(class base views)基于类的视图类
至于区别呢? 我觉得只是写法上的不一样, 实现的结果都是一样的, 我比较喜欢用CBV模式, 因为在Django中内部帮我做了请求方式的判断, 无需用户实现方法判断逻辑, 来看看代码的区别吧
二. 实现代码
1.FBV
fbv就是在url中一个路径对应一个函数. 在工程下的url中写如下代码
from api import views
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('api.urls')),
url(r'^test/', views.test_fbv)
]
然后在api的views中写如下测试函数:
def test_fbv(request):
if(request.method == 'POST'):
return HttpResponse("post")
if (request.method == 'PUT'):
return HttpResponse("put")
if (request.method == 'GET'):
return HttpResponse("get")
然后运行整个整个工程, 命令行输入python manage.py runserver
因为我的是linux系统, 就选用restclient这个插件进行api的测试
点完send后再看看 返回什么数据, 在response中可以 看到get
可以看到和我们想象的结果一样, 那我们在试试其他的请求方式, 比如put, post等 和我们代码写的一样, 这里我就不截图了
2. CBV
CBV就是在url中一个路径对应一个类
在上述工程下的urls下添加如下代码
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('api.urls')),
url(r'^test_FBV/', views.test_FBV),
url(r'^test_CBV/', views.test_CBV.as_view())
]
注意当用cbv模式写url时类后面一定要用as_view()方法, 这是规定格式
然后在api下的views文件中写如以下逻辑代码
from django.views import View
class test_CBV(View):
# 以get形式访问会执行get函数,一般情况下获取数据
def get(self, *args, **kwargs):
return HttpResponse('get')
# 以post形式访问的话会执行post函数,一般情况下发送数据
def post(self, *args, **kwargs):
return HttpResponse('post')
这里做几点说明:
1.cbv模式下的视图类一定要继承Views类
2. 然后重定向get, post, put请求方法等, 实现不同的请求方法实现不同的逻辑代码, api验证这部分我就不说了, 直接用restclient测试就可以了