#路由层 views._Book.as_view()
from django.views import View
class _Book(View):
def get(self,request,*args,**kwargs):
return HttpResponse('get请求')
def post(self,request,*args,**kwargs):
return HttpResponse('post请求')
1 _Book继承View这个类。
2 as_view 是绑定给类View的方法。
3 as_view里的方法view是闭包函数,返回了view方法的内存地址。
@classonlymethod
def as_view(cls, **initkwargs):
def view(request, *args, **kwargs):
# 返回了dispatch方法,先在对象里找,没有的话再去类里找。
return self.dispatch(request, *args, **kwargs)
return view
4 执行了View类的dispatch
def dispatch(self, request, *args, **kwargs):
# 如果是get请求
# request.method.lower() 是get字符串,下面条件符合
if request.method.lower() in self.http_method_names:
#我们写的Book视图类的get方法
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
# get(request, *args, **kwargs)---->执行Book视图类中的get方法,再往后就跟FBV一样了
return handler(request, *args, **kwargs)
===================================================================================
5 扩展,如果在Book视图类中重写dispatch方法
-可以实现,在get,post方法执行之前或者之后执行代码,完成类似装饰器的效果
class _Book(View):
def dispatch(self, request, *args, **kwargs):
# 加代码
# 必须继承父类的dispatch方法才能分发到get方法和post方法。
response = super().dispatch(request, *args, **kwargs)
# 加代码
return response
def get(self,request,*args,**kwargs):
return HttpResponse('get请求')
def post(self,request,*args,**kwargs):
return HttpResponse('post请求')