django系列3.3--CBV 和 FBV

一.CBV和FBV

FBV function base views 用函数方法来处理请求

    from django.http import HttpResponse
  
    def my_view(request):
    if request.method == 'GET':
        return HttpResponse('OK')
    
    CBV class base views 用类来处理请求(面向对象)
    
    from django.http import HttpResponse
    from django.views import View
  
    class MyView(View):
    
        def get(self, request):
            return HttpResponse('OK')


CBV class base views 用类来处理请求(面向对象)

    from django.http import HttpResponse
    from django.views import View
  
    class MyView(View):
    
        def get(self, request):
            return HttpResponse('OK')


二.给视图函数加装饰器

写一个装饰器:

    def wrapper(func):
        def inner(*args, **kwargs):
            start_time = time.time()
            ret = func(*args, **kwargs)
            end_time = time.time()
            print("used:", end_time-start_time)
        return ret
    return inner


1.使用装饰器装饰FBV

    #添加班级
    @wrapper
    def add_class(request):
        if request.method == "POST":
            class_name = request.POST.get("class_name")
            models.Classes.objects.create(name=class_name)  
            return redirect("/class_list/")
        return render(request, "add_class.html")


2.使用装饰器装饰CBV

    from django.views import View
    from django.utils.decorators import method_decorator
        
    class AddClass(View):
        
        @method_decorator(wrapper)
        def get(self, request):
            return render(request, "add_class.html")
            
        def post(self, request):
            class_name = request.POST.get("class_name")
            return redirect("/class_list/")


3.dispatch()

请求过来之后会先执行dispatch()方法,如果需要批量对具体的请求处理方法.如get,post等做一些操作的时候,可以手动改写dispatch方法,这个dispatch方法就和在FBV上加装饰器一样

    class Login(View):    
        def dispatch(self, request, *args, **kwargs):
            print('before')
            obj = super(Login,self).dispatch(request, *args, **kwargs)
            print('after')
        return obj
 
    def get(self,request):
        return render(request,'login.html')
 
    def post(self,request):
        print(request.POST.get('user'))
        return HttpResponse('Login.post')

猜你喜欢

转载自www.cnblogs.com/robertx/p/10466059.html
今日推荐