OpenShift Django上的静态文件
我在处理静态文件时遇到了一些问题,比如我的网页需要的样式表和图片。我搞不懂为什么这些静态图片找不到。这是我在我的 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 个回答
我也遇到过和Heroku一样的问题。静态文件没有正确提供。
后来我发现,每次我把应用程序部署到Heroku时,它后台会执行一个叫做collectstatic的操作。但是我在settings.py文件里没有提到STATIC_ROOT。
所以我就像这样设置了静态根目录:
STATIC_ROOT = 'staticfiles'
然后我再部署一次,这次就正常工作了。你可以在openshift上试试,告诉我结果如何。
我花了很长时间想在OpenShift上让静态文件正常工作。根据这篇博客文章,我按照标准的项目结构设置了我的Django项目,但静态文件就是不行。我觉得他们用的虚拟主机配置没有设置去查找/static/目录里的文件。这个问题在OpenShift上提供Django静态文件似乎建议如果你使用旧的项目结构,并且使用wsgi/static的话,应该就能正常工作。最后,我安装了django-storages,然后从s3上提供我的静态文件。
每次把代码发布到生产环境(也就是用 git push
上传到你的 Openshift 仓库)后,你需要把所有的静态文件收集到一个地方,这个地方叫 STATIC_ROOT
。这个工作可以通过 Django 的管理命令 collectstatic
来完成,具体可以参考 Django 的文档。
在 Openshift 环境中,推送代码后自动执行这个操作的一个好方法是使用 deploy
动作钩子,详细信息可以查看 Openshift 的文档。
当你进行推送时...
如果不使用 Jenkins 进行构建,系统会使用你的应用空间来进行构建和测试。因此,应用会被关闭,以便释放内存用于构建。整个过程如下:
- 你在电脑上运行 'git push' - 你的更改会被发送到 OpenShift 应用
- 应用被关闭
- 你的更改会被复制到服务器的正确位置
- OpenShift 会调用你的构建钩子 - 也就是你放在 Git 仓库里的脚本文件
- 你的应用会重新启动
这个 deploy
脚本可能看起来是这样的:
#!/bin/bash
source $VIRTUAL_ENV/bin/activate
# Executing collectstatic (organize static files)
python "$OPENSHIFT_REPO_DIR"wsgi/yourproject/manage.py collectstatic --noinput
想了解更多细节,你也可以阅读 Django 找不到静态文件。需要第二双眼睛,我快疯了。
嘿,我也遇到过同样的问题,后来找到了解决办法。
你只需要去你的 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 ..
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 应用项目结构。