Разрешение URL Django не работает при запуске Apache / WSGI - PullRequest
4 голосов
/ 10 марта 2011

Когда я запускаю свое приложение, используя встроенный сервер Djangos, все работает нормально. Но когда я пытаюсь запустить через Apache и WSGI, URL больше не распознается, а находится в файле urls.py.

Я получаю сообщение об ошибке:

Page not found (404)
Request Method: GET
Request URL:    http://localhost/project/app/live/
Using the URLconf defined in project.urls, Django tried these URL patterns, in this order:
    ^media/(?P<path>.*)$
    ^app/live/
The current URL, app/live/, didn't match any of these.
You're seeing this error because you have DEBUG = True in your Django settings file. Change that to False, and Django will display a standard 404 page.

Как видите, URL (app / live /) находится прямо в шаблонах URL из файла urls.py верхнего уровня. Также нет ошибок в файле Apache errors.log.

Мои urls.py:

from django.conf.urls.defaults import *
from django.conf import settings

urlpatterns = patterns('',
                       (r'^media/(?P<path>.*)$', 'django.views.static.serve', 
                        { 'document_root': settings.MEDIA_ROOT }),
                       (r'^app/live/', include('project.app.urls', app_name='live')),
                       )

Мой файл WSGI:

import os
import sys

sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/../..')

os.environ["DJANGO_SETTINGS_MODULE"] = "project.settings"

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

И, наконец, моя конфигурация Apache:

WSGIDaemonProcess   project processes=2 maximum-requests=500 threads=1
WSGIProcessGroup    project
WSGIScriptReloading On

WSGIScriptAlias /project /home/user/project/apache/project.wsgi

EDIT:

После ввода некоторого отладочного вывода в RegexURLResolver я увидел, что он пытается разрешить как app/live/, так и project/app/live/.

Итак, я изменил свой файл urls.py на этот:

from django.conf.urls.defaults import *
from django.conf import settings

urlpatterns = patterns('',
                       (r'^app/live/', include('project.app.urls', app_name='live')),
                       (r'^project/app/live/', include('project.app.urls', app_name='live')),
                       )

Работает сейчас.

Ответы [ 4 ]

2 голосов
/ 19 октября 2011

УДАЛЕНИЕ косая черта на WSGIScriptAlias /django у меня сработало

1 голос
/ 25 марта 2016

Ненавижу возвращать старый поток к жизни, но я исправил эту проблему, убедившись, что мой конфиг apache2 заключил путь python в кавычки, такие как:

WSGIScriptAlias / /home/user/django_project/wsgi.py
WSGIPythonPath "/home/user:/home/user/.virtualenvs/djangodev/lib/python3.4/site-packages"

Я использую Django 1.9, python3.4и virtualenv во время следования этого урока .

ОБНОВЛЕНИЕ: Поцарапайте, я бордовый и недостаточно читал, чтобы понять, что мне нужно использоватьmod_wsgi в режиме демона, чтобы избежать необходимости перезапускать apache каждый раз, когда я делаю изменения.

WSGIDaemonProcess example.com python-path="/home/user:/home/user/.virtualenvs/djangodev/lib/python3.4/site-packages"
WSGIProcessGroup example.com
WSGIScriptAlias / /home/user/django_project/wsgi.py process-group=example.com
1 голос
/ 10 марта 2011

Решение 1, отредактируйте ваши конфиги apache:

WSGIScriptAlias / /home/user/project/apache/project.wsgi

Решение 2, отредактируйте ваш urls.py:

from django.conf.urls.defaults import *
from django.conf import settings

urlpatterns = patterns('',
                   (r'^/project/media/(?P<path>.*)$', 'django.views.static.serve', 
                    { 'document_root': settings.MEDIA_ROOT }),
                   (r'^/project/app/live/', include('project.app.urls', app_name='live')),
                   )

Кроме того, вы, вероятно, не хотите передавать статический контент через django, если вы используете apache:

Alias /media /path/to/media/root
<Location /media>
SetHandle None
</Location>
1 голос
/ 10 марта 2011

Добавьте косую черту в свой префикс пути URL в конфигурации Apache:

WSGIScriptAlias /project/ /home/user/project/apache/project.wsgi
...