Windows Python程序上的Flask Web服务器应用程序无法在程序存在时关闭

sczxawaw  于 2023-02-18  发布在  Python
关注(0)|答案(1)|浏览(370)

我有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

eoxn13cs

eoxn13cs1#

我在测试的时候发现werkzeug.server.shutdown什么都不做,需要在我的windows机器上使用sys.exit(0)来关闭它。在你的代码中,exit()运行之前会返回一个值--因此它不会关闭。一种方法是使用deferred callbacks

from flask import after_this_request 

@app.get('/stop')
def shutdown():
    @after_this_request
    def response_processor(response):
        @response.call_on_close
        def shutdown():
            import sys
            sys.exit("Stop API Called")
        return response
    return 'Server shutting down...',200

相关问题