【问题标题】:Django staticfiles app helpDjango 静态文件应用程序帮助
【发布时间】:2011-06-01 17:51:16
【问题描述】:

我对 Django 的 staticfiles app 有一点问题。

我已经添加了

'django.contrib.staticfiles',

到我的 INSTALLED_APPS 并已添加

STATIC_URL = '/static/'
STATIC_ROOT = '/Users/kevdotbadger/django/mylook/static/'

到我的settings.py 文件。

我所有的静态文件都位于我的 Mac 上的 STATIC_ROOT 文件夹中。

现在,在我的模板中,我使用

{{ STATIC_URL }}

正确呈现到/static/

然而

{{ STATIC_URL }}css/style.css

导致 404 错误。我正在使用“runserver”命令作为服务器。

我有什么遗漏吗?

【问题讨论】:

  • 权限问题? DEBUG 未设置为 True

标签: python django static http-status-code-404


【解决方案1】:

我恳请您阅读此处的操作文档:http://docs.djangoproject.com/en/dev/howto/static-files/

简而言之:STATIC_ROOT 仅在调用 collectstatic 管理命令时使用。无需将目录添加到 STATICFILES_DIRS 设置即可为您的静态文件提供服务!

在开发过程中(使用自动服务视图时)静态文件会自动在各个位置查找静态文件(因为您使用静态文件的路径调用其“服务”视图)。对于此搜索,它将使用所谓的“查找器”(在 STATICFILES_FINDERS 设置中定义)。

  1. 默认查找器之一是 AppDirectoriesFinder,它将在您的 INSTALLED_APPS 设置的每个应用的“/static/”目录中查找。

  2. 另一个默认查找器是 FileSystemFinder,它将查找您在 STATICFILES_DIRS 设置中指定的目录。

顺便说一句,这两种搜索模式都类似于模板加载的工作方式。

运行 collectstatic 命令时将使用相同的技术,但它现在将从各个位置收集文件(使用与上述相同的查找器),将找到的文件放入 STATIC_ROOT 中,准备部署。

【讨论】:

  • 这是正确答案。 STATICFILES_DIRS 专门由 staticfiles 应用程序使用。 STATIC_ROOT 不是。 STATIC_ROOT 用于将所有媒体收集到一个用于生产环境的位置,从 STATICFILES_DIRS 和每个应用程序的静态文件夹(如果安装了 AppDirectoriesFinder)。今天这让我很难受,特别是对于项目特有的静态媒体,而不是任何应用程序。
  • @JoshSmeaton - 每当我们运行“python manage.py collectstatic”时,它都会从 STATICFILES_DIRS 路径收集所有文件并复制到 STATIC_ROOT。但是我注意到当我运行我的应用程序时,django 正在从 STATICFILES_DIRS 路径读取文件,而不是从 STATIC_ROOT。这是正常的吗?如果那这个STATIC_ROOT有什么用。只需将所有文件保存在一个地方。还是我做错了什么?
  • @Ashin,从 django 中提供静态文件的静态文件应用程序不会从 static_root 提供服务,只能从 staticfiles_dirs 和(如果您启用了应用程序静态查找器)从应用程序静态目录提供服务.静态根是这样您可以在收集目录后将单独的网络服务器指向目录。
  • 知道了。 @JoshSmeaton 我什至注意到当我们制作 DEBUG = False 时,django 从 STATIC_ROOT 读取它。当 DEBUG = True 它从 STATICFILES_DIRS 路径读取。您对此的评论。
  • @Ashin,这可能是您配置 urls.py 文件的方式。您仅在 DEBUG = True 时设置了静态 URL。我不知道您是如何使用 STATIC_ROOT 配置网络服务器的。
【解决方案2】:

如果您只想要一个解决方案 - 向下滚动到“解决方案”。

概述

我昨天发现了同样的问题。这是我发现的:

