﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
9805	reverse() does not add SCRIPT_NAME to the returned URL if called from middleware modules	ElliottM	Malcolm Tredinnick	"For example, take the following middleware.py file, with one example middleware thing that redirects you to the login page if you are not logged in:

{{{
#!python
login_url=reverse('login')

class LoginMiddleware():
	def process_request(self, request):		
		if(request.user.is_anonymous() and request.path!=login_url):
			#force login
			return HttpResponseRedirect(login_url+'?next='+request.path)
}}}

In this case, login_url will be correct except for the fact that it will be missing the SCRIPT_NAME. Putting the reverse() call inside the process_request function solves the problem, but it makes no sense at all to call that reverse function for every request when it can be called once at server startup.

The cause is in django.core.handles.wsgi and django.core.handlers.modpython

{{{
#!python
if self._request_middleware is None:
   self.load_middleware()

set_script_prefix(req.get_options().get('django.root', ''))
}}}

As you can see, ""set_script_prefix"" is called AFTER middleware is loaded, so the script name is still unset when reverse() is called in the middleware above. Moving the set_script_prefix call above the load_middleware function solves the problem.
"	Bug	closed	Core (Other)	1.0	Normal	wontfix			Accepted	1	0	0	0	0	0
