首页 > 其他 > 详细

django FBV和CBV

时间:2019-10-12 18:05:55      阅读:67      评论:0      收藏:0      [点我收藏+]

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方中的执行效果

技术分享图片

django FBV和CBV

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!