对象未在 Flask 结构中正确导入

Object is not imported properly in a Flask structure

我正在尝试从 Instant Flask Web Development 一书中逐步学习 Flask,但我收到如下错误。 (这似乎是循环导入的问题。) 问题是:

有人可以解释一下循环导入的修复方法和详细信息吗?

目录结构:

├── manage.py
├── requirements.txt
└── sched
    ├── __init__.py
    ├── __init__.pyc
    ├── app.py
    ├── app.pyc
    ├── static
    └── templates

manager.py:

from flask.ext.script import Manager
from sched import app

manager = Manager(app)
app.config['DEBUG'] = True

if __name__ == '__main__':
    manager.run()

app.py:

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello World!'

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

__init__.py 是空的。

命令行生成错误:

$ python manage.py runserver
Traceback (most recent call last):
  File "manage.py", line 8, in <module>
    app.config['DEBUG'] = True
AttributeError: 'module' object has no attribute 'config'

替代架构:

# app.py:

from flask import Flask
app = Flask(__name__)
app.debug = True

from flask.ext.script import Manager
manager = Manager(app)

# __init__.py:

from .sched import app, manager
import sched.views # for your views
import sched.commands # for additional commands


# manager.py:

from sched import manager

if __name__ == '__main__':
    manager.run()

 #views.py:

from .app import app

@app.route('/')
def hello_world():
    return 'Hello World!'

当你这样做时

from sched import app

您正在导入 app 模块。 app 对象在模块内部。您要使用的导入是

from sched.app import app

我建议为您的应用关注 an app factory pattern

manage.py
sched/
  __init__.py

__init__.py 中,您可以执行以下操作:

from flask import Flask
def create_app():
  app = Flask(__name__)
  app.config['DEBUG'] = True
  return app

manage.py

from app import create_app
from flask.ext.script import Manager
app = create_app()
manager = Manager(app)
if __name__ == '__main__':
  manager.run()

对于更大的应用程序结构,这往往是一个可扩展的解决方案。