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

ben*_*inz 7 python flask

我的循环导入有问题,所以我将蓝图导入移到我的应用定义下面.但是,我仍然有导入错误.

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
Run Code Online (Sandbox Code Playgroud)

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

if __name__ == '__main__':
    from views import site
    app.register_blueprint(site)
    app.run()
Run Code Online (Sandbox Code Playgroud)

这是解决问题的正确方法,还是有另一种解决方案?


原始app.py没有__main__"修复":

from flask import Flask

app = Flask(__name__)

from views import site
app.register_blueprint(site)

if __name__ == '__main__':
    app.debug = True
    app.run()
Run Code Online (Sandbox Code Playgroud)

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')
Run Code Online (Sandbox Code Playgroud)

database_setup.py:

from app import app
from flask_mongoengine import MongoEngine

app.config['MONGODB_SETTINGS'] = {'db': 'mst_website'}    
db = MongoEngine(app)
Run Code Online (Sandbox Code Playgroud)

models.py:

from database_setup import db

class User(db.Document):
    # ...
Run Code Online (Sandbox Code Playgroud)

我的文件结构是:

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

dav*_*ism 6

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

  1. app.pyfrom views import site
  2. views.pyfrom models import User
  3. models.pyfrom database_setup import db
  4. database_setup.pyfrom app import app
  5. app.pyfrom views import site

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

您需要重构您的项目,以便定义之后app导入依赖的所有内容。从您的问题来看,您似乎认为自己做到了,但也许上面仍然有您遗漏的导入。 appapp


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


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