2017-03-28 42 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來啓動服務器時,我收到一個肯定顯示循環依賴的錯誤(這很明顯)。遵循指南或導遊是否錯誤,我是否犯過錯誤?我如何重構這是正確的?

非常感謝。

編輯:回溯

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 manage.py runserver,而不是運行python app.pymanage.py是負責運行服務器,打開shell並進行數據庫遷移的工具。

+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,和你的所有型號都在單獨的模塊,也沒有衝突或圓形進口。