我正在开发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 :(得分: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
和您的模型都在不同的模块中,并且没有冲突或循环导入。
答案 1 :(得分:1)
我追了几个小时,在这里登陆了几次,结果证明我是在创建应用程序的行之前导入页面模块(包含@app.route
命令的页面模块)。这样做很容易,因为导入命令通常放在最开始的位置,但在这种情况下不起作用。
所以这个:
# app/__init__.py
print("starting __init__.py")
from flask import Flask
from flask import render_template
import matplotlib.pyplot as plt
import numpy as np
import mpld3
app = Flask(__name__, instance_relative_config=True)
app.config.from_object('config')
from . import index
from . import simple
app.run(threaded=False)
print("finished __init__.py")
而不是将所有导入放在首位。
将其放置在此处是因为对于偶然使用烧瓶的人来说,这是一个常见错误,他们很可能会落在这里。在过去几年中,我至少击中过两次。
答案 2 :(得分:-1)
您需要运行python manage.py runserver
而不是运行python app.py
。 manage.py
负责运行服务器,打开shell并进行数据库迁移。