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

时间:2018-05-09 09:15:30

标签: python flask gunicorn

我是关于flask的新手。我使用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.

我想要一些代码,比如变量aa在gunicorn之前运行。

怎么做?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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工作进程处理的请求数量,不同的请求可能会产生不同的结果。 e.g:

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()

使用多个工作程序(gunicorn -w 2 ...)运行上述脚本,并向URL发出多个请求。您应该看到计数器并不总是连续的。