Django內置auth模塊中login_required裝飾器用於類視圖的優雅方式
阿新 • • 發佈:2019-01-19
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裝飾器用於類視圖的優雅方式