[Django] #34765: call_command reuses already loaded command causing stale class variable usage

5 views
Skip to first unread message

Django

unread,
Aug 4, 2023, 1:42:53 PM8/4/23
to django-...@googlegroups.com
#34765: call_command reuses already loaded command causing stale class variable
usage
-------------------------------------+-------------------------------------
Reporter: MaziyarMK | Owner: nobody
Type: Bug | Status: new
Component: Core | Version: 4.2
(Management commands) |
Severity: Normal | Keywords: call_command
Triage Stage: | Has patch: 0
Unreviewed |
Needs documentation: 0 | Needs tests: 0
Patch needs improvement: 0 | Easy pickings: 0
UI/UX: 0 |
-------------------------------------+-------------------------------------
Hi,

If a custom command has custom class variables that are used in handle(),
previously set values are re-used on the next call to the same command
because a new instance is not initialized.

because of:

{{{
if isinstance(app_name, BaseCommand):
# If the command is already loaded, use it directly.
command = app_name
else:
command = load_command_class(app_name, command_name)
}}}

https://github.com/django/django/blob/8edaf07a28a3e3848ab1edbdcd2fdc25e6bd6015/django/core/management/__init__.py#L272

I have seen this cause issues when the same command is called several
times in a test.

Proposed solution:
Either warn the user about defining custom class level variables, or don't
re-use the initialized command, instead kill the old object and create a
new one on each use. As an optimizaiton we can require this only on custom
commands, and let the base commands keep using the optimized-path with
cached command instance.

Bug introduced in:
https://github.com/django/django/commit/901c3708fb8a2e51bddd37358f8e536282a8c266

--
Ticket URL: <https://code.djangoproject.com/ticket/34765>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

Reply all
Reply to author
Forward
0 new messages