marks34
marks34

Reputation: 2107

Django/Apache address problem

I have a django app running on http://djangohost/appaddress. I'd like the project to be available at http://differentaddress/app . Currently I'm able to run app at the desired address but using {% url %} templatetags gives me improper address in the form http://differentaddress/app/appaddress. Also when I go to django app address directly all {% url %} links are in the form http://djangohost/app/appadress How can I change this ? I have these entrances in apache conf :

ProxyPass  /app/  http://djangohost/appaddress/
ProxyPassReverse  /app/ http://djangohost/appaddress/

Upvotes: 1

Views: 956

Answers (3)

sasklacz
sasklacz

Reputation: 3628

Maybe not a proper solution but still some workaround for the problem without interfering with apache's settings. Tested with mod_msgi and it works like a charm. Here's the link : http://fromzerotocodehero.blogspot.com/2011/01/using-proxypass-with-django-project.html . Basically I've overriden built in url function here creating custom urlc temlpatetag. In tag's code I've added line replacing first occurence of unwanted app name with empty sign.

Upvotes: 0

AndiDog
AndiDog

Reputation: 70108

So you want to "mount" a Django site on a sub URL path? I already tried this with Apache and mod_proxy, and it was kind of a nightmare to find out. Here's what I have come up with (probably not complete or perfect):

# In your scenario
FORCE_SCRIPT_NAME = "/app/"

# End of settings
_prefix = (FORCE_SCRIPT_NAME or "")
LOGIN_URL          = _prefix + LOGIN_URL
LOGIN_REDIRECT_URL = _prefix + LOGIN_REDIRECT_URL
LOGOUT_URL         = _prefix + LOGOUT_URL
ADMIN_MEDIA_PREFIX = _prefix + ADMIN_MEDIA_PREFIX

Obviously, this prepends "/app/" to the most important hardcoded site URLs, plus it sets FORCE_SCRIPT_NAME to ensure that {% url something %} will result in an absolute URL of "/app/something", for instance.

This worked for me using mod_wsgi for the Django site and ProxyPass/ProxyPassReverse for the "mounting". Try it out and give me feedback, I'm interested whether this is a general solution.

Upvotes: 0

Carles Barrobés
Carles Barrobés

Reputation: 11683

You'll probably have to tell Django where it is running by manipulating SCRIPT_NAME

http://docs.djangoproject.com/en/dev/ref/settings/?from=olddocs#force-script-name

Or, if you want to keep things within Apache, you may give a try to mod_proxy_html - disclaimer: haven't used it myself, but it does claim to rewrite links in HTML pages

Upvotes: 1

Related Questions