【问题标题】:Importing a flask-classy view outside of the project在项目之外导入烧瓶类视图
【发布时间】:2020-10-19 14:53:47
【问题描述】:

Good Day - 我在 google 和本网站上看到的类似 Python 3 导入问题和问题,但对这种情况没有答案。如何从应用程序外部导入 Flask-Classy 视图?

假设我有一个使用 Flask-Classy 在 Python 3.6 上的 Flask 应用程序,其结构类似于:

MainFolder   
├── __init__.py
├── app
│   ├── __init__.py
│   ├── views
│   │   ├── __init__.py
│   │   └── myview.py
│   │   └── config.py
│   ├── app.py
└── sideproj
    ├── __init__.py
    ├── calc.py

现在myview.py 通过from .config import Config 导入配置(配置是config.py 中的类名)。 myview.py 包含在 Flask 框架中工作的主要 Class 函数,但在完成主要工作的类中还有一个 helper 函数。这一切都很好,当我运行 python app.py 时 - 它能够为 Flask 应用程序提供服务,我可以通过 localhost:5000 访问它。

现在我的问题是,我正在做一个计算一些数据的副项目,我想在 myview.py 但在烧瓶应用程序之外使用该核心主力函数。在sideproj/calc.py 中,我基本上想导入myview.py,这样我就可以运行函数(当前位于类中)而无需复制代码库。

我尝试的第一件事是使用丑陋的 hack:

import sys

sys.path.append('../app/views')

import myview

代码能够导入myview,但由于myview.py 正在导入config.py,它无法正确导入并给我错误ImportError: attempted relative import with no known parent package

我找不到将myviewconfig.py 一起导入的方法,并且仍然能够运行app.py 并为网站提供服务。例如,如果我将myview.py 中的导入更改为仅import config,则calc.py 可以运行,但app.py 由于无法导入Config 而失败。

有什么好办法吗?或者一种重新组织主要主力函数的方法,以便myview.pycalc.py(以及config 中的函数引用值)都可以使用它。理想情况下,我在两个地方没有相同的代码。

【问题讨论】:

  • 我将创建一个独立于您的烧瓶应用程序和 sideproject 的新包,其中包含主力功能。例如,在运行烧瓶应用程序的环境中添加一个带有setup.pysetup.py 文件夹,然后您可以根据需要在烧瓶应用程序和sideproject 代码中导入该功能,但只需维护workhorse_package 中的功能。
  • 你的MainFolder/__init__.py是做什么的?
  • 没什么。它是空白的。它是在建议中添加的,以确保可以添加其他文件夹中的文件。
  • @ReilyBourne 请写下你是如何解决这个问题的,如果我的回答有帮助,你可以这样标记:)

标签: python flask python-import


【解决方案1】:
  1. 您可以按照@chris 在评论中的建议将要复制的功能放入

我将创建一个独立于您的烧瓶应用程序和包含主力功能的副项目的新包。例如,添加一个带有setup.pyworkhorse_package 文件夹,您使用pip install 安装该文件夹。在环境中,您正在运行您的烧瓶应用程序。然后您可以根据需要在烧瓶应用程序和辅助项目代码中导入该功能,但只需在workhorse_package 中维护该功能。 @克里斯

  1. 您可以使用Flask blueprints。这是否适用取决于您的应用使用情况。

  2. (Hacky 方式,不推荐用于严肃的应用程序,但在开发多个原型时会很有用,使用一些共享功能)您可以将 myview.py 移动到 MainFolder/helpers/ 并编写一个脚本,在以下情况下将副本复制到两个项目中运行它们。

  3. 不要。如果你想这样做以保持干燥,你不这样做。这是两个独立的项目,它们需要单独的文件。即使现在它们是不同的——一个使用一些配置,另一个没有。真的那么有用吗?

【讨论】:

    猜你喜欢
    • 2017-07-09
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 2020-02-13
    • 2018-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多