2017-03-28 3 views
1

플라스크 응용 프로그램을 개발 중입니다. 그것은 여전히 ​​상대적으로 작습니다. 나는 단지 하나 개의 app.py 파일을 가지고,하지만 난 데이터베이스 마이그레이션을 할 필요가 있기 때문에,이 가이드를 사용하여 3으로 나누어하십시오이있는 한플라스크 순환 의존성

https://realpython.com/blog/python/flask-by-example-part-2-postgres-sqlalchemy-and-alembic/

그러나, 나는 지금 내 응용 프로그램을 실행할 수 없습니다 앱과 모델 사이의 순환 의존성.

app.py :

from flask import Flask 
from flask_sqlalchemy import SQLAlchemy 
from flask import render_template, request, redirect, url_for 
import os 

app = Flask(__name__) 
app.config['SQLALCHEMY_DATABASE_URI'] = os.environ['DB_URL'] 
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False 

app.debug = True 

db = SQLAlchemy(app) 

from models import User 

... routes ...  

if __name__ == "__main__": 
    app.run() 

models.py :

from app import db 
class User(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    username = db.Column(db.String(80), unique=True) 
    email = db.Column(db.String(120), unique=True) 

    def __init__(self, username, email): 
    self.username = username 
    self.email = email 

    def __repr__(self): 
    return self.username 

manage.py :

from flask_script import Manager 
from flask_migrate import Migrate, MigrateCommand 
from app import app, db 

migrate = Migrate(app, db) 
manager = Manager(app) 

manager.add_command('db', MigrateCommand) 

if __name__ == "__main__": 
    manager.run() 

그들은에서 모두 동일한 디렉토리. 서버를 시작하기 위해 python app.py을 실행하려고하면 순환 의존성을 분명히 보여주는 오류가 발생합니다 (이는 꽤 분명합니다). 가이드에 따라 실수를했거나 가이드가 잘못 되었습니까? 올바른 것으로 리팩토링 할 수있는 방법은 무엇입니까?

고마워요.

편집 : 역 추적

Traceback (most recent call last): 
    File "app.py", line 14, in <module> 
    from models import User 
    File "/../models.py", line 1, in <module> 
    from app import db 
    File "/../app.py", line 14, in <module> 
    from models import User 
ImportError: cannot import name User 
+0

추적을 게시하십시오. – davidism

+0

추적 코드에 따르면 실제로 표시된 코드는 실제로 오류의 원인이되는 코드가 아닙니다. 작성된 코드는 문제가 없습니다. – davidism

답변

-2

대신 python app.py을 실행하는 python manage.py runserver를 실행해야합니다. manage.py은 서버 실행, 쉘 열기 및 데이터베이스 마이그레이션을 담당합니다.

+0

나는 부정확 한 점을 가지고있는 이유에 대해 궁금해한다. 왜냐하면 그는 코드가 틀리며 Flask의 "철학"을 따르기 때문에 그의 프로젝트 구조가 괜찮다. – seds

1

나는 다음과 같은 구조 제안 :

# app/extensions.py 
from flask_sqlalchemy import SQLAlchemy 
db = SQLAlchemy() 
... 


# app/app.py 
from app.extensions import db 

def create_app(config_object=ProdConfig): 
    app = Flask(__name__.split('.')[0]) 
    app.config.from_object(config_object) 
    register_extensions(app) 
    ... 

def register_extensions(app): 
    db.init_app(app) 
    ... 

# manage.py 
from yourapp.app import create_app 
app = create_app() 
app.debug = True 
... 
이 경우

, database, app을, 그리고 모델은 별도의 모듈에 모두와 충돌하는 또는 원형 수입이 없다.