【问题标题】:Import statement flow导入报表流程
【发布时间】:2016-01-16 02:24:07
【问题描述】:

我的应用布局

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

核心/__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 definedError 来自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 时,这是为了确保Inner __init__.py 文件包含更新后的app 对象吗?

任何解释将不胜感激!

【问题讨论】:

  • Errorviews.py 中是如何定义的?它不是进口的或任何东西,所以难怪你会得到NameError

标签: python flask python-import


【解决方案1】:

尝试使用动态导入构建和配置应用程序确实是个坏消息,并且由于您发现的原因而令人困惑。一个更好且更易于理解的模式将是一个更典型的工厂:

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.__ 运行,这(可能)将视图添加到应用程序对象中。

【讨论】:

  • 感谢您的 jumbopap。你会碰巧有一个链接到正在使用这种模式的仓库吗?我认为这对我来说真的很有帮助。
  • 我会写一个 github gist 来解释它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
相关资源
最近更新 更多