Opened 23 months ago

Last modified 4 weeks ago

#28752 assigned Cleanup/optimization

django.setup() should be idempotent — at Version 6

Reported by: pascal chambon Owned by: nobody
Component: Core (Other) Version: 1.11
Severity: Normal Keywords:
Cc: Aymeric Augustin Triage Stage: Accepted
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by pascal chambon)

I've been bitten numerous times by the impredictable behaviour of django
when django.setup() was called numerous times.

In the old days I had exceptions, now it's mainly subtle breakages of
logging configuration.

I couldn't find, in the issue tracker or the dev mailing list statements
about this subject, others than request from other users encountering the
problem.

For example this ticket concerned script+importable modules :
https://code.djangoproject.com/ticket/26152

The latest case in date for me is pytest-django having troubles with
these multiple setup() calls : https://github.com/pytest-dev/pytest-
django/issues/531 , due to multiple fixtures attempting this auto-setup.

Would it be OK to make django.setup() idempotent, or even expose a
"is_ready" flag for easier introspection ?

-- here are some updates, comments get rejected as spam --

Calling django.setup() multiple times is useless, BUT it can happen in lots of cases, that's why imho this case should be handled by the framework to avoid nasty side effects.

These "duplicate calls" often involve the collision between manage.py commands, tests, custom scripts, and external launchers like pytest-django. Plus maybe some corner cases when unittest-style TestCases and pytest-style test functions are mixed in the same project.

Users have to do a real gym to call setup() "at some moment" in all these use cases, yet try to prevent multiple calls of this initialization step (like the 'ifname == "main"' protection). So far my only way out was often to check for (not really undocumented) states of the framework before calling setup().

Change History (6)

comment:1 Changed 23 months ago by Tim Graham

Resolution: duplicate
Status: newclosed
Summary: Django.setup() should be idempotentdjango.setup() should be idempotent

I believe this is addressed in Django 2.0 by #27176. If not, please reopen with a minimal project that reproduces the problem you're encountering.

comment:2 Changed 23 months ago by pascal chambon

Description: modified (diff)
Resolution: duplicate
Status: closednew

comment:3 Changed 23 months ago by Tim Graham

Thanks. Can you explain the use case for calling django.setup() multiple times?

comment:4 Changed 23 months ago by pascal chambon

Description: modified (diff)

comment:5 Changed 23 months ago by pascal chambon

Description: modified (diff)

comment:6 Changed 23 months ago by pascal chambon

Description: modified (diff)
Note: See TracTickets for help on using tickets.
Back to Top