我在提供静态文件时遇到问题 - 即我的html页面需要样式表和图像。我似乎无法理解为什么没有找到这些静态图像。这是我在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/'
,但这也无效。
答案 0 :(得分:7)
1)您混淆了STATIC_URL和STATIC_ROOT变量。
STATIC_ROOT:需要指向要收集静态文件的目录。在这种情况下,它似乎是PROJECT_PATH +' / static /'。 确保此目录正确无误。
STATIC_URL:访问静态文件的URL。 / static /是正确的。
删除STATICFILES_DIRS变量。它不能与STATIC_ROOT相同,因为它首先告诉Django在哪里寻找静态文件,然后告诉Django在收集静态文件时将它们存储在何处。
2)如果你正在使用Openshift,正如@ timo.rieber指出的那样,你需要一个action_hook for deploy来告诉它收集你的静态文件。
3)您的static_root文件夹无法在项目中的任何位置,因为Openshift网络服务器无法找到它。它应该在yourproject / wsgi / static< ---下(因此,这将是STATIC_ROOT变量值)。
正如我已在另一个问题中回答你的问题,从头开始为Openshift开始一个新项目是痛苦的。我写了一篇关于creating a new project to make it work with Openshift的帖子,你也可以访问那里引用的提交,它会将你重定向到一个有效的基本Openshift项目。您也可以从Openshift repo下载基本项目,但它遵循旧的(但仍在工作)项目结构。您现在可以使用simpler project structure for python apps
答案 1 :(得分: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 ..
答案 2 :(得分:1)
每次部署到生产中(git push
到您的Openshift存储库后),您需要将所有静态文件收集到一个地方,即STATIC_ROOT
。这是django管理命令collectstatic
的工作,请参阅Django docs here。
对于Openshift环境,推送上游后自动执行此操作的一个好方法是Openshift docs记录的deploy
操作挂钩。
当你推......
没有Jenkins的构建使用您的应用程序空间作为构建和测试过程的一部分。因此,应用程序将关闭,因此其内存可用于构建。执行以下步骤:
- 你运行了一个&#39; git push&#39;在您的计算机上 - 您的更改将发送到您的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 cannot find static files. Need a second pair of eyes, I'm going crazy。
答案 3 :(得分:1)
我花了很长时间试图让静态文件在Openshift上运行。在blog post之后我使用标准项目布局设置我的Django项目,但静态文件不起作用。我认为他们使用的vhost配置并未设置为在/ static /中查找文件。这个问题Serving Django static files in OpenShift似乎暗示如果您使用旧布局并使用wsgi / static它将起作用。最后我安装了django-storages并从s3提供了我的静态文件。
答案 4 :(得分:0)
我也和Heroku有同样的问题。静态文件无法正确提供。
然后每当我将应用程序部署到heroku后台时,我都会想到它正在执行collectstatic。但我没有在settings.py中提到STATIC_ROOT。
所以我把静态root这样放
STATIC_ROOT = 'staticfiles'
然后我将那段时间用于其工作。在openshift中尝试一下,让我知道