如何在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
相关产品推荐
相关产品推荐

