我遇到了让Django使用我的Apache配置的主要问题。我没有创建服务器,所以我没有太多的余地来了解服务器的工作原理。基本上有三个虚拟主机:
board.site.org,students.site.org和insider.site.org
insider.site.org是我关注的主要内容。我负责下面的一个小站点(理想情况下是insider.site.org/tech)。我决定将我的文件与原始目录分开,因为不要在那里弄乱一些东西(因为非python站点已经到位)。无论如何,我的虚拟主机在/etc/apache2/vhosts.d /
中的单独文件中定义这是insider.site.org的配置看起来像
insider.conf
LoadModule python_module /usr/lib64/apache2/mod_python.so
<VirtualHost 10.10.1.1:80>
ServerName insider.site.org
DocumentRoot /media/nss/VWEB/docs
<Directory /media/nss/VWEB/docs>
Options Indexes Multiviews
AllowOverride None
Order Allow,Deny
#Allow from 10.11.0.78
Allow from all
</Directory>
Alias /tech /srv/www/Tech
<Directory /srv/www/Tech>
SetHandler python-program
PythonPath "['/srv/www/Tech'] + sys.path"
PythonHandler django.core.handlers.modpython
SetEnv DJANGO_SETTINGS_MODULE Tech.settings
PythonDebug On
</Directory>
Alias /media /srv/www/Media
<Directory /srv/www/Media>
SetHandler None
</Directory>
</VirtualHost>
现在,似乎这应该是对的,但出于某种原因,访问http://insider.site.org/tech/会给我这个错误:
Mod_python错误:“PythonHandler mod_python.publisher“
追踪(最近一次呼叫最后一次):
文件 “/usr/lib64/python2.4/site-packages/mod_python/apache.py” 第299行,在HandlerDispatch中 result = object(req)
文件 “/usr/lib64/python2.4/site-packages/mod_python/publisher.py” 第98行,处理程序 路径= [路径])
文件 “/usr/lib64/python2.4/site-packages/mod_python/apache.py” 第454行,在import_module中 f,p,d = imp.find_module(parts [i],path)
ImportError:没有名为index
的模块
而http://insider.site.org/tech(没有尾随斜杠)会导致403错误。我在这个目录中有Django,但它没有被执行(我在tech文件夹下的所有目录中都有_ init _.py,这是我个人电脑的副本(从django测试服务器上运行))所以我不认为这是问题所在。这根本不起作用: - (
感谢任何帮助,谢谢。
答案 0 :(得分:2)
对于您的第一个问题,您确定在您指定的PythonPath中有Django吗?在我的服务器上,我的PythonPath中的列表包含包含顶级django目录的目录,该目录本身包含bin,contrib,admin,core等目录,以及__init__.py。 (另外请确保您的Apache用户对这些文件和目录具有读取和执行权限,但我确信这很明显。)这是我的设置:
<Location "/myapp">
SetHandler python-program
PythonHandler django.core.handlers.modpython
SetEnv DJANGO_SETTINGS_MODULE LogFileAnalyzer.settings
PythonDebug on
PythonPath "['/srv/www/dir_containing_django_dir', '/srv/www/myapp_dir'] + sys.path"
</Location>
请注意,我在这里使用的是位置而不是目录,因此您的里程可能会有所不同。
对于你的第二个问题,这听起来像mod_rewrite的问题。见here。您可以通过定义重写规则让服务器自动附加您需要的斜杠:
RewriteEngine on
RewriteBase /~quux/
RewriteRule ^foo$ foo/ [R]
希望有所帮助。
答案 1 :(得分:1)
Alias /tech /srv/www/Tech
应该删除,<Directory /srv/www/Tech>
应该转换为某个位置。
请记住,您并没有尝试让Apache提供您的Python文件,而是告诉它在遇到特定位置时启动某个Python进程。
另外,我是否可以建议您使用子域而不是将Django-app放在主域的“文件夹”中。在我看来,这往往会简化事情。
同样值得考虑的是mod_wsgi
。我最近开始将它用于我的Django应用程序,并且它们在性能和稳定性方面取得了巨大的飞跃:)
答案 2 :(得分:0)
可能没有对mod_python问题有帮助,但实际上,mod_python是部署Django的最糟糕方式(实际上是部署任何类型Python的最糟糕方式)。
请考虑至少使用mod_wsgi,它更好的性能和其他一些原因。此外,你还可以在freenode的#django上得到mod的开发人员的支持。
Spawning / FastCGI甚至比你甚至不打扰Apache的方式更好。