2017-01-03 3 views
2

Ich habe eine Flasche Anwendung, in der ich einige Daten analysieren und einige Diagramme basierend auf diesen Daten zeichnen. Bis jetzt habe ich die Analyse und das Zeichnen von Grafiken in meiner Datei views.py in meiner Indexmethode durchgeführt. Dies ist nicht sehr gut, da jedes Mal, wenn ich eine "Aktualisierung" in meinem Browser durchführe, die gesamte Analyse wiederholt und die Graphen überall gezeichnet werden.Ist es möglich, Variablen aus __init__.py in views.py zu importieren?

Meine Projektstruktur ist wie folgt:

Data Analysis/ 
    - app/ 
    - static/ 
    - templates/ 
     - base.html 
     - index.html 
    - __init__.py 
    - models.py 
    - views.py 
    - venv/ 
    - run.py 
    - config.py 

Ich dachte an meine Datenanalyse zu meinem __init__.py Modul, da dies nur würde das Bewegen der erforderlichen Daten die Berechnung, wenn die Anwendung ausgeführt wird, statt erneut ausführen es bei jeder Aktualisierung. Die Hürde, auf die ich gestoßen bin, importiert tatsächlich die Daten, die ich in meinem Modul views.py von meinem Modul __init__.py benötige.

Wie wird das gemacht?

Ich habe versucht, die folgenden:

__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 

Gibt es eine andere und vielleicht auch mehr richtige Weg, dies zu tun?

EDIT:

Ich habe es geschafft, um es durch die Schaffung eines Moduls (data_analysis.py), in dem ich meine Daten alle Analysen bin Durchführung erhalten zu arbeiten. Dies bedeutet auch, dass in meinem __init__.py ich meine Datenanalyse entfernt haben, und ich habe jetzt stattdessen die folgenden in meinem view.py:

from app import data_analysis 

Jetzt kann ich tun:

GPSVALUES = data_analysis.VALUES 
#do something with the values.. 

Es ist jedoch scheinen Führen Sie das Skript zweimal aus. Zuerst beim Start meines run.py. Und dann wieder, wenn die erste Anfrage kommt in. Es scheint, das Skript nur beim Starten der run.py ausgeführt wird. Und wenn die Seite aktualisiert wird, führt sie das Skript nicht erneut aus, was ich von Anfang an wollte. Deshalb denke ich, ich werde mit dieser Lösung gehen, es sei denn ich keine andere Lösung kommt in. (Ich eine Antwort hinzufügen wird, sobald ich einige Tests gemacht habe)

+0

Ihre Prämisse gibt, ist fehlerhaft. Es gibt nichts daran, Code in "__init__" zu haben, was bedeutet, dass es nur einmal ausgeführt wird; Sie können den gleichen Effekt erzielen, indem Sie eine Modulebene in views.py einfügen. –

+0

Wenn ich ein sekundäres Modul für meine Datenanalyse auf der gleichen Ordnerebene wie meine views.py erstellen würde, müsste ich es irgendwo ausführen. Wenn ich es in meinem views.py ausführen würde, löst es mein Problem nicht wirklich. – Zeliax

+0

Ja, wenn Sie es auf Modulebene ausführen. –

Antwort

1

Versuchen

import __init__ 
VALUES = __init__.VALUES 

from app import app, models, __init__ 

schlägt fehl, weil Sie nicht von app importieren können, wenn es nicht in Ihrem Bereich ist.

from __init__ import VALUES 

schlägt fehl, da VAULES eine Variable ist und kein Modul/Funktion.

import VALUES 

schlägt fehl, weil, na ja ... es keine VALUES Modul.

+0

Leider funktioniert nicht. Ich bekomme 'ImportError: Kein Modul mit dem Namen '__init __'' – Zeliax

1

Versuchen,

from app import VALUES 

Dies könnte funktionieren.

Wenn Sie in Ihrer Anwendung nur einmal die Datenanalyse zu tun, einen Read auf diesem Kolben Dekorateure,

+0

'von App Import VALUES' scheint auch nicht zu funktionieren. Wie würde ich diese beiden Dekorateure benutzen, ich habe ein wenig gesucht, kann aber keine Beispiele finden. – Zeliax

+0

Welchen Fehler erhalten Sie für 'import'? .. und für diese Dekoratoren fügen Sie' @ app.before_first_request' oberhalb der Funktionsdeklaration hinzu. Wenn Sie dies hinzufügen, wird die Funktion einmal aufgerufen, bevor Sie die erste Anfrage bearbeiten, die zur Anwendung kommt. Beachten Sie, dass die als solche dekorierte Funktion nichts zurückgeben kann. – franklinsijo

+0

'ImportError: kann den Namen 'GPSVALUES' nicht importieren (Ich habe ihn umbenannt, um mehrere Arten von Werten zu verwenden). – Zeliax

Verwandte Themen