Opened 4 years ago

Last modified 4 months ago

#16734 new Bug

urlresolvers doesn't get a script prefix from manage.py

Reported by: d00gs Owned by: nobody
Component: Core (Management commands) Version: 1.3
Severity: Normal Keywords:
Cc: julenx@…, AkosLadanyi Triage Stage: Accepted
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

The script prefix for django.core.urlresolvers doesn't get set to anything when being called through manage.py, because of course it doesn't know what that value should be. This is a problem if you're rendering views (or otherwise reversing urls) from a manage.py command (as one of my sites does to send emails).

This is solvable by calling set_script_prefix from settings.py, but that feels kind of dirty since it's then about to be rewritten in the WSGI handler.

I don't know what a good solution to this would be. Perhaps it would be nice to be able to set a global default script path somewhere that would then get incorporated into the default values of things like LOGIN_URL.

Maybe just a note in the documentation would be good. It took me a while to figure out, because I haven't been able to find anything else about this online. (I guess that non-/ script paths are uncommon and reversing urls from manage.py is also uncommon, so both together are very uncommon.)

Change History (8)

comment:1 Changed 4 years ago by aaugustin

  • Needs documentation unset
  • Needs tests unset
  • Patch needs improvement unset
  • Triage Stage changed from Unreviewed to Accepted

Based on code inspection, I confirm that this bug exists.

Possible fix: django.core.management.setup_environ could do something along the lines of:

from django.conf import settings
from django.core.management.base import set_script_prefix
from django.utils.encoding import force_unicode

set_script_prefix(u'/' if settings.FORCE_SCRIPT_NAME is None else force_unicode(settings.FORCE_SCRIPT_NAME))

comment:2 Changed 21 months ago by julen

  • Cc julenx@… added

comment:3 Changed 17 months ago by AkosLadanyi

  • Cc AkosLadanyi added

comment:4 Changed 17 months ago by AkosLadanyi

If it is not possible to figure out the value of script_prefix in all cases (like in manage.py) why not just store its value in a settings variable? Then reverse could just prepend this value to all paths deduced from urlconf.

comment:5 Changed 4 months ago by julen

Would it make sense to call set_script_prefix() in ManagementUtility's execute() method, once settings have been configured?

comment:6 Changed 4 months ago by timgraham

django.setup() seems to be a natural place for it.

comment:7 Changed 4 months ago by julen

I thought so initially, but this issue is limited to management commands, that's why I wonder about ManagementUtility.execute(). Once the right location for this is confirmed, the fix should be trivial.

comment:8 Changed 4 months ago by timgraham

I imagine it would also affect standalone scripts that invoke django.setup() but don't use ManagementUtility.

Note: See TracTickets for help on using tickets.
Back to Top