在Apache上部署Django时出错

我有一个小的Django网站,我试图在Apache 2.2 HTTP服务器上运行。 该应用程序运行正常使用“python manage.py runserver”。

Django版本:1.0.2 final
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 beeing我的manage.py的地方。

当我尝试在浏览器中打开时,我看到Django使用的样式有误(与白色背景上的黑色快递相反)。

 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应用程序(包含视图,模型,表单等)的名称。 完整的path是D:\ therap \ therap \ main。

我把主文件夹里的__init__.py文件放到d:\ therap里。

现在我不知道我还能做什么。 有任何想法吗?

Solutions Collecting From Web of "在Apache上部署Django时出错"

问题是,你正在导入你的应用程序(“main”),就像它直接在Python路径上一样,而你的URLconf(“therap.urls”)就好象它在Python路径上的“therap”模块中一样。 这只有在Python路径中的“D:/ therap”和“D:/ therap / therap”都是同时运行的时候(runserver会为你自动“让事情变得简单”,尽管最终只是拖延了混乱部署时间)。 您可以通过在Apache配置中使用以下行来模拟runserver的行为:

 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”(尽管名为“主“这听起来不像你正在考虑可重复使用的应用程序)。