无法让 Apache 为 django 管理静态文件提供服务

Posted

技术标签:

【中文标题】无法让 Apache 为 django 管理静态文件提供服务【英文标题】:Can't get Apache to serve django admin static files 【发布时间】:2012-09-21 12:33:31 【问题描述】:

我正在尝试将 Django 部署到 apache,但无法让它为我的静态管理文件提供服务。它似乎在 /var/www/static 下寻找它们,我似乎无法改变它。

除了样式之外,管理站点似乎工作正常。我得到一个标题和一个登录表格。我的 django 应用程序也在工作。没有为管理员提供静态文件。

使用 Django 1.4.1。

这些文件位于 /usr/local/lib/python2.7/dist-packages/django/contrib/admin/static 下,并从 /home/dutt/vaccapp/backend/static/admin 链接到。

apache 错误日志这样说

[Sun Sep 30 10:57:20 2012] [error] [client 192.168.1.10] File does not exist: /var/www/home, referer: http://dathui.example.com/vaccapp/admin/
[Sun Sep 30 10:57:20 2012] [error] [client 192.168.1.10] File does not exist: /var/www/home, referer: http://dathui.example.com/vaccapp/admin/

但我不确定如何更改它。

在我的 django 站点配置中,我有

<VirtualHost *:80>
ServerAdmin me@host.com

    ServerRoot "/home/dutt/vaccapp"
    DocumentRoot "/home/dutt/vaccapp"
<Directory />
    Options FollowSymLinks
    AllowOverride None
</Directory>
<Directory /home/dutt/vaccapp/>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    Order allow,deny
    allow from all
</Directory>

Alias /static/ "/home/dutt/vaccapp/backend/static/"
<Directory "/usr/local/lib/python2.7/dist-packages/django/contrib/admin/static">
    Order allow,deny
    Options Indexes
    Allow from all
    IndexOptions FancyIndexing
</Directory>

ServerRoot 未在 apache2.conf 中设置。

来自我的 settings.py

STATIC_ROOT = '/home/dutt/vaccapp/backend/'
STATIC_URL = '/static/'

没有添加到 STATICFILES_DIRS。

这是添加到我的 apache2.conf 中的

WSGIScriptAlias /vaccapp /home/dutt/vaccapp/backend/wsgi.py
WSGIPythonPath /home/dutt/vaccapp

<Directory /home/dutt/vaccapp>
<Files wsgi.py>
Order deny,allow
Allow from all
</Files>
</Directory>

【问题讨论】:

【参考方案1】:

ADMIN_MEDIA_PREFIX 默认设置为/static/admin/ # Deprecated in Django 1.4(现在使用STATIC_URL + 'admin/'。结果是一样的。

这里是对 apache 配置的修复:

Alias /static/admin "/usr/local/lib/python2.7/dist-packages/django/contrib/admin/static"
Alias /static "/home/dutt/vaccapp/backend/static"
<Directory "/usr/local/lib/python2.7/dist-packages/django/contrib/admin/static">
    Order allow,deny
    Options Indexes
    Allow from all
    IndexOptions FancyIndexing
</Directory>

WsgiScriptAlias 必须从主要的 apache 配置移到 VirtualHost。

经过长时间的讨论,我们发现问题是 Django 没有正确安装 admin static ...它们彼此符号链接(非常奇怪)。 Django 重新安装修复了它,现在它工作正常。

【讨论】:

