ImportErrors 无法从 flask_app 导入应用程序和 bcrypt,也无法从 models.py 导入数据库

ImportErrors cannot import app and bcrypt from flask_app and can't import db from models.py

stucture of the app

flask_app
   __init__.py
   models.py
   routes.py
run.py

__init__.py

from flask import Flask
from flask_bcrypt import Bcrypt
import os
from flask_app.models import db

app = Flask(__name__)

db.init_app(app) 
bcrypt = Bcrypt(app)

from flask_app import routes     

models.py

from flask_sqlalchemy import SQLAlchemy 
from flask_app import app, bcrypt

db = SQLAlchemy()

run.py

from flask_app import app  

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

 This happens first 
 Traceback (most recent call last):


File 
   "c:\users\cristovao\documents\mqs_development\flaskexperiment\env\lib\site-packages\flask\cli.py", line 240, in locate_app
    __import__(module_name)
  File "C:\Users\cristovao\Documents\MQS_Development\FlaskExperiment\run.py", line 4, in <module>
    from flask_app import app  # importing from __init__.py within flask_app package
  File "C:\Users\cristovao\Documents\MQS_Development\FlaskExperiment\flask_app\__init__.py", line 6, in <module>
    from flask_app.models import db
  File "C:\Users\cristovao\Documents\MQS_Development\FlaskExperiment\flask_app\models.py", line 2, in <module>
    from flask_app import app, bcrypt
ImportError: cannot import name 'app' from 'flask_app' (C:\Users\cristovao\Documents\MQS_Development\FlaskExperiment\flask_app\__init__.py)

 and then in models.py after this error I write from flask__app.__init__ import app bcrypt and I got another error

    Traceback (most recent call last):
  File "c:\users\cristovao\documents\mqs_development\flaskexperiment\env\lib\site-packages\flask\cli.py", line 240, in locate_app
    __import__(module_name)
  File "C:\Users\cristovao\Documents\MQS_Development\FlaskExperiment\run.py", line 4, in <module>
    from flask_app import app  # importing from __init__.py within flask_app package
  File "C:\Users\cristovao\Documents\MQS_Development\FlaskExperiment\flask_app\__init__.py", line 6, in <module>
    from flask_app.models import db
  File "C:\Users\cristovao\Documents\MQS_Development\FlaskExperiment\flask_app\models.py", line 2, in <module>
    from flask_app.__init__ import app, bcrypt
  File "C:\Users\cristovao\Documents\MQS_Development\FlaskExperiment\flask_app\__init__.py", line 6, in <module>
    from flask_app.models import db
ImportError: cannot import name 'db' from 'flask_app.models' (C:\Users\cristovao\Documents\MQS_Development\FlaskExperiment\flask_app\models.py)

当我 运行 我的应用程序使用 flask 运行 时,它给了我那些导入错误 cannot import app and bcrypt from flask_app to models.py and can't import db从 models.py 到 __init__py。我不明白为什么 run.py 与我的包裹 (flask__app) 分开了。

当我使用你的代码时,由于循环导入而出现错误。

ImportError: cannot import name 'app' from partially initialized module 'flask_app' (most likely due to a circular import) (/home/jugmac00/Tests/Whosebug/flask_app/__init__.py)

当我从 models.py

中删除这一行时,我可以摆脱它
from flask_app import app, bcrypt

摆脱循环导入的最简单方法是使用应用工厂模式。

https://flask.palletsprojects.com/en/1.1.x/patterns/appfactories/

这个应用工厂模式花了我一段时间才理解,但是尝试理解和使用它真的很值得。

今年的 Flask 大会上有一个令人兴奋的好视频:

https://www.youtube.com/watch?v=xNo-eOfZH5Q

如果这听起来很难,那么我的建议是...将所有内容都放在一个文件中 - 这还不错,除非应用程序变得非常大。