You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django项目中获取自定义类内函数返回的数组并在views中使用

问题核心原因&修复方案

现有代码的4个致命错误

  • 方法缩进错误:elastice_yolla现在缩进在__init__方法内部,属于局部函数,不是myClass的类成员方法,调用逻辑本身就不合法
  • 实例属性赋值错误:elastice_yolla里你先初始化了self.report_final = [],但后续接收np.toES()返回值的时候赋值的是局部变量report_final,没有加self.前缀,结果根本没有保存到实例属性中,外部自然无法获取
  • 视图调用逻辑错误:你在setup_wizard里只是创建了myClass的实例,既没有保存实例对象,也没有接收返回值,当然拿不到内部的结果数组
  • 输出re模块地址的问题:大概率是你代码里某个地方把接收结果的变量名取成了re,和你导入的正则模块re重名,导致变量被覆盖,直接输出就得到了re模块的地址

修复后的代码

1. 修正functions.py
import glob
import os
import time
import json

class myClass():
    def __init__(self, n_user, n_password, n_url, n_port, db_password, username):
        # 此处保留你原本的初始化逻辑,注意self.location、self.index_name要正常赋值
        self.location = "填写你自己的文件根路径"
        self.index_name = "填写你自己的es索引名"
        # 调用类成员方法
        self.elastice_yolla(username)

    # 缩进修正,和__init__平级,属于类成员方法
    def elastice_yolla(self, username):
        self.report_final = []
        # Windows路径用原始字符串避免转义问题,glob递归匹配加recursive参数
        file_pattern = rf"{self.location}\**\*.nessus"
        self.static_fields = dict()
        for in_file in glob.glob(file_pattern, recursive=True):
            try:
                if os.path.getsize(in_file) > 0:
                    np = NES2(in_file, self.index_name, self.static_fields, username)
                    # 把返回结果追加到实例属性中,不要用局部变量
                    self.report_final.extend(np.toES())
                    time.sleep(0.02)
            except Exception as e:
                # 不要用裸except吞错误,方便排查问题
                print(f"处理文件{in_file}出错:{str(e)}")
        print("report")
        print(self.report_final)

class NES2:
    def __init__(self, input_file, index_name, static_fields, username):
        # 保留你原本的初始化逻辑
        pass
    def toES(self):
        rep_result = []
        # 保留你原本的处理逻辑
        return rep_result
2. 修正views.py调用逻辑
def setup_wizard(request):
    # 此处保留你原本的逻辑
    # 1. 保存myClass的实例对象
    my_obj = functions.myClass(setup.n_username, setup.n_password,
                               setup.n_url, setup.n_port, setup.db_password,
                               username=request.user.username)
    # 2. 直接从实例属性获取结果数组
    result_array = my_obj.report_final
    # 后续你就可以正常使用result_array了

额外注意事项

  • 全局检查代码里有没有把接收结果的变量命名为re,如果有的话改成report_list、result这类名字,避免和正则模块re重名,就不会出现输出re模块地址的问题
  • 所有路径拼接建议用os.path.join代替手动写斜杠,避免Windows和Linux路径兼容问题

内容的提问来源于stack exchange,提问作者edche

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 02:06:08