将Flask应用程序部署为Windows服务

我正在使用这里find的模板: 是否有可能在Windows中运行Python脚本作为服务? 如果可能,如何?

这是我的run.py,我按照上面的链接中的说明安装了服务。

from app import app import win32serviceutil import win32service import win32event import servicemanager import socket class AppServerSvc (win32serviceutil.ServiceFramework): _svc_name_ = "Flask App" _svc_display_name_ = "Flask App" def __init__(self,args): win32serviceutil.ServiceFramework.__init__(self,args) self.hWaitStop = win32event.CreateEvent(None,0,0,None) socket.setdefaulttimeout(60) def SvcStop(self): self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) win32event.SetEvent(self.hWaitStop) def SvcDoRun(self): servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE, servicemanager.PYS_SERVICE_STARTED, (self._svc_name_,'')) self.main() def main(self): app.run(host = '192.168.1.6') if __name__ == '__main__': win32serviceutil.HandleCommandLine(AppServerSvc) 

但是,当我尝试启动服务时,我收到消息:

“本地计算机上的Flask应用程序服务启动,然后停止,如果某些服务未被其他服务或程序使用,则会自动停止。

任何想法我做错了什么? 我已经尝试了各种用户帐户 – 我不认为这是一个权限问题。

谢谢!

Solutions Collecting From Web of "将Flask应用程序部署为Windows服务"

我不能在Flask外部request访问WSGIRequestHandler ,所以我使用Process

 import win32serviceutil import win32service import win32event import servicemanager from multiprocessing import Process from app import app class Service(win32serviceutil.ServiceFramework): _svc_name_ = "TestService" _svc_display_name_ = "Test Service" _svc_description_ = "Tests Python service framework by receiving and echoing messages over a named pipe" def __init__(self, *args): super().__init__(*args) def SvcStop(self): self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) self.process.terminate() self.ReportServiceStatus(win32service.SERVICE_STOPPED) def SvcDoRun(self): self.process = Process(target=self.main) self.process.start() self.process.run() def main(self): app.run() if __name__ == '__main__': win32serviceutil.HandleCommandLine(Service) 

想通了 – 我已经在app.run()中的调试选项。 一旦我删除了,这是很好的去!

服务启动并正确运行(我可以通过网络上的其他计算机访问我的应用程序),但无法停止。 在使用发布的模板的线程中,作者提到了设置标志以正确停止服务的一些事情。

任何人都知道他的意思,以及如何编码来正确地停止服务?

我在SvcStop()最后一行追加我的代码。 “self.ReportServiceStatus(win32service.SERVICE_STOPPED)”

就我而言,这是停止服务的作品。

 from app import app import win32serviceutil import win32service import win32event import servicemanager import socket class AppserverSvc (win32serviceutil.ServiceFramework): _svc_name_ = "Flask App" _svc_display_name_ = "Flask App" def __init__(self,args): win32serviceutil.ServiceFramework.__init__(self,args) self.hWaitStop = win32event.CreateEvent(None,0,0,None) socket.setdefaulttimeout(60) def SvcStop(self): self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) win32event.SetEvent(self.hWaitStop) # !important! to report "SERVICE_STOPPED" self.ReportServiceStatus(win32service.SERVICE_STOPPED) def SvcDoRun(self): servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE, servicemanager.PYS_SERVICE_STARTED, (self._svc_name_,'')) self.main() def main(self): app.run(host = '192.168.1.6') if __name__ == '__main__': win32serviceutil.HandleCommandLine(AppserverSvc)