Flask的app.run()里发生了什么
是的,app.run()
内部实际上包含一个 事件循环,类似于一个 while True
,用于不断监听和处理 HTTP 请求。
🔍 app.run()
里发生了什么?
1. app.run()
的作用
当你调用:
app.run()
Flask 会:
- 启动一个内置的开发服务器(Werkzeug)
- 不断监听 HTTP 请求
- 调用相应的路由函数
- 返回响应给客户端
- 重复这个过程,直到你手动停止(Ctrl+C)
2. app.run()
内部的 while
机制
虽然 Flask 代码中没有直接写 while True
,但它的 事件循环(Event Loop) 本质上是一个无限循环,类似于:
while True:
request = 等待新的HTTP请求()
response = 处理请求(request)
发送响应(response)
这个循环会一直运行,直到 Flask 服务器被终止。
3. 为什么 app.run()
会一直运行?
Flask 的 run()
方法内部调用了 Werkzeug 开发服务器,其中的 BaseWSGIServer.serve_forever()
负责处理请求:
class BaseWSGIServer:
def serve_forever(self):
while True:
self.handle_request() # 等待并处理请求
这说明 Flask 服务器本质上是 一个不断处理请求的循环。
🚀 app.run()
的可选参数
app.run()
可以传递一些参数,比如:
app.run(host="0.0.0.0", port=5000, debug=True)
参数 | 作用 |
---|---|
host="0.0.0.0" | 允许外部访问(默认 127.0.0.1 仅本机访问) |
port=5000 | 监听的端口号(默认 5000) |
debug=True | 开启调试模式(支持热重载) |
🔍 waitress.serve(app)
与 app.run()
的区别
你的代码使用了:
from waitress import serve
serve(app, host="0.0.0.0", port=5000)
🔹 waitress.serve(app)
也是 一个事件循环,但它比 Flask 内置服务器更稳定,适合 生产环境。
🔹 app.run()
适用于 开发环境,不适合正式部署。
✅ 总结
✔ app.run()
内部有类似 while True
的循环,用于不断监听请求并返回响应。
✔ waitress.serve(app)
也有事件循环,但更适合生产环境。
✔ 在生产环境,推荐使用 Waitress / Gunicorn / uWSGI 代替 app.run()
🚀。