2017-01-03 54 views
2

我有一个烧瓶应用程序,我在这里做一些数据的分析,并根据这些数据绘制一些图。但是直到现在,我一直在我的view.py文件中执行分析和绘制图形,在我的索引方法中。这不是很好,因为每次我在浏览器中执行“刷新”时,都会重做整个分析并绘制所有图形。是否可以从views_py中的__init__.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模块中。

这是如何完成的?

我已经试过如下:

__init__.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() 

views.py

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

你的前提是有缺陷的。 '__init__'中的代码没有任何意义,这意味着它只能运行一次;您可以通过将其设置为views.py中的模块级别来获得相同的效果。 –

+0

如果我要在与我的views.py相同的文件夹级别创建用于我的数据分析的辅助模块,则需要在某处运行它。如果我在我的views.py中运行它,它并不能真正解决我的问题。 – Zeliax

+0

是的,如果你在模块级运行它。 –

回答

1

尝试

import __init__ 
VALUES = __init__.VALUES 

from app import app, models, __init__ 

失败,因为如果它不在您的范围内,则不能从app导入。

from __init__ import VALUES 

失败,因为VAULES是一个变量而不是一个模块/功能。

import VALUES 

失败,因为......没有VALUES模块。

+0

可悲的是不工作。我得到'ImportError:没有名为'__init __'的模块' – Zeliax

1

尝试,

from app import VALUES 

这可能会实现。

如果你想在你的应用程序执行数据分析只有一次,给读这些烧瓶装饰,

+0

'from app import VALUES'似乎也不起作用。我将如何去使用这两个装饰器,我已经做了一些搜索,但无法找到任何示例。 – Zeliax

+0

你为'import'得到了什么错误?..对于这些装饰器,在函数声明上添加'@ app.before_first_request'。在处理发送给应用程序的第一个请求之前,添加它会调用一次函数。请注意,这样装饰的功能不能返回任何东西。 – franklinsijo

+0

'ImportError:无法导入名称'GPSVALUES''(我已将其重命名为使用多种类型的值)。 – Zeliax

相关问题