您所需要的只是合适的静态查找器,它将找到您的 STATIC_ROOT 及其所有内容,但没有这样的查找器。以下是默认查找器:

  • django.contrib.staticfiles.finders.AppDirectoriesFinder - 在已安装的 django 应用程序目录中搜索“静态”文件夹,但现在大多数使用过时的“媒体”文件夹。

  • django.contrib.staticfiles.finders.FileSystemFinder - 使用 STATICFILES_DIRS 中提到的所有目录,但不能将 STATIC_ROOT 添加到其中。

  • django.contrib.staticfiles.finders.DefaultStorageFinder - 在您的 DEFAULT_FILE_STORAGE 中搜索静态文件,默认为 django.core.files.storage.FileSystemStorage指向你的 MEDIA_ROOT

解决方案

仅此而已,没有其他选择。目前没有选择使用 STATIC_ROOT(在 Django 1.3 中)。
所以我刚刚为这些需求编写了自己的自定义查找器:

  • 我的自定义静态查找器文件:finders.py

    from django.core.files.storage import FileSystemStorage
    from django.contrib.staticfiles.finders import BaseStorageFinder
    from django.conf import settings
    
    class StaticFinder(BaseStorageFinder):
        storage = FileSystemStorage(settings.STATIC_ROOT, settings.STATIC_URL)
    
  • settings.py

    STATICFILES_FINDERS = (
        'finders.StaticFinder',
    )
    
  • 如果您想将它与其他查找器一起使用 - 我建议将它们放在 STATICFILES_FINDERS 之后

请记住:此解决方案应仅用于开发需求,切勿用于生产!

【讨论】:

  • 太复杂了!已经有一个 STATICFILES_DIRS 设置,您可以向其中添加文件系统路径。
  • 2 Josh Smeaton:很遗憾,我无法将“静态”添加到 STATICFILES_DIRS - 它会被忽略。但我想为我的开发服务器使用“静态”
  • 他们设计它以忽略“静态”文件夹的原因是因为它不打算用作手动放置静态内容的地方。静态目录是将所有各种静态文件复制到其中以进行部署。只需创建一个不同的目录来转储顶级静态文件,然后保留静态根文件夹。一个收集点。
  • WTF! collectstatic 管理命令 TO COLLECT files 使用的默认存储后端 (github.com/django/django/blob/…) 与此提议的“解决方案”完全相同。您将得到一个 BROKEN 状态,其中文件将被递归复制。不要那样做。
  • 不,你可能不会。它不受支持,如果你这样做,你就得靠自己了。
【解决方案3】:

我找到了一种在开发过程中提供项目全局静态文件的快速简便的解决方法:

  • 启动一个包含您的项目静态文件的新应用(例如“manage.py startapp static_content”)
  • 在该应用中创建一个名为“static”的文件夹并将您的静态文件放在那里。
  • 将您的新应用添加到已安装应用列表中

【讨论】:

    【解决方案4】:

    首先,确保您在 urls.py 中启用了static serve,仅供开发使用。

    另外,你可能有一个额外的斜线。如果你的 STATIC_URL == '/static/',那么

    {{ STATIC_URL }}/css/style.css 应该是 {{ STATIC_URL }}css/style.css。

    【讨论】:

    • 我已经添加了 URL 规则,仍然没有。我输入错误的原始问题,我没有双斜杠。还有其他想法吗?
    • 你添加了模板上下文处理器吗?
    • 另外,您的路径可能是错误的。尝试添加和删除斜线。
    【解决方案5】:
    STATIC_ROOT = '/home/ws/be/bla/'
    STATICFILES_DIRS = ('/home/ws/be/static/',)
    STATIC_URL = '/static/'
    

    这对我有用。 STATIC_ROOT 必须不同于 STATICFILES_DIRS(Django 版本 1.4 pre-alpha SVN-16436)

    【讨论】:

      猜你喜欢
      • 2020-07-12
      • 2022-10-18
      • 2016-04-06
      • 1970-01-01
      • 2012-04-15
      • 2018-03-13
      • 2016-12-23
      • 2016-10-19
      • 2012-02-21
      相关资源
      最近更新 更多