Проблемы с перенаправлением URL-адресов при развертывании рабочего приложения django в apache (через mod_wsgi) - PullRequest
1 голос
/ 21 февраля 2011

У меня есть приложение django, которое отлично работает на сервере разработки django.Я пытаюсь развернуть его в apache2.2 с помощью mod_wsgi, и у меня есть ошибки.В файле httpd.conf я «смонтировал» свое приложение под root / myapp, используя:

WSGIScriptAlias /myapp /home/path_to_my_app/apache_conf/django.wsgi

Я следовал стандартным указаниям, чтобы подготовить django.wsgi.Теперь я могу получить доступ к шаблону главной страницы своего приложения, но, похоже, есть ошибки перенаправления.Корень «/ myapp» не вставляется автоматически в запросы перенаправления ULR.Запрос от шаблона главной страницы к некоторым модулям в views.py через urls.py не может быть правильно доставлен.Журнал ошибок apache:

127.0.0.1 - - [21/Feb/2011:16:11:44 +0100] "GET /myapp/ HTTP/1.1" 200 1795  
127.0.0.1 - - [21/Feb/2011:16:11:46 +0100] "GET /api/dir HTTP/1.1" 404 205

"/ api / dir" не существует, его следует сопоставлять с шаблоном в urls.py, но идентификатор не

У меня естьпотратил на это больше 2 дней, может кто-нибудь помочь?

Ответы [ 3 ]

1 голос
/ 23 февраля 2011

Наконец я нашел ошибку. Он был связан не с файлом httpd.conf, а с тем, как указываются URL-адреса как для файла django urls.py, так и для шаблонов.
Как я смонтировал myapp следующим образом:

WSGIScriptAlias /myapp my_path_to_wsgi_module/django.wsgi

Я полагал, что URL-адреса, указанные в файлах шаблонов django, должны иметь начальную косую черту, например: '/api/dir'
В результате приложение работает только на сервере разработки django, но не на apache.

Вместо этого, если вы используете URL без начального слеша, например:
'api/dir'
Приложение работает корректно как на сервере разработки django, так и на apache!

Вы должны избегать использования начальных слешей даже при сопоставлении с образцом файла django urls.py:
как это: (r'^api/dir$', 'available_services')
и НЕ так: (r'^/api/dir$', 'available_services')

Возможно, это очевидная вещь для опытных пользователей django, но если вы новичок, как я, это может заставить вас потерять определенное количество времени, потому что это трудная проблема для обнаружения.

1 голос
/ 21 февраля 2011

Похоже, вам не хватает некоторых вещей из вашей конфигурации Apache:

В рабочем конфиге для моего сервера у меня есть: </p> <pre><code># tell apache where to find the wsgi script. WSGIScriptAlias / "/home/path_to_my_app/wsgi/my.settings.wsgi" # turn on auto-reload in WSGI WSGIScriptReloading On WSGIReloadMechanism Process # assign a process to a process group WSGIDaemonProcess djangoapps processes=10 threads=1 maximum-requests=500 display-name=my-wsgi WSGIProcessGroup djangoapps

Ваша строка WSGIScriptAlias ​​верна, но вы должны указать wsgi, как вы собираетесь запускать ваше приложение. Скорее всего, вы получаете 404, потому что нет строки WSGIDaemonProcess, которая сообщала бы обработчику WSGI, как работать с вашим процессом.

http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives может быть полезным справочным материалом.

0 голосов
/ 06 февраля 2014

На самом деле это немного сложнее, чем просто.

В некоторых случаях вам нужны абсолютные URL-адреса в приложении, потому что вы не хотите получать URL-адрес относительно текущего URL-адреса.

например, у вас есть глобальное меню в основном шаблоне макета (т. Е. Шаблон, который «расширяется» каждым другим шаблоном в вашем проекте): вы не можете иметь относительные URL, такие как «home», «contact»,«about», «blog», потому что если вы находитесь в / yourapp / blog / records / 2014/02/06 / add (скажем, такой URL существует) и щелкаете по любому пункту меню, вы переходите (скажем, к «home»") / yourapp / blog / records / 2014/02/06 / add / home вместо / home, чего вы ожидаете.

Уродливое решение виртуальных хостов здесь хорошо (в Java Struts 2 имеет возможность разрешать URL для «действий» (то есть именованных URL-адресов / точек входа), включая каталог контекста развертывания, развернутый в веб-контейнере(например, tomcat)) ... не знаю, есть ли какая-либо настройка контекста, которую вы можете догадаться (возможно, можно вернуть текущий ключ "WSGIScriptAlias" в качестве переменной среды).После этого, используя обратную косую черту для URL ("/home").

...