【问题标题】:Django 2.2 Not Serving Static FilesDjango 2.2 不提供静态文件
【发布时间】:2019-10-24 04:42:07
【问题描述】:

我目前正在学习一些教程来增强我对 Django 的了解。为此,我决定使用最新版本的 Django。我已经能够克服我的代码和教程之间的大部分差异,除了一个 - 没有提供静态文件。现在,我不完全确定差异是否完全归因于 Django 版本。这是发生了什么。

我的项目结构如下:

settings.py

STATIC_URL = '/static/'

STATIC_FILES = (
    os.path.join(BASE_DIR, "static"),
)

STATIC_ROOT = os.path.join (os.path.dirname(BASE_DIR), "staticfiles", "static")

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, "templates")],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

有趣的是,通过这种配置,项目能够成功找到模板。但是,如上所述,它找不到静态文件。这是为什么呢?

此外,本教程设置了一个不寻常的配置,因为 statictemplates 目录位于主应用程序的目录中,而我通常将它们设置为更高一级,即在项目根目录中。这可能是问题的一部分吗?这个特定项目的设置中的什么使 Django 查找低一级目录的文件?这些设置似乎与我所做的其他项目相同。但是,这些项目在项目的根目录中包含statictemplates 目录。

感谢任何帮助和澄清。

编辑:

urls.py

from django.contrib import admin
from django.urls import path
from .views import home

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', home, name='home')
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

【问题讨论】:

    标签: python django django-2.2


    【解决方案1】:

    尝试替换这个:

    STATIC_ROOT = os.path.join (os.path.dirname(BASE_DIR), "staticfiles", "static")
    

    STATIC_ROOT = os.path.join (os.path.dirname(BASE_DIR), "static")
    

    还提供文件的状态(如 404 消息)

    【讨论】:

    • 这没有帮助。实际上,那条线是我添加的,因为我试图让事情正常进行。
    • 尝试将静态目录上移一级并重试
    • 抱歉,您可以尝试将其放入您的设置中:STATICFILES_DIRS = (os.path.join(BASE_DIR, 'static'), ) 而不是 STATIC_ROOT
    【解决方案2】:

    据我所知,STATIC_FILES 对 Django 没有任何意义,尽管您可能将它用于其他目的。

    您定义 STATIC_ROOT 的方式是指向一个不存在的目录。

    StackOverflow 中有很好的参考here

    【讨论】:

      【解决方案3】:

      要提供静态文件,您需要在urls.py 中添加以下configuration

      from django.conf import settings
      from django.conf.urls.static import static
      
      urlpatterns = [
          # ... the rest of your URLconf goes here ...
      ] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
      

      接下来,我认为将statictemplates 放在他们自己的应用程序中是一个很好的做法,如果您想在不久的将来使该应用程序可插入,这将很有用。

      或者收集项目级目录中的所有静态文件并在设置中添加以下内容以识别它也是一个好习惯。

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

      编辑:我刚刚看到更新的问题。尝试添加:

      from django.conf import settings
      from django.conf.urls.static import static
      
      urlpatterns = [
          path('admin/', admin.site.urls),
          path('', home, name='home')
      ]
      
      if settings.DEBUG:
          urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
      

      这就是说,只要我们处于调试模式,就可以提供静态文件。

      【讨论】:

      • 我进行了编辑。请查看我现有的urls.py
      【解决方案4】:

      试试这个:

      STATIC_ROOT = os.path.join (BASE_DIR, "taskbuster", "static")
      

      【讨论】:

        【解决方案5】:

        我可以通过将设置更改为以下内容来解决问题:

        STATIC_URL = '/static/'
        
        STATICFILES_DIRS = (
            os.path.join(BASE_DIR, "static"),
        )
        
        STATIC_ROOT = os.path.join (os.path.dirname(BASE_DIR), "static")
        

        此外,在尝试了解如何修复它时阅读以下文档很有帮助

        https://docs.djangoproject.com/en/2.2/ref/settings/#std:setting-STATICFILES_FINDERS

        特别是,这清楚地解释了 Django 做了什么:

        默认会查找存储在 STATICFILES_DIRS 设置中的文件 (使用 django.contrib.staticfiles.finders.FileSystemFinder)并在 每个应用程序的静态子目录(使用 django.contrib.staticfiles.finders.AppDirectoriesFinder)。如果多个 存在具有相同名称的文件,找到的第一个文件 将被使用。

        【讨论】:

          猜你喜欢
          • 2021-07-08
          • 1970-01-01
          • 2021-12-02
          • 2020-09-14
          • 1970-01-01
          • 1970-01-01
          • 2014-07-25
          • 2011-09-18
          相关资源
          最近更新 更多