【问题标题】:In Flask is it possible to import views using the create_app() pattern without using Blueprints?在 Flask 中是否可以使用 create_app() 模式导入视图而不使用蓝图?
【发布时间】:2020-05-25 06:40:48
【问题描述】:

我有一个非常小的 Flask 应用程序,布局如下:

tinker/
      main.py
      /my_package
              init.py
              views.py

当我做 tinker>python main.py 时,一切运行良好。以下是每个文件的内容:

main.py:

from my_package import app
app.run()

my_package/init.py:

from flask import Flask

app = Flask(__name__)
from my_package import views

my_package/views.py:

from my_package import app

@app.route('/')
def home():
    return 'Ola!!!!!'

虽然当我尝试使用 a create_app() 代码模式对其进行轻微修改时,上述所有代码运行良好,如下所示,views.py 抛出以下异常:“ImportError: cannot import name 'app' from ' my_package'" 有没有办法在不使用蓝图的情况下解决问题?

main.py:

from my_package import create_app
app = create_app()
app.run()

my_package/init.py:

from flask import Flask

def create_app():
    app = Flask(__name__)
    from my_package import views
    return app

my_package/views.py:

from my_package import app

@app.route('/')
def home():
    return 'Ola!!!!!'

【问题讨论】:

标签: flask view python-import


【解决方案1】:

您在应用程序上下文中导入视图,然后在视图中您可以使用 current_app。

mypackage/__init__.py:

def create_app():
    app = Flask(__name__)

    with app.app_context():
        from . import views

mypackage/views.py:

from flask import current_app

@current_app.route('/')
def index():
    return 'hello, world!'

【讨论】:

    【解决方案2】:

    init.py需要重命名为__init__.py

    app = Flask(__name__) 移出create_app 方法

    views.py

    中更改为 from . import app

    【讨论】:

    • 感谢您的反馈。确实,将 app=Flask(name) 粘贴在 create_app 方法之外是可行的。但是它不再遵循 create_app 模式,至少因为该模式在github.com/lingthio/Flask-User-starter-app/blob/master/app/… 或迈克尔·格林伯格的代码库中建模,该代码库随附他关于 Flask 的书:github.com/miguelgrinberg/flasky/blob/master/app/__init__.py) 总是将 app= Flask(name)。在上面的例子中 app=Flask(name) 总是在 create_app 里面。
    • 当然它首先提出了一个问题,即 create_app 模式的优势是什么。它应该总是包装 app=Flask(name) 行吗?还是可以脱离示例?
    • 顺便说一句,我的 init.py 确实包含下划线。看起来 StackOverflow 正在去除下划线(除非它们被标记为代码?)
    • 这是因为它的结构方式。 miguelgrinberg 使用蓝图来导入每个模块的路由,而您需要引用 app 来添加您的路由。它需要在方法之外才能引用它
    • 我明白,通过将 app=Flask(name) 包装在 create_app 中,路由不再可以访问它。而且我知道 Grinberg 的 create_app 模式可以将其包装在 create_app 中,因为他使用的是蓝图。 (虽然,顺便说一下,蓝图并不要求它们被包装在 create_app 中,就像在这个例子中:riptutorial.com/flask/example/22103/…)妥协?比如可扩展性?
    猜你喜欢
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-09
    • 1970-01-01
    • 2014-04-08
    相关资源
    最近更新 更多