我有一个烧瓶应用程序,我在其中对一些数据进行一些分析并根据该数据绘制一些图表。但是到目前为止,我一直在我的views.py文件中,在我的索引方法中执行图形的分析和绘制。这不是很好,因为每次我在浏览器中执行“刷新”时,它将重做整个分析并全部绘制图形。
我的项目结构如下:
Data Analysis/
- app/
- static/
- templates/
- base.html
- index.html
- __init__.py
- models.py
- views.py
- venv/
- run.py
- config.py
我想过将我的数据分析移到我的__init__.py模块,因为这会导致在运行应用程序后只计算所需的数据,而不是在每次刷新时重新运行它。我遇到的障碍实际上是从我的__init__.py模块中导出我的views.py模块中需要的数据。
这是怎么做到的?
我尝试了以下内容:
from flask import Flask, url_for, render_template
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config.from_object('config')
db = SQLAlchemy(app)
def do_data_analysis():
#... lots of calculations
return data
VALUES = do_data_analysis()
from app import app, models, __init__ #does not work
from __init__ import VALUES #does not work
import VALUES #does not work
from app import VALUES # does not work
VALUES = __init__.VALUES #does not work
还有另一种可能更合适的做法吗?
我设法通过创建一个模块(data_analysis.py
)来实现它,我正在执行所有数据分析。这也意味着在我的__init__.py
我删除了我的数据分析,而现在我在view.py
中有以下内容:
from app import data_analysis
现在我能做到:
GPSVALUES = data_analysis.VALUES
#do something with the values..
但它确实似乎运行了两次脚本。首先是我时再次出现。它似乎只在启动run.py
的启动。当第一个请求进入run.py
时运行脚本。如果页面刷新,它不会重新运行我想要的脚本。因此,我认为除非没有其他解决方案,否则我将使用此解决方案。(我会在完成更多测试后立即添加答案)
答案 0 :(得分:1)
尝试
import __init__
VALUES = __init__.VALUES
from app import app, models, __init__
失败,因为如果app
不在您的范围内,则无法从from __init__ import VALUES
导入。
VAULES
失败,因为import VALUES
是变量而不是模块/函数。
VALUES
失败,因为......好吧......没有{{1}}模块。
答案 1 :(得分:1)
尝试,
from app import VALUES
这可能有用。
如果您只想在应用程序中进行一次数据分析,请阅读这些烧瓶装饰器,
答案 2 :(得分:1)
毫无疑问,这个答案来得有点晚。
看起来也找到了答案,但是原因有点晦涩难懂,这使得__init__.py
如何通过允许目录中的模块将功能类别(分为模块)离散化,然后可以通过一个名称(模块所在的文件夹的名称)引用该功能类别,仅保留记住该文件夹中收集的文件堆中的功能名称,并将其正确导入这个名字。
在__init__.py
上添加几行将对其进行配置,以公开包含在它自然变成一个包的文件夹中的模块,在这种情况下,即文件夹“ app”。
对于文件夹“ app”中的__init__.py
,请尝试添加:
from .models import <name of defs to expose>
from .views import <name of defs to expose>
然后,在views.py
中,导入应进入的模块,将from app import app, models, __init__
替换为:
app import app
from app import app <list of exposed fns needed here>
与其尝试将__init__.py
导入任何地方,不如在应用程序内创建一个模块,该模块包含要通过__init__.py
公开给应用程序其余部分的功能,仅使用对“ app”的引用即可。
基本上,这里发生的所有事情都是将模块名称透明化,并将其公开的功能分组在文件夹名称下。 __init__.py
通过将其所在的文件夹转换为包来实现这一点。该程序包可以放在PYTHONPATH上,也可以在导入语句中对其引用以路径名-relative或-absolute方式完成。