Deploy Flask app as windows service

后端 未结 3 636
臣服心动
臣服心动 2020-12-28 09:30

I\'m using the template found here: Is it possible to run a Python script as a service in Windows? If possible, how?

Here\'s my run.py, which i\'ve installed as a se

相关标签:
3条回答
  • 2020-12-28 09:54

    I appended my code in SvcStop() last line. "self.ReportServiceStatus(win32service.SERVICE_STOPPED)"

    In my case, It's works for stopping service.

    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)
    
    0 讨论(0)
  • 2020-12-28 10:03

    I can't access WSGIRequestHandler in Flask outside request, so I use 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)
    
    0 讨论(0)
  • 2020-12-28 10:06

    Figured it out--I'd left the debug option on in the app.run(). Once i removed that, it's good to go!

    While the service starts and runs correctly (I can access my flask app from another computer on the network), it is unable to stop. In the thread with the posted template i used, the author mentions something about setting a flag to properly stop the service.

    Anyone know what he means by this and how to code it to properly stop the service?

    0 讨论(0)
提交回复
热议问题