gpt4 book ai didi

python-2.7 - Flask:访问其他文件中的应用程序配置(在任何地方,而不仅仅是在服务请求时)

转载 作者:行者123 更新时间:2023-12-03 16:51:52 26 4
gpt4 key购买 nike

我没有从 Flask 文档中清楚地得到它。此外,我可以看到类似的 stackoverflow 问题,但我仍然没有得到我的答案,因此问。

我有一个使用 gunicorn+gevent 提供的 flask 应用程序。 Gunicorn 工作进程在启动时会创建一个 Flask 应用程序。然后它导入一些设置一些全局内容的文件,例如与 statsd 服务器的 udp 连接等。设置只需要完成一次,即在工作进程启动时而不是在每个客户端请求时完成。导入文件中的设置代码需要访问配置变量。

我知道在服务请求时我可以使用 current_app 代理,但不能在请求之外使用。

一种方法是:将 Flask 应用程序创建代码放在一个单独的文件中,并将其包含在您需要访问 config.xml 的任何位置。

前任:
文件:mywsgi.py

from flask import Flask
application = Flask(__name__)
application.config.from_pyfile('myconfig.cfg')

文件:mygunicornapp.py
from mywsgi import application
import file1
import file2
# import more files

文件:file1.py
from mywsgi import application
# use the application config to setup something

文件:file2.py
from mywsgi import application
# use the application config to setup something

这是首选方式吗?

Flask doc 说我可以显式地创建应用程序上下文。

我可以在创建我的 flask 应用程序之后推送应用程序上下文,并且从不弹出它。因此,只要我的进程运行,应用程序上下文就一直存在,并且 current_app 代理将在应用程序范围内可用,即使没有提供请求?

前任:
from flask import Flask
application = Flask(__name__)
application.config.from_pyfile('myconfig.cfg')
application.app_context().push()

现在我应该可以在我的代码中的任何地方使用 current_app 代理了。想法,请!

== 更新 ==

导入文件 file1.py、file2.py 等以向应用程序添加路由。它们提供处理我的 api 请求的函数。所以文件 mygunicornapp.py 看起来更像:

文件:mygunicornapp.py
from mywsgi import application

from file1 import API1
@application.route("/api1")
def handle_api1():
return API1.handler()

from file2 import API2
@application.route("/api2")
def handle_api2():
return API2.handler()

# many more routes

现在 file1 导入了许多其他文件,它们反过来又导入了更多文件。任何这些导入的文件都可能需要访问我在应用程序对象上设置的配置参数。问题是:如何使应用程序对象可用于所有这些文件?您是否建议我将应用程序对象传递给每个文件?

是否可以延迟添加路线?我的意思是在 current_app 上下文本地可用之后设置路由。这意味着文件将在 current_app 可用后导入。我尝试在“before_first_request”回调中将路由添加到本地的 current_app 上下文。问题在于,第一个请求返回 404。随后的返回给出了正确的响应。

最佳答案

为什么不在 file1 中创建函数?和 file2 , 并传递参数 app进入他们?然后您可以在 mywsgi.py 中的设置代码中调用这些函数,使用您刚刚创建的 app 对象作为参数。

这应该比你建议的其他一些事情好得多。相互导入的不同文件接近于循环导入。推送应用程序上下文也可能会让您最终遇到难以理解的错误。

如果您创建对象 app在一个文件中并从该文件的任何地方导入它,您基本上有一个全局变量(使用命名空间)。当您想要测试您的应用程序设置代码或出于其他原因创建多个版本的应用程序时,这将导致问题。还有一个问题是您将无法导入任何 file1 , file2无需创建应用程序对象。在测试这些,或者可能在 Flask 之外重新使用其中的一些代码时,这将是一件痛苦的事情。

最好创建一次应用程序对象并传递它。拥有一个返回新创建的应用程序的函数,可以从任何地方导入和调用,这是组织 flask 应用程序的常用方法。此文件通常称为 factory.py .它使创建应用程序的零个、一个或多个副本变得更加容易,而不是让它变得更加困难。

关于python-2.7 - Flask:访问其他文件中的应用程序配置(在任何地方,而不仅仅是在服务请求时),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46117592/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com