django FBV和CBV

CBV(class base views) ---- 视图里使用类来处理请求

from django.views import View
# 导入一个django中自带的模块View
class LoginViews(View):
    
    	# 重构了父类的dispatch方法,作用是可以在执行get或者post请求之前做一些逻辑判断
        def dispatch(self, request, *args, **kwargs):
            #调用父类的dispatch方法进行操作,不用写self,因为在使用super方法的时候默认就已经将类名传入了
        ret = super().dispatch(request, *args, **kwargs)
        return ret  # 接收到父类dispatch的返回值返回给重构后的dispatch这个方法
    
	# 在View类中有一个dispatch方法,这个方法用到了反射,会在你的类中找get方法,
    def get(self,request):
        return render(request,'login.html')

    # 在View类中有一个dispatch方法,这个方法用到了反射,会在你的类中找post方法,
    def post(self,request):
        print(request.POST)  
        # 同样可以接收到post请求的数据<QueryDict: {'name': ['adrian'], 'pwd': ['123456']}>
        return HttpResponse('登陆成功')

urls.py文件

# 路有文件的写法
url(r'^login/',views.LoginViews.as_view())

控制器去视图中找LoginViews类,这个类都做了一些什么事?

views.LoginViews.as_view()
1.程序加载,执行LoginViews的类方法as_view
在本类中未找到,由于该类继承了View,因此去父类找找看,发现存在
2.调用父类as_view的类方法(@classonlymethod)-->cls为LoginViews
该方法返回重点实现任务:
    1.定义了view方法
    2.并返回view
    请求到来时,执行下面操作
    3.结果变成执行view
    4.view的执行结果就是views.LoginViews.as_view()的执行结果
	
3.调用View的view方法
    1.self = cls(**initkwargs)因此self为LoginViews类
    2.该函数返回self.dispatch(request, *args, **kwargs)
    3.需要先执行dispatch,并把执行结果返回给view函数

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

FBV( function base views) --- 视图里使用函数来处理请求

def index(request):
    return render(request,'login.html')

给视图加装饰器

# 下面是装饰器
def wrapper(func):
    def inner(*args,**kwargs):
        print('执行装饰器前')
        ret = func(*args,**kwargs)
        print('执行装饰器后')
        return ret
    return inner

# 在函数上的应用,直接在函数的头部加上@+装饰器的名字
@wrapper
def index(request):
    return HttpResponse('这是一个数据')


# 在类中的应用
# 首先需要导入一个模块 :  这个模块是django自己带的,方便在类中加装饰器
from django.utils.decorators import method_decorator  

from django.views import View

from django.utils.decorators import method_decorator
#加装饰器的方法三
@method_decorator(wrapper,name='get')
@method_decorator(wrapper,name='post')
class LoginViews(View):

    # @method_decorator(wrapper)  # 加装饰器的方法二
    def dispatch(self, request, *args, **kwargs):
        print('这是一个dispatch方法')
        ret = super().dispatch(request, *args, **kwargs)
        return ret

    # @method_decorator(wrapper)   # 加装饰器的方法方法一
    def get(self,request):
        print('这是get方法')
        return render(request,'login.html')

    def post(self,request):
        print('这是post方法')
        print(request.POST)  # <QueryDict: {'name': ['adrian'], 'pwd': ['123456']}>
        return HttpResponse('登陆成功')

下面是将装饰器写在类中的方法头部

下面是将装饰器写在自己类中定义的dispatch方中的执行效果

原文地址:https://www.cnblogs.com/zhufanyu/p/11662897.html