Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 Flask:访问其他文件中的应用程序配置(在任何地方,而不仅仅是在服务请求时)_Python 2.7_Flask - Fatal编程技术网

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

Python 2.7 Flask:访问其他文件中的应用程序配置(在任何地方,而不仅仅是在服务请求时),python-2.7,flask,Python 2.7,Flask,我没有从医生那里弄清楚。此外,我可以看到类似的问题,但我仍然没有得到我的答案,因此问 我有一个使用gunicorn+gevent的烧瓶应用程序。Gunicorn辅助进程在启动时创建一个烧瓶应用程序。然后,它导入一些设置一些全局内容的文件,如与statsd服务器的udp连接等。设置只需执行一次,即在工作进程启动时,而不是在每个客户端请求时执行。导入文件中的设置代码需要访问配置变量 我知道在处理请求时,我可以使用当前的应用程序代理,但不能在请求之外使用 一种方法是:将Flask应用程序创建代码放在一

我没有从医生那里弄清楚。此外,我可以看到类似的问题,但我仍然没有得到我的答案,因此问

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

我知道在处理请求时,我可以使用当前的应用程序代理,但不能在请求之外使用

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

例: 文件: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
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.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应用程序之后推送应用程序上下文,并且永远不会弹出它吗。这样,只要我的进程运行,应用程序上下文就始终存在,并且当前的应用程序代理将在应用程序范围内可用,即使没有提供任何请求

例:

现在我应该可以在代码中的任何地方使用当前的应用程序代理。请思考

==更新==

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

文件:mygunicornapp.py

from mywsgi import application
import file1
import file2
# import more files
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导入了许多其他文件,它们反过来又导入了更多的文件。任何这些导入的文件都可能需要访问我在应用程序对象上设置的配置参数。问题是:如何使应用程序对象可用于所有这些文件?您建议我将应用程序对象传递给每个文件吗


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

为什么不在
file1
file2
中创建函数,并将参数
app
传递给它们?然后,您可以在设置代码中调用这些函数(位于
mywsgi.py
),并将刚才创建的应用程序对象用作参数

这应该比你建议的其他一些方法更有效。相互导入的不同文件接近于循环导入。推送应用程序上下文也会让你最终产生难以理解的bug

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


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

更新了问题。导入文件file1、file2和更多文件以处理路由。我不明白如何使应用程序对象可用于所有这些文件。我们不能推迟到当前的应用程序可用时再添加路由吗?