Ошибка при развертывании Django на Apache - PullRequest
1 голос
/ 23 марта 2009

У меня есть небольшой сайт Django, который я пытаюсь запустить на HTTP-сервере Apache 2.2. Приложение работает нормально, используя "python manage.py runserver".

Django Версия: 1.0.2 финальная
Python: 2,5
ОС: Windows 2000

Я не прошел через шаги, описанные в документации , и после некоторой путаницы в моем httpd.conf вышло следующее:

<Location "/therap/">
SetHandler python-program
PythonHandler django.core.handlers.modpython
SetEnv DJANGO_SETTINGS_MODULE settings
PythonOption django.root /therap
PythonDebug On
PythonPath "['D:/therap/therap'] + sys.path"
</Location>

MaxRequestsPerChild 1

D: \ therap \ therap, где находится файл manage.py.

Когда я пытаюсь открыть в своем браузере, я вижу ошибку в стиле, используемом Джанго (в отличие от черного курьера на белом фоне.)

ImportError at /

No module named therap.urls

Request Method: GET
Request URL:    http://****:8080/
Exception Type: ImportError
Exception Value:   

No module named therap.urls

Exception Location: C:\python25\lib\site-packages\django\core\urlresolvers.py in _get_urlconf_module, line 200
Python Executable:  C:\Programme\Apache Software Foundation\Apache2.2\bin\httpd.exe
Python Version:     2.5.1
Python Path:        ['D:/therap/therap', 'C:\\WINNT\\system32\\python25.zip', 'C:\\Python25\\Lib', 'C:\\Python25\\DLLs', 'C:\\Python25\\Lib\\lib-tk', 'C:\\Programme\\Apache Software Foundation\\Apache2.2', 'C:\\Programme\\Apache Software Foundation\\Apache2.2\\bin', 'C:\\Python25', 'C:\\Python25\\lib\\site-packages', 'C:\\Python25\\lib\\site-packages\\pyserial-2.2', 'C:\\Python25\\lib\\site-packages\\win32', 'C:\\Python25\\lib\\site-packages\\win32\\lib', 'C:\\Python25\\lib\\site-packages\\Pythonwin', 'C:\\Python25\\lib\\site-packages\\wx-2.8-msw-unicode']
Server time:        Mo, 23 Mär 2009 16:27:03 +0100

В D: \ therap \ therap есть urls.py. Однако в D: \ therap \ therap \ main нет такого, где большая часть моего кода.

Затем я попытался использовать родительскую папку

<Location "/therap/">
    SetHandler python-program
    PythonHandler django.core.handlers.modpython
    SetEnv DJANGO_SETTINGS_MODULE therap.settings
    PythonOption django.root /therap
    PythonDebug On
    PythonPath "['D:/therap'] + sys.path"

</Location>

MaxRequestsPerChild 1

Который дал мне другую ошибку:

MOD_PYTHON ERROR

ProcessId:      2424
Interpreter:    '***'

ServerName:     '****'
DocumentRoot:   'C:/Programme/Apache Software Foundation/Apache2.2/htdocs'

URI:            '/therap/'
Location:       '/therap/'
Directory:      None
Filename:       'C:/Programme/Apache Software Foundation/Apache2.2/htdocs/therap'
PathInfo:       '/'

Phase:          'PythonHandler'
Handler:        'django.core.handlers.modpython'

Traceback (most recent call last):

  File "C:\Python25\Lib\site-packages\mod_python\importer.py", line 1537, in HandlerDispatch
    default=default_handler, arg=req, silent=hlist.silent)

  File "C:\Python25\Lib\site-packages\mod_python\importer.py", line 1229, in _process_target
    result = _execute_target(config, req, object, arg)

  File "C:\Python25\Lib\site-packages\mod_python\importer.py", line 1128, in _execute_target
    result = object(arg)

  File "C:\Python25\lib\site-packages\django\core\handlers\modpython.py", line 228, in handler
    return ModPythonHandler()(req)

  File "C:\Python25\lib\site-packages\django\core\handlers\modpython.py", line 201, in __call__
    response = self.get_response(request)

  File "C:\python25\Lib\site-packages\django\core\handlers\base.py", line 67, in get_response
    response = middleware_method(request)

  File "C:\python25\Lib\site-packages\django\middleware\locale.py", line 17, in process_request
    translation.activate(language)

  File "C:\python25\Lib\site-packages\django\utils\translation\__init__.py", line 73, in activate
    return real_activate(language)

  File "C:\python25\Lib\site-packages\django\utils\translation\trans_real.py", line 209, in activate
    _active[currentThread()] = translation(language)

  File "C:\python25\Lib\site-packages\django\utils\translation\trans_real.py", line 198, in translation
    default_translation = _fetch(settings.LANGUAGE_CODE)

  File "C:\python25\Lib\site-packages\django\utils\translation\trans_real.py", line 183, in _fetch
    app = __import__(appname, {}, {}, [])

ImportError: No module named main

Я использую модуль интернационализации, но не понимаю, почему он вызывает проблемы на этом этапе.

«main» - это название единственного приложения Django (содержащего виды, модели, формы и т. Д.). Полный путь - D: \ therap \ therap \ main.

Я помещаю __init__.py -файлы везде из основной папки в d: \ therap.

Теперь я не знаю, что еще я мог сделать. Есть идеи?

1 Ответ

3 голосов
/ 24 марта 2009

Проблема заключается в том, что вы импортируете свое приложение («основное»), как будто оно живет непосредственно по пути Python, а ваш URLconf («therap.urls»), как если бы оно находилось в модуле «therap» на Python дорожка. Это может работать только в том случае, если и «D: / therap», и «D: / therap / therap» ОБА на пути Python (который runserver делает для вас автоматически, чтобы «упростить задачу»; хотя в итоге он просто откладывает путаницу до время развертывания). Вы можете эмулировать поведение runserver, используя следующую строку в конфигурации Apache:

PythonPath "['D:/therap', 'D:/therap/therap'] + sys.path"

Вероятно, имеет смысл стандартизировать ваши ссылки, поэтому ваш путь к Python должен включать только одну или другую. Обычный способ (по крайней мере, как я вижу ссылки чаще) состоит в том, чтобы поместить «D: \ therap» в путь Python и квалифицировать ваше приложение как «therap.main» вместо просто «main». Лично я использую противоположный подход, и он прекрасно работает: поместите «D: \ therap \ therap» в путь к Python и установите для ROOT_URLCONF значение «urls» вместо «therap.urls». Преимущество этого состоит в том, что если в будущем вы захотите повторно использовать свое «основное» приложение и переместить его из конкретного проекта, ваши ссылки на него не привязаны к имени проекта «therap» (хотя с приложением с именем « главное "это не звучит так, как будто ты думаешь о приложениях многократного использования".

...