我有python版本3. 9,我使用的是windows操作系统(笔记本电脑)上的flask提供的默认开发web服务器。我需要在Windows机器上运行应用程序,它应该能够按需启动和停止应用程序。
这是我目前为止尝试的。当我在VS代码中运行应用程序时,我需要强制停止应用程序,如果在命令窗口中运行,我必须从任务管理器中杀死python应用程序。通过以下代码更改,我可以通过发送SIGTERM来退出应用程序,因为Flask和simplehttpserver都没有提供退出进程的API。
from flask import Flask, request, g, make_response
import queue
import time
import os
from threading import Thread
import signal
import ctypes
from multiprocessing import Process
import sys
OUTPUT_EMPTY_LIMIT = 3
DEFAULT_PORT = 9090
SHUTDOWN = False
EXIT_CHARS = "Qq\x11\x18" # 'Q', 'q', Ctrl-Q, ESC
print("Name = {}".format(__name__))
app = Flask(__name__)
def shutdown_app():
global SHUTDOWN
SHUTDOWN = True
@app.before_request
def before_request():
if SHUTDOWN:
return 'Shutting down...'
def run_app(port, host, debug, threaded):
app.run(port=port, host=host, debug=debug, threaded=threaded)
@app.route("/")
def app_help():
return "Hello, World from help!"
@app.route("/square/<int:number>")
def square(number):
return str(number**2)
# This doesnt kill the app as well.
@app.route("/stop")
def stop():
func = request.environ.get('werkzeug.server.shutdown')
if func is None:
raise RuntimeError('Not running with the werkzeug Server')
func()
return 'Server shutting down...'
exit(0)
if __name__ == "__main__":
port = 5000
host = '0.0.0.0'
debug = False
threaded = True
process = Process(target=run_app, args=(port, host, debug, threaded))
process.start()
while True:
ch = input("Enter 'Q' to stop server and exit: ")
if (ch == 'Q'):
break
shutdown_app()
process.terminate()
#process.kill()
#process.join()
print("Exiting the app")
# os.kill(os.getpid(), signal.SIGINT)
os._exit(0)
我是Python新手,尝试过google搜索和chatGPT,以找到关闭Flask App和Windows操作系统上启动的Web服务器的方法。我还尝试过堆栈溢出15562446的其他答案
我还尝试了链接Shutdown The Simple Server
1条答案
按热度按时间eoxn13cs1#
我在测试的时候发现werkzeug.server.shutdown什么都不做,需要在我的windows机器上使用sys.exit(0)来关闭它。在你的代码中,exit()运行之前会返回一个值--因此它不会关闭。一种方法是使用deferred callbacks。