mixin多继承包装过程

邮差的信 提交于 2019-11-29 22:22:53

应用中使用django.view.generic中的视图类View,  之后使用django.contrib.auth的login登录模块.. 但, 装饰包内login_required登录验证模块无法直接对类进行装饰

utils内创建一个多继承mixin模块, 通过二次包装解决此问题.

 

# utils 有用的工具, 类, 函数. 框架中所有复用工具, 都放在这个单独的文件包
# mixin 代表多继承

from django.contrib.auth.decorators import login_required

# 实现用户登录状态验证的方法. 定义login_required_mixin的类, 为login_required增加对提交方法的识别.
# 使app中的类, 先继承此类, 判断其是否有登录状态, 之后在决定运行还是跳转.

class LoginRequiredMixin(object):
    # 定义和视图类相同的as_view方法, (参数需要和视图类中完全相同)
    @classmethod
    def as_view(cls, **initkwargs):
        # 调用父类的as_view
        view = super(LoginRequiredMixin, cls).as_view(**initkwargs)
        # 重点: 返回的时候使用login_required包装
        return login_required(view)

# 小结:
#  在此工具中, 调用父类的as_view方法, 以及相同参数的设置, 都只是为了, 在函数继承的时候
#  先于原本的as_view进行调用, 可以替代原本 视图类中的方法,
#  之后再在mixin中, 使用super调用父类的as_view, 因为mixin中已经被调用过, 所以才去调用第二个
#  mixin调用到View视图类的as_view方法后, 在return返回的时候, 加了一层login_required的包装
#  这样 , 完成了原本在urls中函数嵌套的过程

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!