wsgi.py: Fix broken error ouput for django.setup() call.

It's common for a broken settings.py file to result in Django not
starting, thus never writing to `/var/log/zulip/errors.log`.  Such
behavior can be discouraging when the server 500s without a traceback
to accompany it.  To fix this, we simply catch any exceptions in
django.setup(), if raised, and log the exception appropriately.

Comments tweaked by tabbott.

Closes: #7032.
This commit is contained in:
Wyatt Hoodes 2019-06-17 21:50:06 -10:00 committed by Tim Abbott
parent b44d97688d
commit 3c1982ecab
1 changed files with 16 additions and 1 deletions

View File

@ -21,8 +21,23 @@ sys.path.append(BASE_DIR)
import scripts.lib.setup_path_on_import
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "zproject.settings")
import django
django.setup() # We need to call setup to load applications.
try:
django.setup()
except Exception as e:
# If /etc/zulip/settings.py contains invalid syntax, Django
# initialization will fail in django.setup(). In this case, our
# normal configuration to logs errors to /var/log/zulip/errors.log
# won't have been initialized. Since it's really valuable for the
# debugging process for a Zulip 500 error to always be "check
# /var/log/zulip/errors.log", we log to that file directly here.
import logging
logging.basicConfig(filename='/var/log/zulip/errors.log', level=logging.INFO,
format='%(asctime)s %(levelname)s %(name)s %(message)s')
logger = logging.getLogger(__name__)
logger.exception(e)
raise
# Because import_module does not correctly handle safe circular imports we
# need to import zerver.models first before the middleware tries to import it.