#34765 closed Bug (invalid)
call_command reuses already loaded command causing stale class variable value usage
| Reported by: | MaziyarMK | Owned by: | nobody |
|---|---|---|---|
| Component: | Core (Management commands) | Version: | 4.2 |
| Severity: | Normal | Keywords: | |
| Cc: | Triage Stage: | Unreviewed | |
| Has patch: | no | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
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)
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
Change History (3)
comment:1 by , 2 years ago
| Summary: | call_command reuses already loaded command causing stale class variable usage → call_command reuses already loaded command causing stale class variable value usage |
|---|
comment:2 by , 2 years ago
| Resolution: | → invalid |
|---|---|
| Status: | new → closed |
comment:3 by , 2 years ago
| Keywords: | call_command removed |
|---|
Hello,
Thank you for report, though the issue you are describing is how class variables work in Python. This is not a Django specific issue, perhaps you should consider storing you state-data as an instance variable instead.
If you need further help, please consider using any of the user support channels from this link.