Webfaction apache + mod_wsgi + проблема конфигурации django - PullRequest
2 голосов
/ 28 апреля 2010

Проблема, с которой я недавно столкнулся, и, хотя я решил ее, я хотел бы услышать ваше мнение о том, каким будет правильное / простое / принятое решение.

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

Однако на рабочем сервере у моего приложения есть другой URL с указанием пути, например "http://server.name/myproj/"

Мне нужно создать и использовать постоянные URL. Если я использую {% url view 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 или передайте некоторую переменную с 'hostname: port / path' в шаблонах

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 28 апреля 2010

Тебе не нужно делать ничего особенного. 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)
2 голосов
/ 29 апреля 2010

Изменение:

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

до:

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

Затем измените конфигурацию внешнего интерфейса nginx WebFaction на proxy на '/ myproj' на внутреннем конце вместо '/'.

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...