导入语句流程
Import statement flow
我的应用布局
my_app
__init__.py
my_app
__init__.py
startup
__init__.py
create_app.py
create_users.py
common_settings.py
core
__init__.py
models.py
views.py
errors
__init__.py
errors.py
内__init__.py
from flask import Flask
from flask_script import Manager
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__) # The WSGI compliant web application object
db = SQLAlchemy(app) # Setup Flask-SQLAlchemy
manager = Manager(app) # Setup Flask-Script
from my_app.startup.create_app import create_app
create_app()
create_app.py
def create_app(extra_config_settings={}):
# Load all blueprints with their manager commands, models and views
from my_app import core
return app
core/__init__.py
# from . import views
views.py
from my_app import app, db
from flask import Flask, request
@app.errorhandler(Error)
def handle_invalid_usage(error):
response = jsonify(data=error.to_dict())
response.status_code = error.status_code
return response
我根据找到的教程编写了此代码。只要我将 core 文件夹中的 __init__.py
留空,一切正常。
当我不这样做时,我会在 views.py
中得到一个 NameError: name Error is not defined
。 Error
来自 errors.py
.
我有三个问题:
1) 为什么只有当我在 core/__init__.py.
中留下 import
语句时才会发生这种情况
2)
create_app.py
app.config.from_envvar('ENV_SETTINGS_FILE')
# Other app.config commands here
from my_app import core
return app
from my_app import core
运行时会发生什么?
3) 最后当我return app
时,这是为了确保内部__init__.py文件包含更新的app
对象吗?
任何解释将不胜感激!
尝试使用动态导入构建和配置应用程序确实是个坏消息,并且由于您发现的原因而感到困惑。一个更好和更容易理解的模式将是一个更典型的工厂:
def create_app():
app = Flask(__name__)
configure_app(app, config)
register_db(app)
add_views(app)
add_manager(app)
return app
if __name__ == '__main__':
app = create_app()
app.run()
但是既然你问了,你的问题就在这里:
from my_app import app, db
from flask import Flask, request
@app.errorhandler(Error) # Error is not imported
def handle_invalid_usage(error):
response = jsonify(data=error.to_dict())
response.status_code = error.status_code
return response
错误发生是因为 views.py
被导入,代码编译器遇到 Error
并且找不到对它的引用。
对于你的第二个问题:from my_app import core
导致 core.__init.__
到 运行,这(大概)将视图添加到应用程序对象上。
我的应用布局
my_app
__init__.py
my_app
__init__.py
startup
__init__.py
create_app.py
create_users.py
common_settings.py
core
__init__.py
models.py
views.py
errors
__init__.py
errors.py
内__init__.py
from flask import Flask
from flask_script import Manager
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__) # The WSGI compliant web application object
db = SQLAlchemy(app) # Setup Flask-SQLAlchemy
manager = Manager(app) # Setup Flask-Script
from my_app.startup.create_app import create_app
create_app()
create_app.py
def create_app(extra_config_settings={}):
# Load all blueprints with their manager commands, models and views
from my_app import core
return app
core/__init__.py
# from . import views
views.py
from my_app import app, db
from flask import Flask, request
@app.errorhandler(Error)
def handle_invalid_usage(error):
response = jsonify(data=error.to_dict())
response.status_code = error.status_code
return response
我根据找到的教程编写了此代码。只要我将 core 文件夹中的 __init__.py
留空,一切正常。
当我不这样做时,我会在 views.py
中得到一个 NameError: name Error is not defined
。 Error
来自 errors.py
.
我有三个问题:
1) 为什么只有当我在 core/__init__.py.
中留下import
语句时才会发生这种情况
2)
create_app.py
app.config.from_envvar('ENV_SETTINGS_FILE')
# Other app.config commands here
from my_app import core
return app
from my_app import core
运行时会发生什么?
3) 最后当我return app
时,这是为了确保内部__init__.py文件包含更新的app
对象吗?
任何解释将不胜感激!
尝试使用动态导入构建和配置应用程序确实是个坏消息,并且由于您发现的原因而感到困惑。一个更好和更容易理解的模式将是一个更典型的工厂:
def create_app():
app = Flask(__name__)
configure_app(app, config)
register_db(app)
add_views(app)
add_manager(app)
return app
if __name__ == '__main__':
app = create_app()
app.run()
但是既然你问了,你的问题就在这里:
from my_app import app, db
from flask import Flask, request
@app.errorhandler(Error) # Error is not imported
def handle_invalid_usage(error):
response = jsonify(data=error.to_dict())
response.status_code = error.status_code
return response
错误发生是因为 views.py
被导入,代码编译器遇到 Error
并且找不到对它的引用。
对于你的第二个问题:from my_app import core
导致 core.__init.__
到 运行,这(大概)将视图添加到应用程序对象上。