首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >烧瓶循环依赖性

烧瓶循环依赖性
EN

Stack Overflow用户
提问于 2017-03-28 18:49:45
回答 2查看 5K关注 0票数 5

我正在开发一个水瓶应用程序。它仍然相对较小。我只有一个app.py文件,但由于需要进行数据库迁移,我使用本指南将其划分为3个:

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

但是,我现在无法运行我的应用程序,因为应用程序和模型之间存在循环依赖关系。

app.py:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
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来启动服务器时,我会收到一个错误,它肯定显示了一个循环依赖关系(这是非常明显的)。我在遵循指南的时候犯了什么错误吗?还是指南错了?我怎么能把这个重构成正确的呢?

非常感谢。

编辑:追溯

代码语言:javascript
运行
复制
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
EN

回答 2

Stack Overflow用户

发布于 2017-03-28 18:59:40

我建议的结构如下:

代码语言:javascript
运行
复制
# 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和您的模型都位于单独的模块中,没有冲突的或循环的导入。

票数 8
EN

Stack Overflow用户

发布于 2020-08-27 08:52:25

我追逐了几个小时,在这里登陆了几次,结果发现我是在创建应用程序之前导入我的页面模块(那些包含@app.route命令的模块)。这很容易做到,因为导入命令往往放在最开始的位置,但在本例中却不起作用。

所以这个:

代码语言:javascript
运行
复制
# 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")

而不是把所有的进口放在最上面。

放置在这里,因为这必须是一个常见的错误,让偶然的酒瓶用户遇到,他们很可能会降落在这里。在过去的几年里,我至少打了两次。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43077599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档