gpt4 book ai didi

python - 使用 Flask 蓝图解决此循环导入错误的正确方法是什么?

转载 作者:太空狗 更新时间:2023-10-30 00:10:28 25 4
gpt4 key购买 nike

我在循环导入时遇到了问题,所以我将蓝图导入移到我的应用程序定义下方。但是,我仍然遇到导入错误。

Traceback (most recent call last):
File "/Applications/PyCharm CE.app/Contents/helpers/pydev/pydevd.py", line 2217, in <module>
globals = debugger.run(setup['file'], None, None)
File "/Applications/PyCharm CE.app/Contents/helpers/pydev/pydevd.py", line 1643, in run
pydev_imports.execfile(file, globals, locals) # execute the script
File "/Users/benjamin/Documents/Projects/website/server/app/app.py", line 15, in <module>
from views import site
File "/Users/benjamin/Documents/Projects/website/server/app/views.py", line 2, in <module>
from models import User
File "/Users/benjamin/Documents/Projects/website/server/app/models.py", line 3, in <module>
from database_setup import db
File "/Users/benjamin/Documents/Projects/website/server/app/database_setup.py", line 1, in <module>
from app import app
File "/Users/benjamin/Documents/Projects/website/server/app/app.py", line 15, in <module>
from views import site
ImportError: cannot import name site

如果我将蓝图导入和注册移动到 if __name__ == '__main__':,问题就会消失,但我不确定这是否是个好主意。

if __name__ == '__main__':
from views import site
app.register_blueprint(site)
app.run()

这是解决问题的正确方法,还是有其他解决方案?


没有__main__“修复”的原始app.py:

from flask import Flask

app = Flask(__name__)

from views import site
app.register_blueprint(site)

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

views.py:

from flask import Blueprint, render_template

site = Blueprint('site', __name__, template_folder='templates', static_folder='static')

@site.route('/', methods=['GET', 'POST'])
def index():
return render_template('index.html')

database_setup.py:

from app import app
from flask_mongoengine import MongoEngine

app.config['MONGODB_SETTINGS'] = {'db': 'mst_website'}
db = MongoEngine(app)

models.py:

from database_setup import db

class User(db.Document):
# ...

我的文件结构是:

/server
|-- requirements.txt
|-- env/ (virtual environment)
|-- app/ (my main app folder)
|-- static/
|-- templates/
|-- __init__.py
|-- app.py
|-- database_setup.py
|-- models.py
|-- views.py

最佳答案

您的代码中有一个循环导入。基于回溯:

  1. app.py from views import site
  2. views.py from models import User
  3. models.py 执行 from database_setup import db
  4. database_setup.py 执行from app import app
  5. app.py from views import site

根据这些事件顺序,您发布的 app.py 并不是真正导致您出现问题的那个。现在,appviews 被导入之前还没有被定义,所以当它在链的更下方尝试获取 app 时,它是不可用的还没有。

您需要重组您的项目,以便在 app 定义之后导入依赖于 app 的所有内容。从你的问题来看,你似乎认为你做到了,但也许你错过了 app 上面写的导入。


可能不相关,但您目前正在使用“相对”导入,这是不鼓励的。而不是做 from views import site 等,你应该做一个绝对路径:from app.views import site,或者一个相对路径:from .views导入站点


要回答最初的问题“使用 __main__ 导入蓝图是个好主意吗?”,事实并非如此。问题在于 __main__ 守卫在您直接运行模块时执行。当您使用真实的应用程序服务器(例如 uWSGI 或 Gunicorn)部署它时,您的任何蓝图都不会被导入或注册。

关于python - 使用 Flask 蓝图解决此循环导入错误的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30761303/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com