Django rest framework学习之CBV基本使用
我们在学习Django rest framework之前需要对Django框架有一定知识储备,否则你学起来会很吃力。这里不过多介绍DRF框架,我们直接进入正题。
CBV与FBV
我们在初识Django框架的时候,一个完整的功能如下代码
路由:
from django.urls import re_path
from app01.view import index
urlpatterns = [
re_path('index/',index.index,name='index/'),
]
view:
from django.shortcuts import render,HttpResponse
def index(request):
if request.method == 'GET':
return render(request,'index.html')
elif request.method == 'POST:
return HttpResponse('OK!')
FBV中的F指的就是function,翻译来就是函数的意思。可以看出以上写法就是使用函数式编程实现的,优点是简洁,但是不利于扩展,如果该路由的请求包含GET、POST、PUT、DELETE等方法的时候我们就需要写很多的if elif判断,这个时候CBV就显得很人性化。接下来我们刨析Django的源码。
CBV写法如下
路由:
from django.urls import re_path
from app01 import views
urlpatterns = [
re_path('index/',views.Index.as_view(),name='index/'),
]
view:
from django.shortcuts import HttpResponse
from django.views.generic import View
class Index(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')
def patch(self,request,*args,**kwargs):
return HttpResponse('PATCH')
以上就是CBV的写法,注意路由层as_view()和view中需要引入的View需要搭配使用,这个是固定的写法。在CBV的C指的是python中的class,也就是面向对对象,在我们刨析Django源码之前,你也需要有面向对象的知识储备。在前后端分离的项目中,我们Django后端只需要使用HttpResponse来返回数据给前端。
刨析CBV的View
# Django框架的View底层源码之请求方式的判定
class View:
"""
我们看在Django框架底层View中的http_method_names,它是一个列表,里面一共有8种请求方式,也就是说我们在CBV的def方法可以有8种。
"""
http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
def dispatch(self, request, *args, **kwargs):
# dispatch函数是用CBV视图用来判断请求方式的函数,我们在view种来验证。
if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs)
# view写法
from django.shortcuts import render,HttpResponse
from django.views.generic import View
class Index(View):
# 我们在CBV视图中写一个dispatch函数,可以看出CBV是基于反射实现根据不同的方法,执行不同的方法。
def dispatch(self,request,*args,**kwargs):
# 我们将请求方式赋值给a,注意这里要加lower。
a = getattr(self,request.method.lower())
# 接下来我们实例化a,并将它赋值给ret。
ret = a(request,*args,**kwargs)
print(a)
# a为没有实例化之前的内存地址。
# <bound method Index.post of <app01.views.Index object at 0x117c03470>>
print(ret)
# ret是我们实例化之后的数据,可以清楚的看它是如何判断请求方式的。
# <HttpResponse status_code=200, "text/html; charset=utf-8">
return ret
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')
def patch(self,request,*args,**kwargs):
return HttpResponse('PATCH')
CBV反射的原理如下:
URL -> dispatch方法 -> (反射执行其他:GET/POST/PUT/DELETE)