如何 运行 flask 中 app.run() 之前的代码?

how to run the code before the app.run() in flask?

我是 flask.I 的新手,用 flask+gunicorn 配置了一个服务器。

调用 test.py 的代码文件是这样的:

from flask import Flask
app = Flask(__name__)

@app.route('/')
def test():
    return aa+"world!"

if __name__ == '__main__':
    aa = "hello"
    app.run()

运行 使用:gunicorn -b 0.0.0.0:8080 test:app

我打错了:NameError: name 'aa' is not defined.

我想要一些代码,例如 gunicorn 之前的变量 aa 运行ing。

怎么做?

在你的 @app.route 之前放入一个小块,你不需要问题中的最后一个块

 @app.before_first_request
 def _declareStuff():
     global aa
     aa='hello'

只需在文件的全局范围内在“__main__”之外声明 aa

from flask import Flask
app = Flask(__name__)

@app.route('/')
def test():
    return aa+"world!"

aa = "hello"

if __name__ == '__main__':
    app.run()

if __name__ == '__main__': 块中的代码仅在 Python 代码作为脚本 运行 时执行,例如,从命令行执行。 Gunicorn 导入文件,所以在那种情况下 __main__ 中的代码将不会被执行。


请注意,如果您打算修改 aa 的值,那么不同的请求会产生不同的结果,具体取决于每个 gunicorn 工作进程处理了多少请求。例如:

from flask import Flask
app = Flask(__name__)

@app.route('/')
def test():
    global counter
    counter += 1
    return "{} world! {}".format('aa', counter)

counter = 0

if __name__ == '__main__':
    app.run()

运行 上面的脚本有多个 worker (gunicorn -w 2 ...) 并向 URL 发出多个请求。您应该看到计数器并不总是连续的。