33

我对如何做一些我认为很简单的事情有点困惑。我有一个使用Flask. 它看起来像这样:

from flask import Flask

app = Flask(__name__)

def _run_on_start(a_string):
    print "doing something important with %s" % a_string

@app.route('/')
def root():
    return 'hello world'

if __name__ == "__main__":
    if len(sys.argv) < 2:
        raise Exception("Must provide domain for application execution.")
    else:
        DOM = sys.argv[1]
        _run_on_start("%s" % DOM)
        app.run(debug=True)

我发现我的终端正在输出打印语句,_run_on_start但不是其他常用的 Flask 应用程序调试代码。如果我在 app.run 之前删除调用,输出是正常的。此外,我发现_run_on_start在启动时要重复两次的输出,尽管我不知道它是否是一些奇怪的输出或者该函数实际上被调用了两次。

我假设这不是在调用之前添加函数调用的正确方法app.run。我查看了 Flask 文档,发现提到了可以使用的各种装饰器,它们允许您在某些请求之前/之后执行一个函数,但我想在应用服务器运行时执行调用。

此外,我意识到,如果我从另一个模块调用这个模块,而不是当__name__ != "__main__"我没有接到我的_run_on_start.

这里的正确方法是什么?在这两种情况下,当我从 CL 和另一个模块开始时?

4

3 回答 3

48

可能您正在寻找Flask.before_first_request装饰器,例如:

@app.before_first_request
def _run_on_start(a_string):
    print "doing something important with %s" % a_string
于 2014-04-12T20:29:57.543 回答
16

重新加载器可以解释函数的重复输出。它做的第一件事是在一个新线程中启动 main 函数,以便它可以监视源文件并在它们更改时重新启动线程。use_reloader=False使用该选项禁用此功能。

如果您希望能够在从不同模块启动服务器时运行您的函数,请将其包装在一个函数中,然后从另一个模块调用该函数:

def run_server(dom):
        _run_on_start("%s" % dom)
        app.run(debug=True, use_reloader=False)

if __name__ == '__main__':
    if len(sys.argv) < 2:
        raise Exception("Must provide domain for application execution.")
    else:
        DOM = sys.argv[1]
        run_server(DOM)

“正确的方法”取决于你在这里实际想要完成的事情。内置服务器用于在将应用程序部署到生产服务器之前在本地测试环境中运行您的应用程序,因此从不同模块启动它的问题本身并没有多大意义。

于 2012-02-16T15:34:41.330 回答
0
from flask import Flask

def create_app():
    app = Flask(__name__)
    def run_on_start(*args, **argv):
        print "function before start"
    run_on_start()
    return app

app = create_app()

@app.route("/")
def hello():
    return "Hello World!"
于 2019-02-17T16:54:32.427 回答