我是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之前运行。
如何做到这一点?
在
@app.route
之前放入一个小块,您不需要问题中的最后一个块
@app.before_first_request
def _declareStuff():
global aa
aa='hello'
从 Flask 2.2 开始,Vipluv
在其答案中建议的
@app.before_first_request
装饰器 已被弃用,并且 将在 2.3 中被删除。
自 2.2 版起已弃用:将在 Flask 2.3 中删除。相反,在创建应用程序时运行设置代码。可以通过
手动推送应用程序上下文来完成等效操作,按照Enkum的建议:
# In place of something like this
@app.before_first_request
def create_tables():
db.create_all()
...
# USE THIS INSTEAD
with app.app_context():
db.create_all()
aa
”之外声明
__main__
即可。
from flask import Flask
app = Flask(__name__)
@app.route('/')
def test():
return aa+"world!"
aa = "hello"
if __name__ == '__main__':
app.run()
仅当 Python 代码作为脚本(例如从命令行)运行时,
if __name__ == '__main__':
块中的代码才会执行。 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()
使用多个工作人员 (
gunicorn -w 2 ...
) 运行上述脚本并向 URL 发出多个请求。您应该看到计数器并不总是连续的。
from flask import Flask, g
app = Flask(__name__)
# This function is executed before each request
@app.before_request
def declareStuff():
# Set a value 'hello' to the attribute 'aa' of the 'g' object
g.aa = 'hello'
# Define a route and corresponding function for the root URL
@app.route('/')
def test():
# Return a response composed of the value stored in g.aa followed by ' world!'
return f"{g.aa} world!"
# Run the Flask application
if __name__ == '__main__':
# Run the application on host 0.0.0.0, port 8080, with debugging enabled
app.run(host="0.0.0.0", port=8080, debug=True)