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

Flask项目中如何在views.py复用同一函数并解决导入错误?

解决Flask项目中循环导入及函数复用问题

这问题我见得不少,本质是Python的循环导入问题,和Flask本身关系不大——不过Flask项目因为模块分工(models/views/utils)很容易碰到这类情况。给你几个可行的解决办法,按优雅程度排序:

方案1:重构模块结构(推荐长期方案)

最稳妥的方式是把共享的get_item()函数放到一个不依赖其他业务模块的独立核心模块里,让models和views都从这个模块导入,彻底避免循环依赖。

步骤如下:

  1. 新建一个core/utils.py(或类似命名的模块),把get_item()函数移进去:
# core/utils.py
def get_item():
    # 你的函数逻辑,比如查询数据库、处理数据等
    return "你的返回结果"
  1. 在models.py中导入并使用:
from app.core.utils import get_item  # 替换原来的get_functions导入

class Shopping_list(db.Model):
    # 你的模型字段定义...
    
    @classmethod
    def get(cls):
        return get_item()
  1. 在views.py中直接导入使用:
from app.core.utils import get_item

# 视图函数中直接调用
@bp.route('/items')
def get_items():
    result = get_item()
    return jsonify(result)

这样所有依赖都指向独立的utils模块,不会出现互相引用的循环。

方案2:延迟导入(快速临时方案)

如果不想调整模块结构,可以用延迟导入——不在模块顶部导入,而是在需要用到函数的地方(比如类方法内部)再导入,避开模块加载时的循环引用。

修改models.py的代码:

class Shopping_list(db.Model):
    # 你的模型字段定义...
    
    @classmethod
    def get(cls):
        # 只在需要调用时才导入
        from app.get_functions import get_item
        return get_item()

这种方式简单直接,但如果多个地方需要调用,重复写导入会有点冗余,长期维护性不如方案1。

方案3:调整导入顺序(不推荐,脆弱)

还有一种临时办法是调整模块的导入顺序——确保get_functions在models被完全加载后再导入,但这种方式非常脆弱,后续代码变动很容易再次触发导入错误,不建议在生产环境使用。

为什么会出现ImportError: cannot import name models?

本质是模块加载时的循环依赖:比如models.py导入了get_functions,而get_functions又导入了models;或者views.py同时导入两者,导致Python在加载模块时,其中一个模块还没完成初始化,找不到对应的类/函数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:34:30