4

我无法满足 Django 对代码放置的建议。我搜索了谷歌并尝试了所有类型的 VirtualHost 配置。但是,我无法让 Django 站点与 Apache 一起工作,就像它与 Django 的内置测试 Web 服务器一样。

我正在使用 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 和其他人那里收集到的东西

没有工作。

所以这是我当前的 apache 虚拟主机

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 迹象的文档根目录。我的虚拟主机配置错了吗?我是否将这个“文档根目录之外的代码太过分了”?

4

1 回答 1

6

我真的不明白你为什么这么难,但你显然根本没有关注我。文档中解释的重点是,您在文件系统中的代码所在位置完全独立于 Apache 为其提供服务的位置。后者由 WSGIScriptAlias 的第一个参数给出。前者由第二个参数给出。

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

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

于 2013-10-15T21:14:10.497 回答