FBV视图函数和CBV视图类

FBV视图函数

FBV(function base views) 就是在视图里使用函数处理请求,面向过程式的编程,

CBV视图类

#urls.py路由写法,其中views.login.as_view()中的login值得是处理这个路径相关请求的视图类
url(r'^login/', views.login.as_view()),


from django.views import View

#请求login路径时执行的类
class login(View):
    #重构父类View类的dispatch方法可以在处理请求之前和请求完成之后,添加一些处理的逻辑,
    #父类View的dispatch方法查看请求的类型,然后通过反射来调用本类中的对应函数,来处理请求
    #如果没有找到请求方式对应的函数,就会执行父类中dispatch的第三个参数,也就是报错
    def dispatch(self, request, *args, **kwargs):
        print(f'{request.method}请求来了')
        ret = super().dispatch(request, *args, **kwargs)
        print('逻辑处理完成')
        return ret
	#如果是处理GET请求就直接定义get方法,父类View中的dispatch方法通过反射的方式来获取get函数来处理GET请求
    def get(self, request):
        print('111')
        return render(request, 'login.html')
	#如果是处理POST请求就直接定义get方法,父类View中的dispatch方法通过反射的方式来获取POST函数来处理GET请求
    def post(self, request):
        print('222')
        return HttpResponse('登陆成功')
    
#请求home路径时执行的类
class home(View):
    def get(self, request):
        return render(request, 'home.html')

    def post(self, request):
        return HttpResponse('登陆成功')

    
#视图类的源码流程:
views.Addclass.as_view()
1.程序加载,执行Addclass的类方法as_view
	在本类中未找到,由于该类继承了View,因此去父类找找看,发现存在
2.调用父类as_view的类方法(@classonlymethod)-->cls为Addclass
该方法返回重点实现任务:
    1.定义了view方法
    2.并返回view
    请求到来时,执行下面操作
    3.结果变成执行view
    4.view的执行结果就是views.Addclass.as_view()的执行结果

3.调用View的view方法
    1.self = cls(**initkwargs)因此self为Addclass类
    2.该函数返回self.dispatch(request, *args, **kwargs)
    3.需要先执行dispatch,并把执行结果返回给view函数

4.执行View的dispatch方法
    1.获取request.method请求方式
    2.通过字符串的方式getattr(Addclass,'get')赋值给handler
    3.若不存在则返回报错信息给handler
    4.执行handler-->相当于执行get(request,*args,**kwargs)
    5.把结果return给view

视图类加装饰器

from django.views import View
#如果要给视图类添加装饰器就要使用method_decorator这个方法
from django.utils.decorators import method_decorator

# 方式一:类装饰器,不常用
@method_decorator(func, name='get')  # 给类中的某个方法添加装饰器,只能指向一个方法,
@method_decorator(func, name='post')  # 如果要加多个,就再加一个装饰器,指向这个方法,
class login(View):

    # 方式二:给dispatch添加装饰器,在请求处理之前和处理之后添加一些逻辑.
    @method_decorator(func)
    def dispatch(self, request, *args, **kwargs):
        print(f'{request.method}请求来了')
        ret = super().dispatch(request, *args, **kwargs)
        print('逻辑处理完成')
        return ret

    # 方式三:给执行的请求方式添加一个装饰器,在处理这个请求的时候,添加一些逻辑
    @method_decorator(func)
    def get(self, request):
        print('111')
        return render(request, 'login.html')

    def post(self, request):
        print('222')
        return HttpResponse('登陆成功')
posted @ 2019-10-04 15:23  luckinlee  阅读(241)  评论(0编辑  收藏  举报