您的应用程序是否使用此配置?您的应用程序包名称是backend 应用程序正在运行,但它是一个后端,因此它不使用任何静态文件。项目名称为 backend,应用名称为 dbaccess。 似乎 Apache 正在其默认位置查找您的文件,因此首先要在 VirtualHost 中添加一个 ServerRoot(如果您的 WSGIAlias 将提供 / 则这不是必需的。不过,如果有确切的请求 URL 也会很高兴。给我们一些带有 404 的 access_logs。 我尝试将 ServerRoot 添加到 VirtualHost,但这似乎并没有改变任何东西。我正在查看 apache2/error.log 文件,但找不到任何 404,只有“文件不存在 /var/www/static,refererer .../vaccapp/admin”行。 Q 更新为确切的 ServerRoot。 检查access.log文件...它应该在同一目录中。【参考方案2】:

我的低名声迫使我写一个完整的答案来为伊戈尔的答案添加一个小细节。

我只是将 apache 配置部分添加到我的配置中,但这还不够。我不得不改变:

"/usr/local/lib/python2.7/dist-packages/django/contrib/admin/static"

"/usr/local/lib/python2.7/dist-packages/django/contrib/admin/static/admin"

在第一个 Alias&lt;Directory&gt; 指令中。

【讨论】:

【参考方案3】:

就像 Blazor 一样,我必须使用原始版本的一个小的变体。我的设置包括使用 django admin 的graphite-web。我只是发布它以供参考。

我的 apache 的虚拟主机:

<VirtualHost *:80>
    ServerName graphite.myhost.com
    Redirect permanent / https://graphite.myhost.com/
</VirtualHost>

<VirtualHost *:443>
    ServerName graphite.myhost.com

    SSLEngine on
    SSLCertificateFile /etc/apache2/ssl/graphite.cert
    SSLCertificateKeyFile /etc/apache2/ssl/ssl_graphite.key
    SSLStrictSNIVHostCheck on

    WSGIDaemonProcess _graphite processes=5 threads=5 display-name='%GROUP' inactivity-timeout=120 user=_graphite group=_graphite
    WSGIProcessGroup _graphite
    WSGIImportScript /usr/share/graphite-web/graphite.wsgi process-group=_graphite application-group=%GLOBAL
    WSGIScriptAlias / /usr/share/graphite-web/graphite.wsgi

    AliasMatch ^/admin/(.*)static/admin(.*)$ /usr/lib/python2.7/dist-packages/django/contrib/admin/static/admin/$2
    <Directory "/usr/lib/python2.7/dist-packages/django/contrib/admin/static/admin/">
            Order allow,deny
            Allow from all
    </Directory>

    Alias /content/ /usr/share/graphite-web/static/
    <Location "/content/">
            SetHandler None
    </Location>

    <Location "/">
            Order allow,deny
            allow from all
            AuthType Basic
            AuthName "Restricted Zone"
            AuthBasicProvider wsgi
            WSGIAuthUserScript /var/www/django_auth.wsgi
            Require valid-user
    </Location>

    ErrorLog $APACHE_LOG_DIR/graphite-web_error.log

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn

    CustomLog $APACHE_LOG_DIR/graphite-web_access.log combined

</VirtualHost>

我还添加了STATIC_URL = 'static/',只是为了确保我对正则表达式没有任何问题。

【讨论】:

【参考方案4】:

尝试使用下一个

python manage.py collectstatic

The staticfiles app - Django documentation

【讨论】:

欢迎来到 Stack Overflow!请花一些时间通读About 页面以熟悉 SO Q&A 格式。 这个答案看起来很危险。它会覆盖静态文件。 不,亚历杭德罗是正确的。它不会覆盖代码库中的静态文件,而是覆盖 Django 正在服务的文件。您应该将您的 static_root 设置为某个空目录,然后运行 ​​collectstatic。 Django 本质上是收集文件并从 STATIC_ROOT 位置提供它们。这将映射其位置的责任与代码库的结构分开,并使您能够为静态文件使用单独的服务器。 注意:docs.djangoproject.com/en/dev/howto/static-files,它说直接从代码库提供静态文件“效率极低,而且可能不安全”,并指向docs.djangoproject.com/en/dev/howto/static-files/deployment 的解决方案,它说使用收集静态的。【参考方案5】:

我在运行 Django + Apache 时遇到了类似的问题,Django 管理站点缺少所有样式。我就是这样解决的:

apache 配置:httpd-app.conf

Alias /static "/...path/to/your/django.../site-packages/django/contrib/admin/static"
<Directory "/...path/to/your/django.../site-packages/django/contrib/admin/static">
    Require all granted
</Directory>

上面的/...path/to/your/django.../,可以通过pip show django找到

【讨论】:

以上是关于无法让 Apache 为 django 管理静态文件提供服务的主要内容,如果未能解决你的问题,请参考以下文章

Django apache管理静态文件

Apache 不提供 django 管理静态文件

Django 在使用开发服务器时不会提供静态文件

apache服务器在Django项目中找不到静态文件

我的 Django 静态文件在哪里?

Django settings.py中的静态文件管理设置