mirror of
https://github.com/django/django.git
synced 2025-04-22 00:04:43 +00:00
Fixed #32915 - Don't catch ImportErrors unless it's the settings module that can't be imported
Based on work by Rohith PR and others in PR #14622
This commit is contained in:
parent
f05edb2b43
commit
f992997fbe
@ -163,7 +163,13 @@ class Settings:
|
||||
# store the settings module in case someone later cares
|
||||
self.SETTINGS_MODULE = settings_module
|
||||
|
||||
mod = importlib.import_module(self.SETTINGS_MODULE)
|
||||
try:
|
||||
mod = importlib.import_module(self.SETTINGS_MODULE)
|
||||
except ImportError as exc:
|
||||
# If the settings module cannot be imported, treat it as a configuration error.
|
||||
if exc.name == self.SETTINGS_MODULE:
|
||||
raise ImproperlyConfigured(f"Settings module {self.SETTINGS_MODULE} could not be imported") from exc
|
||||
raise
|
||||
|
||||
tuple_settings = (
|
||||
"ALLOWED_HOSTS",
|
||||
|
@ -382,7 +382,9 @@ class ManagementUtility:
|
||||
settings.INSTALLED_APPS
|
||||
except ImproperlyConfigured as exc:
|
||||
self.settings_exception = exc
|
||||
except ImportError as exc:
|
||||
# The following commands can be run even without a valid settings file configured
|
||||
if subcommand not in {'startproject', 'startapp', 'makemessages'}:
|
||||
sys.stderr.write(str(exc) + '\n')
|
||||
self.settings_exception = exc
|
||||
|
||||
if settings.configured:
|
||||
|
@ -1412,12 +1412,12 @@ class ManageSettingsWithSettingsErrors(AdminScriptTestCase):
|
||||
self.write_settings(
|
||||
"settings.py",
|
||||
extra="from django.core.exceptions import ImproperlyConfigured\n"
|
||||
"raise ImproperlyConfigured()",
|
||||
"raise ImproperlyConfigured('Improper configuration')",
|
||||
)
|
||||
args = ["help"]
|
||||
out, err = self.run_manage(args)
|
||||
self.assertOutput(out, "only Django core commands are listed")
|
||||
self.assertNoOutput(err)
|
||||
self.assertOutput(err, "Improper configuration")
|
||||
|
||||
|
||||
class ManageCheck(AdminScriptTestCase):
|
||||
|
@ -338,6 +338,20 @@ class SettingsTests(SimpleTestCase):
|
||||
with self.assertRaisesMessage(ValueError, "Incorrect timezone setting: test"):
|
||||
settings._setup()
|
||||
|
||||
def test_unable_to_import_settings_module(self):
|
||||
with self.assertRaisesMessage(
|
||||
ImproperlyConfigured, "Settings module fake_settings_module could not be imported"
|
||||
):
|
||||
Settings('fake_settings_module')
|
||||
|
||||
def test_unable_to_import_a_random_module(self):
|
||||
def mock_import_module(_):
|
||||
raise ModuleNotFoundError("No module named 'fake_module'", name="fake_module")
|
||||
|
||||
with mock.patch("importlib.import_module", mock_import_module):
|
||||
with self.assertRaisesMessage(ImportError, "No module named 'fake_module'"):
|
||||
Settings('fake_settings_module')
|
||||
|
||||
|
||||
class TestComplexSettingOverride(SimpleTestCase):
|
||||
def setUp(self):
|
||||
|
Loading…
x
Reference in New Issue
Block a user