#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 , 17 months 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 , 17 months ago
Resolution: | → invalid |
---|---|
Status: | new → closed |
comment:3 by , 17 months 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.