• 回顾基础知识,类,fbv,cbv


    一 类中绑定方法的传参,不需要self

    class Foo(object):
        def __init__(self,name):
            self.name = name
        def foo(self,x):
            self.x = x
    
    f = Foo('sccc')
    
    func = f.foo
    func('miracle')
    print(f.x)

      输出:

    miracle

      同样

    class OrderView(View):
        def dispatch(self, request, *args, **kwargs):
            print(self.request.method)
            func = getattr(self,request.method.lower())
            print(func)
            ret = func(request,*args,**kwargs)
            return ret
        def get(self,request,*args,**kwargs):
            return HttpResponse('get')
        def post(self,request,*args,**kwargs):
            return HttpResponse('post')
        def delete(self,request,*args,**kwargs):
            return HttpResponse('delete')
        def update(self,request,*args,**kwargs):
            return HttpResponse('update')

      输出: 注意,request.method 会将get,post等变为大写。

    GET
    [05/Mar/2018 17:09:12] "GET /orders/ HTTP/1.1" 200 3
    <bound method OrderView.get of <app01.views.OrderView object at 0x000001215CF09E48>>

      

    二 super 与 mro顺序

      为了实现继承,python会在MRO列表上从左到右开始查找基类,直到找到第一个匹配这个属性的类为止。

    class A:
        def xx(self):
            print('xxx')
            super().xx()
            print(super())
    class C:
        def xx(self):
            print('cc')
            print(super())
    class B(A,C):
        pass
    
    b = B()
    b.xx()
    print(B.mro())

      输出:

    xxx
    cc
    <super: <class 'C'>, <B object>>
    <super: <class 'A'>, <B object>>
    [<class '__main__.B'>, <class '__main__.A'>, <class '__main__.C'>, <class 'object'>]

      从 父类A中,super(),继续按照mro顺序查找。

      同样的道理。

      自定义父类 MyBaseView,子类 StudentView 继承MyBaseView和系统导入的View。 实现在原有View基础的扩增功能,类似装饰器。

    class MyBaseView(object):
        def dispatch(self,request,*args,**kwargs):
            print('before')
            ret = super(MyBaseView,self).dispatch(request,*args,**kwargs)
            print('after')
            return ret
    class StudentView(MyBaseView,View):
        def get(self,request,*args,**kwargs):
            return HttpResponse('get')
        def post(self,request,*args,**kwargs):
            return HttpResponse('post')
        def delete(self,request,*args,**kwargs):
            return HttpResponse('delete')
        def update(self,request,*args,**kwargs):
            return HttpResponse('update')

     三  csrf_exempt,csrf_protect

      from django.views.decorators.csrf import csrf_exempt,csrf_protect

      可以单独对某个FBV,或CBV进行csrf 设置。

      FBV的设置比价简单,直接加装饰器

                        @csrf_protect # 该函数需认证
                        def users(request):
                            user_list = ['alex','oldboy']
                            return HttpResponse(json.dumps((user_list)))
    @csrf_exempt # 该函数无需认证
    def users(request):
        user_list = ['alex','oldboy']
        return HttpResponse(json.dumps((user_list)))

      CBV相对复杂一些。

    方式一:
        from django.views.decorators.csrf import csrf_exempt,csrf_protect
        from django.utils.decorators import method_decorator
        class StudentsView(View):
            
            @method_decorator(csrf_exempt)
            def dispatch(self, request, *args, **kwargs):
                return super(StudentsView,self).dispatch(request, *args, **kwargs)
    
            def get(self,request,*args,**kwargs):
                print('get方法')
                return HttpResponse('GET')
    
            def post(self, request, *args, **kwargs):
                return HttpResponse('POST')
    
            def put(self, request, *args, **kwargs):
                return HttpResponse('PUT')
    
            def delete(self, request, *args, **kwargs):
                return HttpResponse('DELETE')
    方式二:
        from django.views.decorators.csrf import csrf_exempt,csrf_protect
        from django.utils.decorators import method_decorator
    
        @method_decorator(csrf_exempt,name='dispatch')
        class StudentsView(View):
            def dispatch(self, request, *args, **kwargs):
                return super(StudentsView,self).dispatch(request, *args, **kwargs)
    
            def get(self,request,*args,**kwargs):
                print('get方法')
                return HttpResponse('GET')
    
            def post(self, request, *args, **kwargs):
                return HttpResponse('POST')
    
            def put(self, request, *args, **kwargs):
                return HttpResponse('PUT')
    
            def delete(self, request, *args, **kwargs):
                return HttpResponse('DELETE')

    四 FBV,CBV

      CBV,基于反射实现根据请求方式不同,执行不同的方法。  

      原理:
        url -> view方法 -> dispatch方法(反射执行其他:GET/POST/DELETE/PUT)

      

      流程:

    class StudentsView(View):
                    def dispatch(self, request, *args, **kwargs):
                        print('before')
                        ret = super(StudentsView,self).dispatch(request, *args, **kwargs)
                        print('after')
                        return ret
    
                    def get(self,request,*args,**kwargs):
                        return HttpResponse('GET')
    
                    def post(self, request, *args, **kwargs):
                        return HttpResponse('POST')
    
                    def put(self, request, *args, **kwargs):
                        return HttpResponse('PUT')
    
                    def delete(self, request, *args, **kwargs):
                        return HttpResponse('DELETE')

      

  • 相关阅读:
    JQuery的js写法
    Reapter 中客户端控件和服务器端控件的选择
    ASP.NET 中随时向页面输入数据
    SQL补充查询
    repeater项模版bottom事件获取该bottom所在行id为lblName的label控件的text
    微软Visual Studio 2010架构设计功能应用
    动态表格
    如何选中jsTree中已checked的Item的信息
    据说看完这21个故事的人,30岁前都成了亿万富翁。你是下一个吗?
    WebSocket编解码器
  • 原文地址:https://www.cnblogs.com/654321cc/p/8510076.html
Copyright © 2020-2023  润新知