Хорошо, я сам решил проблему, поэтому я отвечу на свой вопрос.Я обнаружил, что нет журнала apache или какого-либо другого источника информации, чтобы выяснить, что именно вызывает ошибку импорта.Итак, я поделюсь своим методом ниже, как более «рациональным» подходом, в надежде, что я смогу сэкономить кому-то несколько разочаровывающих часов случайных изменений.
Для справки, вот конфигурация apache, которую я использовал,
<Location "/mysite/">
SetHandler python-program
PythonHandler django.core.handlers.modpython
SetEnv DJANGO_SETTINGS_MODULE mysite_django.settings
PythonOption django.root /mysite
PythonDebug On
PythonPath "['/home/mysite/prg/mysite/mysite_django', '/home/mysite/prg/mysite'] + sys.path"
</Location>
Я создал пользователя «mysite» на сервере, и django settings.py находится в (несколько избыточно названном) месте /home/mysite/prg/mysite/mysite_django/settings.py
.Я открываю канал SSH к серверу.В этом случае я использую очень полезную утилиту screen
для быстрого переключения между пользователями (но второй канал ssh будет работать так же хорошо)
screen
Нажмите Ctrl-A, Ctrl-C, чтобы создать новыйэкран.Теперь важно видеть разрешения точно так, как это делает apache, поэтому я переключаюсь на пользователя, который запускает apache, то есть www-data в системах debian:
sudo -i -u www-data
Я собираюсь попытаться импортировать настройки.py себя из среды python:
python
>>> import os, sys
>>> print sys.path
... result omitted ...
Это, очевидно, должно дать вам стандартный sys.path без каких-либо каталогов "mysite", потому что мы работаем с простым python.Поэтому я изменил sys.path следующим образом.Я вставил копию прямо из конфигурации apache, чтобы избежать опечаток:
>>> sys.path = ['/home/mysite/prg/mysite/mysite_django', '/home/mysite/prg/mysite'] + sys.path
>>> import mysite_django.settings
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named mysite_django.settings
Как и ожидалось, я получаю ту же ошибку, которую уже видел при загрузке своего сайта в браузере.Так что я могу воспроизвести проблему в среде Python, это хорошо.Очевидно, что путь сборки должен быть сформирован из записи пути sys «/ home / mysite / prg / mysite» плюс запрошенный путь импорта «mysite_django / settings.py».Так почему же он не импортирует?Давайте удостоверимся, что данная запись sys path действительно существует
>>> os.path.exists (sys.path[0])
False
Она не существует?Странный.
>>> os.path.exists ('/home')
True
>>> os.path.exists ('/home/mysite')
True
>>> os.path.exists ('/home/mysite/prg/')
True
>>> os.path.exists ('/home/mysite/prg/mysite')
True
>>> os.path.exists ('/home/mysite/prg/mysite/mysite_django')
False
Здесь я понимаю, что с разрешениями mysite_django что-то не так.Вероятно, остаток от всех случайных изменений, которые я сделал.Но на самом деле проблема в каталоге выше, mysite, потому что именно здесь он пытается прочитать список каталогов.Я переключаюсь на экран суперпользователя с помощью Ctrl-A, Ctrl-N и использую chmod
, чтобы установить разрешения для mysite таким образом, чтобы они совпадали с последним каталогом, который прошел успешно:
$ ls -la /home/mysite/prg
total 12
drwxr-xr-x 3 mysite mysite 4096 2011-11-08 11:24 .
drwxr-xr-x 7 mysite mysite 4096 2011-11-08 14:56 ..
drwxr-xr-- 6 mysite mysite 4096 2011-11-08 11:35 mysite
$ chmod o+x /home/mysite/prg/mysite/
$ ls -la /home/mysite/prg
total 12
drwxr-xr-x 3 mysite mysite 4096 2011-11-08 11:24 .
drwxr-xr-x 7 mysite mysite 4096 2011-11-08 14:56 ..
drwxr-xr-x 6 mysite mysite 4096 2011-11-08 11:35 mysite
Переключениевернуться к экрану www-данных с помощью Ctrl-A, Ctrl-N:
>>> os.path.exists ('/home/mysite/prg/mysite/mysite_django')
True
>>> os.path.exists ('/home/mysite/prg/mysite/mysite_django/settings.py')
True
Теперь для финального теста
>>> import mysite_django.settings
>>>
Yay!Успех Мы можем даже пойти дальше и проверить, что django может загрузить
>>> from django.core.management import setup_environ
>>> setup_environ(mysite_django.settings)
'/home/mysite/prg/mysite/mysite_django'
. В этот момент сайт снова работал в моем браузере.
Выполнив эти шаги, вы можете по крайней мере убедиться, что:
- нет проблем с правами для settings.py для пользователя www-data
- нет ошибок в настройке PythonPath вашей конфигурации apache
- естьнет ошибок времени выполнения при импорте settings.py