[oldboy-django][2深入django]FBV + CBV + 装饰器

FBV

1 django CBV & FBV
    - FBV function basic view
        a. urls 设置
            urls(r'^test.html$', views.test)
        b. views写法
            def test(request):
                return ...
        c. FBV添加装饰器
            - 定义装饰器
                def wrapper(func):
                    def inner(*args, **kwargs):
                       return func(*args, **kwargs)
                    return inner

            - 使用装饰器方法
                @wrapper
                def test(request):
                    pass
View Code

 CBV

    - CBV class basic view
        a. urls 设置
            urls(r'^login.html$', views.Login.as_view())
        b. views写法
            from django.views import View
            class Login(View):
                def get(self,request):
                    return render(request, 'login.html')

                def post(self,request):
                    return HttpResponse("dd")
        c. 注意事项
            - urls 里面 views.类名.as_view() 固定写法
            - views的类
                a.需要继承from django.views import View
                b.函数需要一个参数request
                c.函数名字:get, post, put, delete
                    - 函数名字对应请求类型
                    - form表单只能是get和post提交
                    - ajax提交数据可以是get, post, put, delete
                    - get(查),post(创建), put(更新), delete(删)

        d.dispatch函数实现get, post执行前后定制一些操作
            - dispatch作用
                函数发送请求到url后,CBV第一步调用的是dispatch函数,然后再执行get,post函数
                其实是在dispatch函数里面调用get,post函数
            - 自定义dispatch函数
                def dispatch(self, request, *args, **kwargs):
                    print('before')
                    obj = super(Login,self).dispatch(request, *args, **kwargs)
                    print('after')
                    return obj
View Code

CBV添加装饰器

        f CBV添加装饰器(django有限制)
            - 定义装饰器
            def wrapper(func):
                def inner(*args, **kwargs):
                   return func(*args, **kwargs)
                return inner

            - 导入django使用FBV装饰器的方法
                from django.utils.decorators import method_decorator

            - 添加装饰器方式
                1. 在类里面的多个函数添加
                    class Foo(View):

                        @method_decorator(wrapper)
                        def get(self,request):
                            pass

                        @method_decorator(wrapper)
                        def post(self,request):
                            pass

                2.对类的多个函数都添加装饰器
                    @method_decorator(wrapper, name='post')
                    @method_decorator(wrapper, name='get')
                    class Foo(View):


                3.对类所有函数添加装饰器
                    @method_decorator(wrapper, name='dispatch')
                    class Foo(View):

                    # 请求来了,到dispatch函数,dispatch根据反射调用不同的函数
View Code
原文地址:https://www.cnblogs.com/liuzhipenglove/p/7777014.html