在运行烧瓶应用程序后调用函数的正确方法是什么?

时间:2012-02-14 11:31:24

标签: python web-frameworks flask werkzeug

我对如何做一些我认为非常简单的事情感到有些困惑。我有一个使用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调试代码。如果我在app.run之前删除了调用,则输出正常。此外,我发现_run_on_start的输出在启动时重复两次,但我不知道它是否是一些奇怪的输出,或者该函数实际上被调用了两次。

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

此外,我意识到,如果我从另一个模块调用此模块,即不是在__name__ != "__main__"时,我将不会接到_run_on_start的电话。

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

3 个答案:

答案 0 :(得分:45)

可能你正在寻找Flask.before_first_request装饰者,如:

@app.before_first_request
def _run_on_start(a_string):
    print "doing something important with %s" % a_string

答案 1 :(得分:13)

您的功能的重复输出可以通过重新加载器来解释。它首先要做的是在新线程中启动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)

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

答案 2 :(得分:0)

If REF >= 3 & REFDELNEW1 >= 5 Then
  Worksheets("Sheet2").ActiveCell.Offset(, 3).Value = x                 
  Else: Worksheets("Sheet2").ActiveCell.Offset(, 3).Value = y
  End If
  End With
End Sub