Opened 5 years ago

Closed 8 months ago

#16734 closed New feature (fixed)

Set script prefix in django.setup() to allow its usage outside of requests

Reported by: d00gs Owned by: nobody
Component: Core (Management commands) Version: master
Severity: Normal Keywords:
Cc: julenx@…, AkosLadanyi Triage Stage: Ready for checkin
Has patch: yes 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 (12)

comment:1 Changed 5 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 3 years ago by julen

  • Cc julenx@… added

comment:3 Changed 2 years ago by AkosLadanyi

  • Cc AkosLadanyi added

comment:4 Changed 2 years 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 14 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 14 months ago by timgraham

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

comment:7 Changed 14 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 14 months ago by timgraham

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

comment:9 Changed 8 months ago by claudep

  • Has patch set
  • Needs documentation set
  • Version changed from 1.3 to master

comment:10 Changed 8 months ago by claudep

  • Needs documentation unset

comment:11 Changed 8 months ago by timgraham

  • Summary changed from urlresolvers doesn't get a script prefix from manage.py to Set script prefix in django.setup() to allow its usage outside of requests
  • Triage Stage changed from Accepted to Ready for checkin
  • Type changed from Bug to New feature

comment:12 Changed 8 months ago by Claude Paroz <claude@…>

  • Resolution set to fixed
  • Status changed from new to closed

In 7d81ee6e:

Fixed #16734 -- Set script prefix even outside of requests

Thanks Tim Graham for the review.

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