将代码放在Apache和Django的文档根问题之外

时间:2013-10-15 19:05:44

标签: python django apache mod-wsgi

我无法完成Django的代码放置建议。我搜索了谷歌,并尝试了所有类型的VirtualHost配置。但是我不能像使用Django的内置测试Web服务器那样让Django站点与Apache一起工作。

我正在使用Django 1.5.4和mod_wsgi

Django文档指出:

  

此代码应该在哪里生效?

     

如果你的背景是普通的PHP(没有使用现代框架),你可能习惯将代码放在Web服务器的文档根目录下(在/ var / www这样的地方)。使用Django,你不会这样做。将任何此Python代码放在​​Web服务器的文档根目录中并不是一个好主意,因为它可能会使人们可能通过Web查看您的代码。这对安全性不利。

     

将您的代码放在文档根目录之外的某个目录中,例如/ home / mycode。

为了做到这一点,我失败了。

这是我的目录结构的一个例子:我有/ home / user / djangoRoot我想要文件根目录和/ home / user / djangoCode我想放置代码的地方。我按照教程运行django-admin.py startproject djangoSite,所有文件夹和文件都按原样创建。数据库同步效果很好。当我使用Django内置的测试Web服务器时,我可以查看该站点。但我觉得我的apache虚拟主机出了问题,因为我无法用apache查看网站。

同样,本着保持代码不在文档根目录的精神,我希望djangoRoot作为我的根目录,djangoCode作为我的代码目录(其中包含运行django-admin.py start project djangoSite命令后创建的djangoSite / djangoSite目录)。

我试过了

  1. 将DjangoCode / DjangoSite设为我的根目录,但我可以在浏览器中看到文件结构
  2. 从VirtualHost中删除DocumentRoot,因为有很多建议。
  3. 我尝试过从django和其他人那里收集的东西
  4. 没有工作。

    所以这是我当前的apache virtualhost

    WSGIPythonPath /home/user/djangoCode/djangoSite/djangoSite
    
    <VirtualHost *:80>
    ServerAdmin webmaster@localhost
    ServerName example.com
    ServerAlias www.example.com
    
    DocumentRoot /home/user/djangoRoot
    <Directory /home/user/djangoRoot>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all
    </Directory>
    
    WSGIScriptAlias /djangoRoot /home/user/djangoCode/djangoSite/djangoSite/wsgi.py
    
    <Directory "/home/user/djangoCode/djangoSite/djangoSite/wsgi.py">
    <Files wsgi.py>
        Order deny,allow
        Allow from all
    </Files>
    </Directory>
    
        ...
    </VirtualHost>
    

    目前这只允许我查看没有django标志的文档根目录。 我的虚拟主机配置错了吗? 我把这个“代码超出文档根目录太远了吗?”

1 个答案:

答案 0 :(得分:4)

我真的不明白为什么你这么难找到,但你根本就没有跟着我。文档中解释的要点是,您的代码存放在文件系统中的位置是完全独立的,从Apache为其提供服务。后者由WSGIScriptAlias的第一个参数给出。前者由第二个参数给出。

文档根目录是Apache从中提供文件的默认位置。但是你没有提供文件,你正在运行代码来提供动态内容。因此,您在第一个WSGIScriptAlias参数给出的位置代理WSGI应用程序。 这是您网站的根网址。在您提供的示例中,这意味着 - 假设您的域名为example.com - 您的Django应用可以在{{1}下访问}。如果您在浏览器中实际访问了该网址,则会在您的urls.py中看到example.com/djangoRoot下配置的任何网页。这几乎肯定不是你想要的。在绝大多数情况下,第一个参数 - 如文档中所示 - 应该只是/

所以我不确定你为什么认为这违反了安全警告。在这里,默认情况下文档根目录保持不变 - 通常为/ - 但代码位于/var/www,并在/home/user/djangoCode/...提供。