1. 程式人生 > >Django內置auth模塊中login_required裝飾器用於類視圖的優雅方式

Django內置auth模塊中login_required裝飾器用於類視圖的優雅方式

views elf turn pat def 廣度優先 order self rom

使用多繼承 以及類似java中的靜態代理模式

原理:OrderView.as_view()根據廣度優先,調用的是LoginRequiredMixin中的as_view(cls, *args, **kwargs)

這時的cls=OrderView

接下來super(LoginRequiredMixin, cls).as_view(*args, **kwargs) 會調用到View類中的as_view()並返回一個視圖函數

然後,用將這個視圖函數作為參數傳給Login_required()並返回經過裝飾的結果

class A(object):
 @classmethod
 def do(cls):
     print(‘我是你的眼‘)


class B(object):
 @classmethod
 def do(cls):
     print(cls)
     super(B, cls).do()
     print("--" * 12)


class C(B, A):
 pass


if __name__ == ‘__main__‘:
 C.do()
 
<class ‘__main__.C‘>
我是你的眼
------------------------    
from django.contrib.auth.decorators import login_required


class LoginRequiredMixin(object):
    @classmethod
    def as_view(cls, *args, **kwargs):
        view = super(LoginRequiredMixin, cls).as_view(*args, **kwargs)
        return login_required(view)
        
        
        
# /user/order
class OrderView(LoginRequiredMixin, View):
    """ 用戶中心 訂單 """

    def get(self, request):
        context = {‘page‘: ‘order‘}
        return render(request, ‘user/user_center_order.html‘, context)        
        
        
urlpatterns = [
    url(r‘^order/$‘, views.OrderView.as_view(), name=‘order‘),
]        
                                      

Django內置auth模塊中login_required裝飾器用於類視圖的優雅方式