Skip to content

Commit ac50ddb

Browse files
committed
Register shutdown handler with mod_wsgi
This is important when running Webware with mod_wsgi in Python >= 3.9 since the atexit handler might not be called here.
1 parent f5d2721 commit ac50ddb

File tree

1 file changed

+37
-8
lines changed

1 file changed

+37
-8
lines changed

webware/Application.py

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -253,14 +253,7 @@ def __init__(self, path=None, settings=None, development=None):
253253
self._plugInLoader = None
254254
self.loadPlugIns()
255255

256-
self._needsShutDown = [True]
257-
atexit.register(self.shutDown)
258-
if self.setting('RegisterSignalHandler'):
259-
self._sigTerm = signal.signal(signal.SIGTERM, self.sigTerm)
260-
try:
261-
self._sigHup = signal.signal(signal.SIGHUP, self.sigTerm)
262-
except AttributeError:
263-
pass # SIGHUP does not exist on Windows
256+
self.registerShutDownHandler()
264257

265258
def initErrorPage(self):
266259
"""Initialize the error page related attributes."""
@@ -385,6 +378,42 @@ def startSessionSweeper(self):
385378
task, "SessionSweeper")
386379
print("Session sweeper has started.")
387380

381+
def registerShutDownHandler(self):
382+
"""Register shutdown handler in various ways.
383+
384+
We want to make sure the shutdown handler is called, so that the
385+
application can save the sessions to disk and do cleanup tasks.
386+
"""
387+
self._needsShutDown = [True]
388+
# register as Python atexit handler
389+
atexit.register(self.shutDown)
390+
# register as termination signal handler
391+
if self.setting('RegisterSignalHandler'):
392+
self._sigTerm = signal.signal(signal.SIGTERM, self.sigTerm)
393+
try:
394+
self._sigHup = signal.signal(signal.SIGHUP, self.sigTerm)
395+
except AttributeError:
396+
pass # SIGHUP does not exist on Windows
397+
# register as mod_wsgi shutdown handler
398+
try:
399+
import mod_wsgi
400+
except ImportError: # mod_wsgi not installed
401+
subscribeShutdown = None
402+
else:
403+
try:
404+
subscribeShutdown = mod_wsgi.subscribe_shutdown
405+
except AttributeError: # mod_wsgi < 4.8.0
406+
try:
407+
subscribeShutdown = mod_wsgi.subscribe_events
408+
except AttributeError: # mod_wsgi < 4.4.11
409+
subscribeShutdown = None
410+
if subscribeShutdown:
411+
def shutDownHandler(event, **_kwargs):
412+
if event == 'process_stopping':
413+
print("\nWSGI application has been notified to shutdown.")
414+
self.shutDown()
415+
subscribeShutdown(shutDownHandler)
416+
388417
def shutDown(self):
389418
"""Shut down the application.
390419

0 commit comments

Comments
 (0)