2010-04-28 3 views
2

Проблема, с которой я наткнулся недавно, и, хотя я ее решил, я хотел бы услышать ваше мнение о том, какое правильное/простое/принятое решение будет.Webfaction apache + mod_wsgi + проблема конфигурации django

Я занимаюсь разработкой веб-сайта с использованием Django + python. Когда я запускаю его на локальном компьютере с «python manage.py runningerver», по умолчанию локальный адрес равен http://127.0.0.1:8000/.

Однако на сервере производства мое приложение имеет другой URL, с пути - как «http://server.name/myproj/»

Мне нужно создавать и использовать постоянные URLs. Если я использую {% URL вид Params%}, я получаю пути, которые являются по отношению к /, так как мой urls.py содержит это

urlpatterns = patterns('', 
(r'^(\d+)?$', 'myproj.myapp.views.index'), 
(r'^img/(.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT + '/img' }), 
(r'^css/(.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT + '/css' }), 
) 

До сих пор я вижу 2 решения:

  1. изменения urls.py, включают в себя «/ MYPROJ /» в случае производственного цикла
  2. использования request.build_absolute_uri() для создания ссылки в views.py или передать некоторую переменную с «имя хоста: порт/путь» в шаблонах

Есть ли более красивый способ s для решения этой проблемы? Спасибо.

Обновление: Ну, проблема, похоже, не в django, а в способе webfaction для настройки wsgi. Конфигурация Apache для приложения с URL «hostname.com/myapp» содержит следующую строку

WSGIScriptAlias//home/dreamiurg/webapps/pinfont/myproject.wsgi 

Итак, SCRIPT_NAME пуст, и единственное решение, которое я вижу, чтобы добраться до mod_python или служить мое заявление от корня. Есть идеи?

ответ

3

Вам не нужно ничего делать особо. Django чтит переменную окружения SCRIPT_NAME, установленную mod_wsgi, когда вы обслуживаете сайт Django, отличный от корневого, и автоматически добавляет его в код обратного URL.

Если вы используете mod_python (вам не должно быть), вам может потребоваться установить django.root в вашей конфигурации Apache.

Обновлено Я подозреваю, что это связано с тем, как что Webfaction обслуживает сайты Django через прокси экземпляра Apache - этот экземпляр не имеет знание фактического не точку монтирования, как определено панели управления Webfaction в.

В этом случае вам, вероятно, нужно будет установить SCRIPT_NAME вручную в вашем сценарии .wsgi. Я думаю, что это должно работать:

_application = django.core.handlers.wsgi.WSGIHandler() 

def application(environ, start_response): 
    os.environ['SCRIPT_NAME'] = '/myproj/' 
    return _application(environ, start_response) 
+0

Ну, это не так - по крайней мере, не с webfaction hosting. Я использую mod_wsgi и дал urlpatterns выше, следующий код «от django.core.urlresolvers импорта обратного постоянной ссылка = обратный („myproj.myapp.views.index“)» будет возвращать «/». Кроме того, {% url pinfont.label.views.index%} даст тот же путь "/". –

+1

Спасибо, мне удалось найти причину проблемы, но вы действительно помогли с решением .wsgi. Небольшое исправление - пожалуйста, измените «os.environ» на «environment» в строке 4. –

2

Изменение:

WSGIScriptAlias//home/dreamiurg/webapps/pinfont/myproject.wsgi 

к:

WSGIScriptAlias /myproj /home/dreamiurg/webapps/pinfont/myproject.wsgi 

Затем измените Nginx передний конец конфигурации WebFaction к прокси '/ MYPROJ' на заднем конце вместо '/'.

Это должно быть все, что требуется. Вы не должны использовать префикс '/ myproj' в urls.py.

Другими словами, просто убедитесь, что точка крепления для заднего конца такая же, как там, где она установлена, установлена ​​на переднем конце.

Измените файл сценария WSGI, чтобы выпустить SCRIPT_NAME, хотя он может работать, как правило, не рекомендуется, поскольку Apache/mod_wsgi не позволяет делать правильные вещи, которые могут иметь другие последствия.

+0

Спасибо, я попробую это также –

Смежные вопросы