Başka biri win32 hizmeti içinde Flask sunucusunu nasıl durduracağını araştırıyorsa - işte burada. Birkaç yaklaşımın garip bir kombinasyonu, ancak iyi çalışıyor. Anahtar fikirler:
- Bunlar,
shutdown
nazikçe kapatma için kullanılabilen uç noktadır. Not : request.environ.get
Hangisinin yalnızca web isteğinin bağlamında kullanılabileceğine dayanır (iç @app.route
işlev)
- win32service'in
SvcStop
yöntemi requests
, hizmetin kendisine HTTP isteği yapmak için kullanır .
myservice_svc.py
import win32service
import win32serviceutil
import win32event
import servicemanager
import time
import traceback
import os
import myservice
class MyServiceSvc(win32serviceutil.ServiceFramework):
_svc_name_ = "MyServiceSvc"
_svc_display_name_ = "Display name"
_svc_description_ = "Description"
def __init__(self, args):
os.chdir(os.path.dirname(myservice.__file__))
win32serviceutil.ServiceFramework.__init__(self, args)
def SvcDoRun(self):
myservice.start()
def SvcStop(self):
"""Called when we're being shut down"""
myservice.stop()
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
servicemanager.PYS_SERVICE_STOPPED,
(self._svc_name_, ''))
if __name__ == '__main__':
os.chdir(os.path.dirname(myservice.__file__))
win32serviceutil.HandleCommandLine(MyServiceSvc)
myservice.py
from flask import Flask, request, jsonify
cli = sys.modules['flask.cli']
cli.show_server_banner = lambda *x: None
app = Flask('MyService')
@app.route("/shutdown", methods=['GET'])
def shutdown():
shutdown_func = request.environ.get('werkzeug.server.shutdown')
if shutdown_func is None:
raise RuntimeError('Not running werkzeug')
shutdown_func()
return "Shutting down..."
def start():
app.run(host='0.0.0.0', threaded=True, port=5001)
def stop():
import requests
resp = requests.get('http://localhost:5001/shutdown')