У меня есть сервер Python, сделанный из HTTPServer
.И я хочу использовать этот сервер в качестве службы Windows:
Вот как выглядит сервер:
class Handler(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.wfile.write(bytes("Hi, guys.", "utf8"))
class Server:
def __init__(self, host, port):
self.http_server = HTTPServer((host, port), Handler)
self.thread = threading.Thread(target=self.http_server.serve_forever)
def start(self):
self.thread.start()
def stop(self):
self.http_server.shutdown()
self.thread.join()
@staticmethod
def do_job():
do_some_staff_here()
time.sleep(1)
Итак, все очень просто.Для создания службы Windows я использую pywin32.Давайте посмотрим на мой код:
class AppServerSvc(win32serviceutil.ServiceFramework):
_svc_name_ = "TestService"
_svc_display_name_ = "TestService"
def __init__(self, args):
win32serviceutil.ServiceFramework.__init__(self, args)
self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
socket.setdefaulttimeout(60)
self.stop_requested = False
def SvcStop(self):
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
win32event.SetEvent(self.hWaitStop)
self.stop_requested = True
def SvcDoRun(self):
servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
servicemanager.PYS_SERVICE_STARTED,
(self._svc_name_, ''))
self.main()
def main(self):
server = Server("", 8080)
server.start()
while not self.stop_requested:
server.do_job()
server.stop()
if __name__ == '__main__':
win32serviceutil.HandleCommandLine(AppServerSvc)
И есть некоторые проблемы:
- В обычном «сервисном» режиме (когда я включаю его через настольное приложение),если я пытаюсь открыть эту страницу, она не отвечает.В режиме отладки все работает нормально.
- Когда я удаляю
self.send_response(200)
, служба начинает нормально работать в обоих режимах.
Итак, что может быть причиной такого поведения?
ОБНОВЛЕНИЕ
Я получаю следующую ошибку, когда пытаюсь выполнить send_response()
:
'NoneType'объект не имеет атрибута "запись"