使用mod_python设置Django,使用Alias在SuSE上设置Apache

时间:2009-02-24 17:14:30

标签: django apache apache2 mod-python

我遇到了让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>
  • 请注意,在说site.org时,我指的是我的网站,而不是实际的“site.org”网址。

现在,似乎这应该是对的,但出于某种原因,访问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测试服务器上运行))所以我不认为这是问题所在。这根本不起作用: - (

感谢任何帮助,谢谢。

3 个答案:

答案 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的方式更好。