2017-03-28 25 views
1

私はFlaskアプリケーションを開発中です。それはまだ比較的小さいです。私は一つだけ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を実行しようとすると、明らかに循環依存性を示すエラーが表示されます(これはかなり明白です)。ガイドに従うときに間違いを犯したのですか、またはガイドが間違っていますか?これを正しいものにするにはどうすればいいですか?

ありがとうございます。

EDIT:トレースバック

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 
... 

databaseappを、そしてあなたのモデルは、別のモジュール内のすべてであり、何の矛盾や円形の輸入はありません。