关于xadmin自定义插件理解

xadmin官方文档

xadmin.views.filter_hook(func )
使用此装饰器的AdminView方法可以通过Plugin类扩展,并将按以下过程执行:

从实例获取plugins属性,然后使用相同的方法名称检索插件

按插件的“优先级”排序

按顺序执行插件方法并遵循以下规则:

如果未将参数提供给plugin方法,则AdminView方法的返回值不为null并引发异常。

如果传递给plugin方法的第一个参数为’’,则此参数为AdminView方法。该插件方法将通过调用()并在AdminView方法之前执行。

def get_context (self , __ ):
c = { ‘键’ : ‘值’ }
c 。更新(__ ())
返回 c
如果plugin方法的第一个参数不是’__’,则将执行AdminView方法,并将其返回值作为第一个参数传递。

最后,插件按顺序执行,结果按顺序返回。

源码:

def filter_hook(func):
    """
    表明 AdminView 的方法可以被插件插入的装饰器。执行使用了该装饰器的方法时,会按照以下过程执行:

        1. 首先将实例的 plugins 属性取出,取出含有同样方法名的插件

        2. 按照插件方法的 ``priority`` 属性排序

        3. 顺序执行插件方法,执行插件方法的规则:

            * 如果插件方法没有参数,AdminView 方法的返回结果不为空则抛出异常

            * 如果插件方法的第一个参数为 ``__`` ,则 AdminView 方法将作为第一个参数传入,注意,这时还未执行该方法,
              在插件中可以通过 ``__()`` 执行,这样就可以实现插件在 AdminView 方法执行前实现一些自己的逻辑,例如::

                def get_context(self, __):
                    c = {'key': 'value'}
                    c.update(__())
                    return c

            * 如果插件方法的第一个参数不为 ``__`` ,则执行 AdminView 方法,将结果作为第一个参数传入

        4. 最终将插件顺序执行的结果返回

    """
    tag = func.__name__
    func.__doc__ = "``filter_hook``\n\n" + (func.__doc__ or "")

    @functools.wraps(func)
    def method(self, *args, **kwargs):

        # 将 AdminView 的方法先封装起来,方便后面执行
        def _inner_method():
            return func(self, *args, **kwargs)

        if self.plugins:
            # 首先取出所有含有同名方法的插件
            filters = [(getattr(getattr(p, tag), 'priority', 10), getattr(p, tag))
                       for p in self.plugins if callable(getattr(p, tag, None))]
            # 按照 ``priority`` 属性排序
            filters = [f for p, f in sorted(filters, key=lambda x:x[0])]
            return filter_chain(filters, len(filters) - 1, _inner_method, *args, **kwargs)
        else:
            return _inner_method()
    return method

源码中被 filter_hook() 装饰的方法都可以被插件截获或修改,可以到官网查看自带的插件是否被filter_hook()装饰

当自定义插件的时候,就需要查看filter_hook源码,查看插件被调用的顺序,以便达到自己想要的结果
调用顺序大概分三种情况:

  1. 如果自定义的插件方法没有参数,AdminView 方法的返回结果不为空则抛出异常,也就是AdminView 方法的返回必须为空才行,也就是完全抛弃了自带插件的功能,使用你的插件。AdminView 在这里指的是你要重载或者叫改动的那个方法,同下
  2. 如果自定义插件方法的第一个参数为 __ ,则 AdminView 方法将作为第一个参数传入,注意,这时还未执行该方法,在插件中可以通过 __() 执行,这样就可以实现插件在 AdminView 方法执行前实现一些自己的逻辑,很好理解,不过多解释
  3. 如果插件方法的第一个参数不为 __ ,则执行 AdminView 方法,将结果作为第一个参数传入到自定义的插件方法中,等同于先执行 AdminView 方法,再执行自定义的插件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值