背景
用户登录后才能进行的操作,如何写才能避免越权发生?即每一步需要权限的操作怎么进行权限验证。
验证是否登录的一个简单写法,在敏感操前都验证一下
|
|
Django提供了一个装饰器,@login_required(login_url=’/login/‘),未登录会自动跳转,但是装饰器只能用在函数前,类不能用,但是我们使用面向对象的方法实现的,所以这里我们需要写一个检测是否登录的功能类,继承这个类,就会检测未登录自动跳转
|
|
上述代码是网上的一种实现,但是我并没有找到更多关于这个的解释,经过我阅读了Django中View类的一些实现细节,恍然大悟。
代码解读
Mixin类
我理解的是一种组合类功能的思想,这样一来,我们不需要复杂而庞大的继承链,只要选择组合不同的类的功能,就可以快速构造出所需的子类。
method_decorator
类的方法和独立的函数不完全相同,所以不可以直接将函数修饰器运用到方法上,首先需要将它转换为一个方法装饰器。
@method_decorator 装饰器将函数修饰器转换为方法修饰器,这样就可以用在实例上。
dispatch
dispathch会返回一个函数,我们可以把所有需要的传给这个函数的参数传给它。常用来实现回调函数。
super
以前我一看到 super 就想到父类!其实不是,super 指的是 MRO 中的下一个类!
super并不是一个函数,是一个类名,形如super(B, self)事实上调用了super类的初始化函数,产生了一个super对象,返回一个代理对象让你能够调用一些继承过来的方法,查找的机制遵循mro规则;
为什么需要super?假如你在子类重写了父类同名的一个方法,同时又想调用父类的方法,这时super,就十分有用了,其实不一定是父类,一般是继承中的下一个类。这也是这个类实现权限验证的核心,覆盖dispatch函数,在调用它之前进行权限验证,之后通过super调用 MRO 中的下一个类中 dispathch 函数。
所以上面代码的意思是,通过super生成了一个类,这个类继承中的是下一个类的临时实例,并调用了下一个类的dispatch函数。