Erreur lors du déploiement de Django sur Apache

J’ai un petit site Web Django que je tente d’exécuter sur un serveur HTTP Apache 2.2. L’application fonctionne correctement avec “python manage.py runserver”.

Django Version: 1.0.2 final
Python: 2.5
OS: Windows 2000

Je ne suis pas passé par les étapes décrites dans la documentation et après quelques manipulations, je suis sorti avec ce qui suit dans mon httpd.conf.

 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"  MaxRequestsPerChild 1 

D: \ therap \ therapie étant le lieu où se trouve mon manage.py.

Lorsque j’essaie d’ouvrir dans mon navigateur, je vois une erreur dans le style utilisé par Django (par opposition à un service de messagerie noir sur fond blanc).

 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 

Il y a une urls.py dans D: \ therap \ therap. Cependant, il n’y en a pas dans D: \ therap \ therap \ main où se trouve la majeure partie de mon code.

J’ai ensuite essayé d’utiliser le dossier parent

  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"  MaxRequestsPerChild 1 

Ce qui m’a donné une erreur différente:

 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 

J’utilise le module d’internationalisation, mais je ne vois pas pourquoi cela pose problème à ce stade.

“main” est le nom de la seule application Django (contenant des vues, des modèles, des formulaires, etc.). Le chemin complet est D: \ therap \ therap \ main.

J’ai mis __init__.py -files partout dans le dossier principal à d: \ therap.

Maintenant, je ne sais pas ce que je pourrais faire d’autre. Des idées?

Le problème est que vous importez votre application (“main”) comme si elle se trouvait directement sur le chemin Python, et votre URLconf (“therap.urls”) comme s’il se trouvait dans un module “therap” sur le chemin Python. Cela ne peut fonctionner que si “D: / therap” et “D: / therap / therap” sont tous deux sur le chemin Python (ce que le serveur runs vous fait automatiquement pour “faciliter les choses”; bien que cela finisse par retarder la confusion jusqu’à ce que temps de déploiement). Vous pouvez émuler le comportement de runserver en utilisant la ligne suivante dans votre configuration Apache:

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

Il est probablement plus judicieux de standardiser vos références afin que votre chemin Python n’inclue que l’un ou l’autre. La manière habituelle (du moins comme je le vois plus souvent) serait de mettre “D: \ therap” sur le chemin Python et de qualifier votre application de “therap.main” au lieu de “main”. Personnellement, j’adopte l’approche inverse et ça marche très bien: mettez “D: \ therap \ therap” sur votre chemin Python et réglez ROOT_URLCONF sur “urls” au lieu de “therap.urls”. L’avantage est que si à l’avenir vous voulez que votre application “principale” soit réutilisable et que vous la déplaciez hors du projet particulier, vos références ne sont pas liées au nom de projet “therap” (bien qu’avec une application nommée ” main “ça ne sonne pas comme si vous pensiez en termes d’applications réutilisables de toute façon).