diff options
| author | Jacob Walls <jacobtylerwalls@gmail.com> | 2023-08-31 20:15:22 -0400 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2023-09-01 13:24:05 +0200 |
| commit | bcd80de8b5264d8c853bbd38bfeb02279a9b3799 (patch) | |
| tree | 331cb588e34e4f655279bf5026e3b03fb56f5198 | |
| parent | 9a9620dda649dcdb685662bbd9cb409bfeff4214 (diff) | |
Fixed #34778 -- Avoided importing modules in startapp/startproject.
| -rw-r--r-- | django/core/management/templates.py | 10 | ||||
| -rw-r--r-- | tests/admin_scripts/tests.py | 22 |
2 files changed, 25 insertions, 7 deletions
diff --git a/django/core/management/templates.py b/django/core/management/templates.py index c9cdc25566..633eed781d 100644 --- a/django/core/management/templates.py +++ b/django/core/management/templates.py @@ -5,7 +5,7 @@ import posixpath import shutil import stat import tempfile -from importlib import import_module +from importlib.util import find_spec from urllib.request import build_opener import django @@ -275,12 +275,8 @@ class TemplateCommand(BaseCommand): type=name_or_dir, ) ) - # Check it cannot be imported. - try: - import_module(name) - except ImportError: - pass - else: + # Check that __spec__ doesn't exist. + if find_spec(name) is not None: raise CommandError( "'{name}' conflicts with the name of an existing Python " "module and cannot be used as {an} {app} {type}. Please try " diff --git a/tests/admin_scripts/tests.py b/tests/admin_scripts/tests.py index 57fbc454ff..7f39d7fcfc 100644 --- a/tests/admin_scripts/tests.py +++ b/tests/admin_scripts/tests.py @@ -2447,6 +2447,28 @@ class StartProject(LiveServerTestCase, AdminScriptTestCase): ) self.assertFalse(os.path.exists(testproject_dir)) + def test_command_does_not_import(self): + """ + startproject doesn't import modules (and cannot be fooled by a module + raising ImportError). + """ + bad_name = "raises_import_error" + args = ["startproject", bad_name] + testproject_dir = os.path.join(self.test_dir, bad_name) + + with open(os.path.join(self.test_dir, "raises_import_error.py"), "w") as f: + f.write("raise ImportError") + + out, err = self.run_django_admin(args) + self.assertOutput( + err, + "CommandError: 'raises_import_error' conflicts with the name of an " + "existing Python module and cannot be used as a project name. Please try " + "another name.", + ) + self.assertNoOutput(out) + self.assertFalse(os.path.exists(testproject_dir)) + def test_simple_project_different_directory(self): """ The startproject management command creates a project in a specific |
