несколько проектов Django в одном URL - PullRequest
2 голосов
/ 22 июня 2011

Я бы хотел, чтобы несколько проектов django жили с одним и тем же корневым URL:

example.com/ # controlled by home django project  
example.com/project-2 # controlled by a separate django project  
example.com/project-3 # controlled by yet another django project  

Я уже переопределяю LOGIN_REDIRECT_URL и т. Д. Как , предложенный этим превосходным ответом , но я обнаружил еще одно препятствие. Я на самом деле использую те же приложения в проектах, которые находятся по адресу example.com/project-2 и example.com/project-3, что вызывает некоторые нетривиальные проблемы с ссылками на контент внутри проекта django, которые до сих пор были решено на первый взгляд хакерскими решениями.

Например, вы никогда не можете ссылаться на '/' в любом шаблоне в example.com/project-2 или example.com/project-3, чтобы вернуться в корень проекта django, размещенного на любом из этих URL-адресов. - это будет ссылка на домашний проект django на example.com. Чтобы обойти это, я создал контекстный процессор, который правильно добавляет корневой URL-адрес проекта на основе пользовательской переменной settings.py SCRIPT_NAME: '' (например, com.com), '/ project-2' (например, example.com). / project-2) или '/ project-3' (например ,.com/project-3). Это все хорошо, за исключением того, что вам нужно сделать то же самое в функциях get_absolute_url. Прежде чем я знал это, я только что превратил кучу кода, который можно было многократно использовать (не для меня), в код, который вообще нельзя было использовать повторно.

Есть ли способ добиться того же эффекта, не добавляя абсолютные URL-адреса с помощью SCRIPT_NAME? Возможно, что-то умное с конфигурацией apache или mod_wsgi? Я в недоумении и надеюсь, что кто-то может помочь ...

РЕДАКТИРОВАТЬ:

Моя конфигурация apache для example.com выглядит следующим образом:

# redirect un-'/'-terminated urls to the '/'-terminated root urls
RewriteEngine On
RewriteRule /project-2$ /project-2/ [R=302,L]
RewriteRule /project-3$ /project-3/ [R=302,L]

# mod wsgi setup
WSGIScriptAlias /project-2 /srv/project2/project-2.wsgi
WSGIScriptAlias /project-3 /srv/project3/project-3.wsgi
WSGIScriptAlias / /srv/project1/project-1.wsgi

1 Ответ

3 голосов
/ 22 июня 2011

Вы не показываете, как вы обслуживаете эти проекты из конфигурации Apache, что было бы полезно.Но если вы определите их как отдельные директивы WSGIScriptAlias, то SCRIPT_NAME будет автоматически передано вам, и Django учтет это при обращении и создании URL.

WSGIScriptAlias /project-2 /srv/project2/project2.wsgi
WSGIScriptAlias /project-3 /srv/project3/project3.wsgi
WSGIScriptAlias / /srv/project1/project1.wsgi
...