【问题标题】:Static files on OpenShift DjangoOpenShift Django 上的静态文件
【发布时间】:2014-08-27 00:40:45
【问题描述】:

我在提供静态文件时遇到问题 - 即我的 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 在哪里寻找或调试或弄清楚 OpenShift 在哪里寻找这些图像。我尝试过使用STATIC_URL = '/static/',但这也不起作用。

【问题讨论】:

    标签: python django openshift


    【解决方案1】:

    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 用于 deploy 来告诉它收集您的静态文件。

    3) 您的 static_root 文件夹不能位于项目中的任何位置,因为 Openshift 网络服务器找不到它。它应该在 yourproject/wsgi/static

    正如我已经在另一个问题中回答你的那样,从头开始为 Openshift 开始一个新项目是很痛苦的。我写了一篇关于 creating a new project to make it work with Openshift 的帖子,您还可以访问那里引用的提交,它将重定向到一个可以工作的基本 Openshift 项目。您也可以从Openshift repo 下载基本项目,但它遵循旧的(但仍在工作)项目结构。您现在可以使用simpler project structure for python apps

    【讨论】:

    • 确实很痛苦。我确实尝试过,我删除了 STATICFILES_DIRS 并使用了也建议的钩子。
    【解决方案2】:

    嘿,我也遇到了同样的问题,我找到了解决方法。

    只需转到您的 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 ..
    

    【讨论】:

    • 这正是我所需要的。这个答案似乎也适合 Django 的新文档。
    【解决方案3】:

    每次部署到生产环境后(git push 到您的 Openshift 存储库),您需要将所有静态文件收集到一个位置,即您的 STATIC_ROOT。这是 django 管理命令collectstatic 的作业,请参阅Django docs here

    对于 Openshift 环境,在向上游推送后自动执行此操作的一个好习惯是 Openshift docs 中记录的 deploy 操作挂钩。

    当你推...

    在没有 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 cannot find static files. Need a second pair of eyes, I'm going crazy

    【讨论】:

    • 谢谢。我尝试了部署方法,但发现失败了。事实上,当我 ssh 进入项目时,我没有看到 manage.py。我尝试了与上述相同的方法,并尝试手动调用“python”$OPENSHIFT_REPO_DIR“wsgi/yourproject/manage.py collectstatic --noinput”行。
    • 您是否将yourproject 替换为您的项目路径?错误信息是什么?
    • 是的。我在 wsgi 下没有静态目录,但在 projname/static 下。操作系统似乎已经摆脱了 wsgi 文件夹作为默认设置。页面加载,但我仍然没有得到静态文件 - 图像/样式表等。我的模板在项目中定义为 /html/ 和静态文件 /static/。
    • 所以你需要将STATIC_ROOT 指向projname/static 的绝对路径。但是使用新的简化的 Openshift 目录结构,如 stackoverflow.com/questions/22660304/… 中提到的,使用老式的 wsgi/static 似乎仍然是提供静态文件的实用方式。
    • 还有一个blog comment on openshift 告诉了同样的问题。
    【解决方案4】:

    我花了很长时间试图让静态文件在 Openshift 上运行。在此blog post 之后,我使用标准项目布局设置了我的 Django 项目,但静态文件不起作用。我认为他们使用的虚拟主机配置未设置为在 /static/ 中查找文件。这个问题Serving Django static files in OpenShift 似乎建议您使用旧布局并使用 wsgi/static 它会起作用。最后我安装了django-storages 并从 s3 提供了我的静态文件。

    【讨论】:

      【解决方案5】:

      我对 Heroku 也有同样的问题。未正确提供静态文件。

      然后我发现每次将应用程序部署到 heroku 后台时,它都在执行 collectstatic。但我没有在 settings.py 中提到 STATIC_ROOT。

      所以我像这样放置静态根

      STATIC_ROOT = 'staticfiles'
      

      然后我部署了那个时间它的工作。在 openshift 中尝试一下,然后告诉我

      【讨论】:

      • 谢谢。我确实尝试过。我在上面编辑了我的问题,以包含有关 settings.py 中内容的更多详细信息,遗憾的是该建议似乎不起作用。
      猜你喜欢
      • 2014-06-03
      • 2016-10-17
      • 2014-08-15
      • 1970-01-01
      • 2014-09-07
      • 1970-01-01
      • 1970-01-01
      • 2015-12-24
      • 2014-02-04
      相关资源
      最近更新 更多