OpenShift Django上的静态文件

5 投票
5 回答
4392 浏览
提问于 2025-04-18 12:15

我在处理静态文件时遇到了一些问题,比如我的网页需要的样式表和图片。我搞不懂为什么这些静态图片找不到。这是我在我的 settings.py 文件里写的内容:

    STATIC_URL = PROJECT_PATH + '/static/'

# Additional locations of static files
STATICFILES_DIRS = (PROJECT_PATH + "/static/",)

STATIC_ROOT = "/static/"


# List of finder classes that know how to find static files in
# various locations.
STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
    'django.contrib.staticfiles.finders.DefaultStorageFinder',
)

我在查看日志时遇到了404错误,但我不知道OpenShift在什么地方查找这些图片,也不知道该怎么调试。我试过使用 STATIC_URL = '/static/',但这也没有用。

5 个回答

0

我也遇到过和Heroku一样的问题。静态文件没有正确提供。

后来我发现,每次我把应用程序部署到Heroku时,它后台会执行一个叫做collectstatic的操作。但是我在settings.py文件里没有提到STATIC_ROOT。

所以我就像这样设置了静态根目录:

STATIC_ROOT = 'staticfiles'

然后我再部署一次,这次就正常工作了。你可以在openshift上试试,告诉我结果如何。

1

我花了很长时间想在OpenShift上让静态文件正常工作。根据这篇博客文章,我按照标准的项目结构设置了我的Django项目,但静态文件就是不行。我觉得他们用的虚拟主机配置没有设置去查找/static/目录里的文件。这个问题在OpenShift上提供Django静态文件似乎建议如果你使用旧的项目结构,并且使用wsgi/static的话,应该就能正常工作。最后,我安装了django-storages,然后从s3上提供我的静态文件。

1

每次把代码发布到生产环境(也就是用 git push 上传到你的 Openshift 仓库)后,你需要把所有的静态文件收集到一个地方,这个地方叫 STATIC_ROOT。这个工作可以通过 Django 的管理命令 collectstatic 来完成,具体可以参考 Django 的文档

在 Openshift 环境中,推送代码后自动执行这个操作的一个好方法是使用 deploy 动作钩子,详细信息可以查看 Openshift 的文档

当你进行推送时...

如果不使用 Jenkins 进行构建,系统会使用你的应用空间来进行构建和测试。因此,应用会被关闭,以便释放内存用于构建。整个过程如下:

  1. 你在电脑上运行 'git push' - 你的更改会被发送到 OpenShift 应用
  2. 应用被关闭
  3. 你的更改会被复制到服务器的正确位置
  4. OpenShift 会调用你的构建钩子 - 也就是你放在 Git 仓库里的脚本文件
  5. 你的应用会重新启动

这个 deploy 脚本可能看起来是这样的:

#!/bin/bash

source $VIRTUAL_ENV/bin/activate

# Executing collectstatic (organize static files)
python "$OPENSHIFT_REPO_DIR"wsgi/yourproject/manage.py collectstatic --noinput

想了解更多细节,你也可以阅读 Django 找不到静态文件。需要第二双眼睛,我快疯了

4

嘿,我也遇到过同样的问题,后来找到了解决办法。

你只需要去你的 settings.py 文件,做一些修改。


把下面的内容

DJ_PROJECT_DIR = os.path.dirname(__file__)
BASE_DIR = os.path.dirname(DJ_PROJECT_DIR)

替换为

BASE_DIR = os.path.dirname(os.path.dirname(__file__))

在 settings.py 文件的最后添加这个内容

STATIC_URL = '/static/'

TEMPLATE_DIRS = [
os.path.join(BASE_DIR, 'templates'),
]

STATIC_ROOT = os.path.join(BASE_DIR, '../static')

STATICFILES_DIRS = (
 os.path.join(BASE_DIR, 'static', 'dirs'),
)

然后在你的 HTML 文件中,记得像这样加载静态文件

<html>
<head> {% load staticfiles %}
<link rel="stylesheet" type="text/css" href="{% static 'css/style.css' %}">
</head><body> 
         <script src="{% static 'js/script.js' %}">
         </script>
         It works! </body>
</html>

现在你的文件夹结构应该是这样的

--wsgi
    --myproject
        --templates
            -- drop html files here ... 
        --static
            --dirs
                --img
                    -- drop images here ..
                --js
                    -- drop js here ..
                --css
                    -- drop css files here ..
8

1) 你把 STATIC_URL 和 STATIC_ROOT 这两个变量搞混了。

STATIC_ROOT:这个需要指向你想要收集静态文件的文件夹。在这个情况下,应该是 PROJECT_PATH + '/static/'。确保这个文件夹是正确的。

STATIC_URL:这是你访问静态文件的地址。/static/ 是正确的。

删除 STATICFILES_DIRS 这个变量。它不能和 STATIC_ROOT 一样,因为前者告诉 Django 去哪里“找”静态文件,而后者告诉 Django 收集静态文件后要“存”在哪里。

2) 如果你在使用 Openshift,正如 @timo.rieber 提到的,你需要一个部署的 action_hook 来告诉它去收集你的静态文件。

3) 你的 static_root 文件夹不能放在项目的任何地方,因为 Openshift 的网络服务器找不到它。它应该放在 yourproject/wsgi/static 下面 <---(所以,这就是 STATIC_ROOT 变量的值)。

正如我在另一个问题中回答过的,从头开始为 Openshift 创建新项目是很麻烦的。我写了一篇关于 创建一个新项目以便与 Openshift 兼容 的文章,你也可以访问那里的提交记录,它会引导你到一个基本的 Openshift 项目,这个项目是可以工作的。你也可以从 Openshift 仓库 下载一个基本项目,但它遵循的是一个旧的(但仍然可用的)项目结构。现在你可以使用 更简单的 Python 应用项目结构

撰写回答