2017-03-28 37 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,和你的所有型号都在单独的模块,也没有冲突或圆形进口。