2014-12-29 2 views
3

я имел следующую структуру в моей колбе приложении:вопросов Импорта с колбой приложением

app.py:

app = Flask(__name__) 
app.config.from_object(os.environ['APP_SETTINGS']) 
db = SQLAlchemy(app) 
from models import * 

models.py:

from app import db 

Он работал хорошо, пока я не хотел, чтобы сделать чтение/писать операции над моделями в файлах, отличных от app.py. Я пытался импортировать модель Trackorder в файле tasks.py, но получил следующее сообщение об ошибке:

ImportError: cannot import name TrackOrder 

Итак, я изменил структуру:

__init__.py:

app = Flask(__name__) 
app.config.from_object(os.environ['APP_SETTINGS']) 
db = SQLAlchemy(app) 

Но это делает app и db недоступен в app.py и models.py:

File "app.py", line 21, in <module> 
    from models import * 
    File "/home/nish/repos/stage/voylla_api/models.py", line 16, in <module> 
    class Product(db.Model): 
NameError: name 'db' is not defined 

##after commenting models.py: 
Traceback (most recent call last): 
    File "app.py", line 210, in <module> 
    @app.route('/') 
NameError: name 'app' is not defined 

Как решить эту проблему?

+0

tasks.py находится в той же папке с app.py? –

+0

@ m170897017: Да – nish

+0

В каком файле вы пытались импортировать tasks.Trackorder? –

ответ

2

Вот решение, которое может работать для вас.

Создайте файл с именем core.py (или что вы хотите назвать его):

from flask_sqlalchemy import SQLAlchemy 
db = SQLAlchemy() 

Сейчас в app.py:

from core import db 

app = Flask(__name__) 
app.config.from_object(os.environ['APP_SETTINGS']) 

# Instead of this line: db = SQLAlchemy(app) 
# Use this approach to initialize db 
db.init_app(app) 

В вашей models.py вы можете использовать этот импорт from core import db

Это основано на примере здесь: https://pythonhosted.org/Flask-SQLAlchemy/api.html

0

Без полного кода со всеми операторами импорта трудно сказать, но вы, скорее всего, имеете циклический импорт. Вы импортируете модуль B в модуле A и модуле B в модуле A. Это имеет побочный эффект, который во время импорта A в B (импорт, который закрывает цикл) ничего ниже импорта B не доступен в A. пример:

a.py: 
from b import * # Now b.py is evaluated before the execution contiues. 
var1 = 0 

b.py: 
import a 
print(a.var1) # This raises an error since var1=0 was not executed yet. 

решение: Изменение порядка импорта или использовать import заявление локально, как:

def function1(): 
    from a import var1 
    print(var1) 
Смежные вопросы