user.views类中的UserInfoView类中多继承LoginRequiredMixin, View。
from django.views.generic import View from utils.mixin import LoginRequiredMixin # UserInfoView class UserInfoView(LoginRequiredMixin, View): '''用户中心-信息页''' def get(self, request): # page='user' return render(request, 'user_center_info.html')
urls配置:
url('^$', UserInfoView.as_view(), name='user')
LoginRequiredMixin类定义:
from django.contrib.auth.decorators import login_required class LoginRequiredMixin(object): @classmethod def as_view(cls, **initkwargs): # 这个as_view的参数必须与assp的urls中的as_view中的参数相同 # 调用父类的as_view view = super(LoginRequiredMixin, cls).as_view(**initkwargs) # python2的使用super的方式 # super(FooChild,self) 首先找到 FooChild 的父类(就是类 FooParent),然后把类 FooChild 的对象转换为类 FooParent 的对象,来源于菜鸟教程 return login_required(view)
- UserInfoView类自己本身没有as_view()方法,于是它调用父类的as_view()方法,
- 根据调用顺序(通过子类类名.__mro__可以查看),先调用LoginRequiredMixin的as_view()方法,
- 进入到LoginRequiredMixin的as_view()方法一看,又有一个super(LoginRequiredMixin, cls).as_view(**initkwargs)父类方法调用,
- 可是UserInfoView因为本身没有as_view()方法已经调用过一次LoginRequiredMixin父类的方法了,
- 所以,这次的他将按顺序调用View父类的as_veiw()方法。