xadmin如何在列表页自定义列从接口批量查询(列表页上所有的一列数据走一个批量接口)

Q: 如何在列表页自定义列从接口批量查询(列表页上所有的一列数据走一个批量接口)

A:

如果自定义列, 每一行记录都去查一个接口, 可以直接在models里或者在OptionClass里定义方法, 然后加到list_display属性当中即可.

现在想列表页所有的数据库记录走一个批量接口. 然后判断每一行记录的状态. 也就是一次request请求, 去请求一次接口. 如果在models里或者OptionClass里加方法的话. 或者写在__init__方法里, 实际上每一行数据库记录都会执行一遍. 这样会发生多次请求.

这里的实现方式是使用xadmin提供的插件. 继承BaseAdminPlugin实现其filter_hook的get方法, get方法只在请求的过程中执行一次. 第一个参数名称用__,这样调用plugins里的get方法之前ListAdminView里 get不被执行(执行了就报错了, 会找不到vt_status这个Field). 通过修改self.model也就是当前的数据库对象的field来实现.

plugins.py

from xxx_middle.api.vt import VirusTotal

from xadmin.views import BaseAdminPlugin


class VtStatusPlugin(BaseAdminPlugin):
    show_vt_status = False

    def init_request(self, *args, **kwargs):
        return bool(self.show_vt_status)

    def get(self, __, *args, **kwargs):
        # filter_hook
        # 每次get请求, 请求VT一次
        all_vt_ruleset_data = VirusTotal.hunting_rulesets_list()
        all_vt_ruleset_status = {i["attributes"]["name"]: i["attributes"]["enabled"] for i in
                                 all_vt_ruleset_data}

        def vt_status(model_self):
            # 每个model对象调用vt_status一次, 每个请求调用vt_status多次
            if model_self.name in all_vt_ruleset_status:
                vt_status = "已启用" if all_vt_ruleset_status[model_self.name] else "未启用"
            else:
                vt_status = "不存在"
            return vt_status

        vt_status.short_description = "VT状态"
        self.model.vt_status = vt_status
        return __()

adminx.py

from .plugins import VtStatusPlugin
from xadmin.views import ListAdminView


class YaraRulesetAdmin:
    list_display = ["name", "source", "create_user", "update_user", "update_time", "vt_status", "status"]
    list_filter = ["name", "source", "update_user", "update_time", "status"]
    exclude = ['create_time', 'lookup_users', 'create_user', 'update_user', 'update_time', 'import_list',
               "scan_file_path_list", "rule_list"]
    # 禁用导出功能
    list_export = []

    # 通过插件额外显示vt_status
    show_vt_status = True
    
xadmin.site.register_plugin(VtStatusPlugin, ListAdminView)

###