diff --git a/sanic/config.py b/sanic/config.py index c5e42de5..3e968117 100644 --- a/sanic/config.py +++ b/sanic/config.py @@ -1,6 +1,8 @@ import os import types +from sanic.exceptions import PyFileError + SANIC_PREFIX = 'SANIC_' @@ -83,6 +85,9 @@ class Config(dict): except IOError as e: e.strerror = 'Unable to load configuration file (%s)' % e.strerror raise + except Exception as e: + raise PyFileError(filename) from e + self.from_object(module) return True diff --git a/sanic/exceptions.py b/sanic/exceptions.py index e90dff7a..b535b38f 100644 --- a/sanic/exceptions.py +++ b/sanic/exceptions.py @@ -223,6 +223,11 @@ class InvalidRangeType(ContentRangeError): pass +class PyFileError(Exception): + def __init__(self, file): + super().__init__('could not execute config file %s', file) + + @add_status_code(401) class Unauthorized(SanicException): """ diff --git a/tests/test_config.py b/tests/test_config.py index a515ee8d..7ee291d1 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -6,6 +6,7 @@ from textwrap import dedent import pytest from sanic import Sanic +from sanic.exceptions import PyFileError @contextmanager @@ -87,6 +88,16 @@ def test_load_from_missing_envvar(app): "could not be loaded.") +def test_load_config_from_file_invalid_syntax(app): + config = b"VALUE = some value" + with NamedTemporaryFile() as config_file: + config_file.write(config) + config_file.seek(0) + + with pytest.raises(PyFileError): + app.config.from_pyfile(config_file.name) + + def test_overwrite_exisiting_config(app): app.config.DEFAULT = 1