是否可以在views.py?

时间:2017-01-03 14:55:33

标签: python flask import module python-3.5

我有一个烧瓶应用程序,我在其中对一些数据进行一些分析并根据该数据绘制一些图表。但是到目前为止,我一直在我的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模块中需要的数据。

这是怎么做到的?

我尝试了以下内容:

__初始化__。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时运行脚本。如果页面刷新,它不会重新运行我想要的脚本。因此,我认为除非没有其他解决方案,否则我将使用此解决方案。(我会在完成更多测试后立即添加答案)

3 个答案:

答案 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方式完成。