python - 使用 Django 在 Apache 上提供静态文件(404 错误)

标签 python django apache static-files

我一直在尝试在 CentOS 服务器(6.7)上设置 Apache(2.2.15)作为带有 Gunicorn 和 django(1.6.11)的代理,但我遇到了有关静态文件的问题。 (我对 django 还很陌生)

我已经查看了 Django 提供的优秀文档以及其他一些 stackoverflow 的帖子,但没有结果。

我可以检查什么:

  • 问题似乎并非来自 Django 或模板,因为使用“DEBUG = False”运行开发服务器并且选项“--insecure”工作正常。
  • 这可能是我在虚拟主机中添加的别名和目录 block 的问题,但我无法理解为什么它不起作用。
  • Gunicorn 中不应包含任何内容,因为它不提供静态文件。

我的配置如下:

1)借助“collectstatic”命令,我将项目的静态文件放入“/var/www/myproject/static”中。

2)然后,我创建了虚拟主机(我认为问题出在哪里):

(第一个用于重定向到 HTTPS)

<virtualhost *:80>
    ServerAdmin <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="f782849285b793989a969e99d994989a" rel="noreferrer noopener nofollow">[email protected]</a>
    ServerName localhost

    ServerSignature Off
    RewriteEngine on

    RewriteCond %{SERVER_PORT} !^443$
    RewriteRule ^/(.*) https://%{HTTP_HOST}/$1 [NC,R,L]
</virtualhost>

(第二个为实际工作)

<virtualhost *:443>
    ServerAdmin <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="a5d0d6c0d7e5c1cac8c4cccb8bc6cac8" rel="noreferrer noopener nofollow">[email protected]</a>
    ServerName localhost

    ServerSignature Off

    DocumentRoot /var/www/myproject

    Alias /static/ "/var/www/myproject/static/"
    <Directory "/var/www/myproject/static">
    Order Allow,Deny
    Allow from All
    </Directory>

    ProxyPass / http://127.0.0.1:8000/ connectiontimeout=150 timeout=300
    ProxyPassReverse / http://127.0.0.1:8000/
    ProxyPreserveHost On
    ProxySet http://127.0.0.1:8000/ connectiontimeout=150 timeout=300

    ... here goes the SSL and Log configuration ...
</virtualhost>

服务重新启动后,我的静态文件未加载,并且在获取时出现 404 错误。 “httpd -S”没有抛出任何错误,并且 Web 界面的其余功能运行良好。

我还尝试过不使用结尾的“/”作为“/static/”别名,因为这对于其他一些人来说似乎是一个问题,尝试将文件直接移动到/var/www/myproject 下,并在不使用任何内容的情况下访问它们DocumentRoot 的别名...

如果你想看看 django settings.py (不知道它是否相关,但一些 django 大师也可能发现那里有问题):

STATIC_ROOT = '/var/www/myproject/static/'
STATIC_URL =  '/static/'
STATICFILES_DIRS = (os.path.join(os.path.dirname(__file__),'static',),)

以及模板:

{% load staticfiles %}
....
<link href="{% static 'bower_components/bootstrap/dist/css/boostrap.min.css %}" rel="stylesheet">

项目的Urls.py:

from django.conf.urls import patterns, include, url
from django.shortcuts import redirect
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = patterns('',
    url(r'^$', lambda x: redirect('/Collecte/')),
    url(r'^Collecte/', include('Collecte.urls', namespace="Collecte")),
) + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

应用程序的 urls.py(名为“Collecte”):

from django.conf.urls import patterns, url
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
from Collecte import views

urlpatterns = patterns('',
    url(r'^$', views.index, name='index'),
    url(r'^Collectes/Execution/ù', views.CollExecution, name='CollExecution'),
    ... quite a lot of them ...
)

# Commented this line from a suggestion, was present at start
#urlpatterns += staticfiles_urlpatterns

如果您觉得缺少任何与该问题相关的文件,请索要它,我会尽力:)。

最佳答案

好的,

我在 another stackoverflow thread 中找到了问题的答案具有类似的配置(但使用 Flask 而不是 django)。

正如 Ajay Gupta 所说,我认为我在项目的 urls.py 文件中遇到了问题,因为我必须添加“static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)”(从使用 staticfiles 应用程序 django 切换过来)以另一种方式提供)。

另一个问题是在 apache 虚拟主机配置中,因为我希望我的静态文件由 apache 而不是 Gunicorn 或 django 提供服务。我将所有内容重定向到 Gunicorn 服务器,甚至是对静态文件的请求。所以我必须添加“ProxyPass/static/!”以便 apache 提供文件服务。

我不知道这是否是正确的方法,但它对我有用。

关于python - 使用 Django 在 Apache 上提供静态文件(404 错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32200953/

相关文章:

python - 构建训练 doc2vec 嵌入的学习曲线

python - 带有 scrapy 的递归蜘蛛只抓取第一页

sql - Django:ManyToManyField,带有附加列

django - Django Rest Framework ModelViewSet 上的删除方法

python - 如何将图像保存到磁盘

eclipse - import org.apache.jasper 无法解析

php - 如何使用 .htaccess 重写使用 get 变量的 url

python - TensorFlow 中卷积的自定义填充

python - 选择 Pandas 数据框中任何列包含字符串的行的最简洁方法?

apache - Apache 可以配置为运行基于 Clojure Web 的程序吗?