Opened 5 years ago

Closed 11 months ago

#16734 closed New feature (fixed)

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

Reported by: Dougal Sutherland 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


The script prefix for django.core.urlresolvers doesn't get set to anything when being called through, 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 command (as one of my sites does to send emails).

This is solvable by calling set_script_prefix from, 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 is also uncommon, so both together are very uncommon.)

Change History (12)

comment:1 Changed 5 years ago by Aymeric Augustin

Needs documentation: unset
Needs tests: unset
Patch needs improvement: unset
Triage Stage: UnreviewedAccepted

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

Possible fix: could do something along the lines of:

from django.conf import settings
from 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 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 17 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 17 months ago by Tim Graham

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

comment:7 Changed 17 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 17 months ago by Tim Graham

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

comment:9 Changed 11 months ago by Claude Paroz

Has patch: set
Needs documentation: set
Version: 1.3master

comment:10 Changed 11 months ago by Claude Paroz

Needs documentation: unset

comment:11 Changed 11 months ago by Tim Graham

Summary: urlresolvers doesn't get a script prefix from manage.pySet script prefix in django.setup() to allow its usage outside of requests
Triage Stage: AcceptedReady for checkin
Type: BugNew feature

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

Resolution: fixed
Status: newclosed

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