【问题标题】:What's the right approach for calling functions after a flask app is run?运行烧瓶应用程序后调用函数的正确方法是什么?
【发布时间】:2012-03-05 18:33:26
【问题描述】:

我对如何做一些我认为很简单的事情有点困惑。我有一个使用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 和另一个模块开始时?

【问题讨论】:

标签: python web-frameworks flask werkzeug


【解决方案1】:

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

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

【讨论】:

  • 有没有办法在应用收到第一个请求之前调用函数?我需要在 nginx(例如)启动后立即运行一个函数?
  • 只有在第一个请求发出后才会调用。因此,在大多数情况下,如果您想在开始做出响应之前初始化大量人员,那么它是不合适的。
  • 建议删除a_stringdoc 说:“函数将在没有任何参数的情况下被调用,并且它的返回值被忽略。”
  • @tktktk0711 我建议你创建一个应用上下文并在那里工作。
  • 嗨@SepehrHamzelooy 感谢您的回答。我的问题在这里:stackoverflow.com/questions/56991587/…
【解决方案2】:

重新加载器可以解释函数的重复输出。它做的第一件事是在一个新线程中启动 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)

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

【讨论】:

    【解决方案3】:
    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!"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-20
      • 1970-01-01
      • 1970-01-01
      • 2021-02-02
      • 2018-01-22
      • 2022-01-02
      • 2018-12-13
      • 1970-01-01
      相关资源
      最近更新 更多