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

问题描述 投票:0回答:4

我是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之前运行。

如何做到这一点?

python flask gunicorn
4个回答
7
投票

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

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

2
投票

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

0
投票
只需在文件的全局范围内的“

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 发出多个请求。您应该看到计数器并不总是连续的。


0
投票
  1. 该脚本创建一个 Flask Web 应用程序。

  2. 它定义了一个在每个传入请求之前执行的函数(declareStuff)。在这个函数内部,它为 Flask 的特殊 g 对象的属性“aa”设置一个值(“hello”),该值对于每个请求都是唯一的。

  3. 该脚本定义了根 URL ('/') 的路由和相应的 功能测试)。当用户访问此 URL 时,该函数会返回一个响应,其中包含存储在 g.aa 中的值。

  4. 应用程序配置为在主机“0.0.0.0”和端口“8080”上运行,并启用调试。

总之,该脚本初始化 Flask 应用程序,使用 g 对象存储每个请求的数据,并使用存储的值后跟“world!”响应根 URL。这演示了如何使用 Flask 的 before_request 钩子和 g 对象在 HTTP 请求处理期间管理数据。

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)
    
© www.soinside.com 2019 - 2024. All rights reserved.