【问题标题】:ImportError: cannot import name 'apiv1' from partially initialized module 'app.api' (most likely due to a circular import)ImportError:无法从部分初始化的模块“app.api”导入名称“apiv1”(很可能是由于循环导入)
【发布时间】:2020-05-20 10:48:54
【问题描述】:

我一直在尝试让我的 API 与 Flask 应用程序一起工作,但无论我如何更改,都会不断收到循环引用警告。

我可能有点傻。但我不明白模块是如何仅部分加载的。

我正在尝试实现factory pattern,但很难成功。

这是我的代码:

app/__init__.py:

from flask import Flask
from flask_login import LoginManager
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

login = LoginManager()

def create_app():
    app = Flask(__name__)
    from config import Config
    app.config.from_object(Config)

    db.init_app(app)

    from app.api import apiv1
    app.register_blueprint(apiv1)

    login.init_app(app)
    login.login_view = 'login'

    return app

app/api/__init__.py:

from manage import app
from flask_restplus import Api
from flask import Blueprint
from flask_limiter import Limiter
from flask_limiter.util import get_remote_address

limiter = Limiter(
    app,
    key_func=get_remote_address,
)

apiv1 = Blueprint('api', __name__, url_prefix='/api')

api = Api(apiv1, doc='/documentation', version='1.0', title='Docket API',
          description='API for Docket. Create users and todo items through a REST API.\n'
                      'First of all, begin by registering a new user via the registration form in the web interface.\n'
                      'Or via a `POST` request to the `/Register/` end point', decorators=[limiter.limit("50/day", error_message="You have reached the API limit for today")])

manage.py:

from app import create_app, db
from flask_migrate import Migrate
from flask_script import Manager

app = create_app()

manager = Manager(app)

migrate = Migrate(app, db)

from app.routes import *
from app.models import *

if __name__ == '__main__':
    app.run(debug=True)

显然我错过了一些东西。但我不确定是什么:/

【问题讨论】:

  • 我相信import * 通常被认为是不好的做法,并且导入应该始终放在文件的顶部。
  • 不用工厂模式也能搞定
  • 就我而言,只是我在文件夹中有新的 .py 文件。一旦我将它正确放置到应用程序的根目录,它就可以正常工作了。

标签: python flask


【解决方案1】:

在您创建db 的位置附近的app/__init__.py 文件中创建limiter,这样就无需将应用程序导入您的app/api/__init__.py。然后from app import limiter 在你的app/api/__init__.py 中。

manage.py 仅在 create_app() 返回时保存对 app 的引用。但是您在create_app() 中导入app.api,并且此模块需要首先完全加载manage。那就是你的循环依赖。

manage 是入口点,因此不得由任何模块导入。

【讨论】:

    猜你喜欢
    • 2021-02-24
    • 2022-06-22
    • 2022-01-08
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-12
    • 2021-09-22
    相关资源
    最近更新 更多