繁体   English   中英

Django 2.2不提供静态文件

[英]Django 2.2 Not Serving Static Files

我目前正在通过一些教程来增强对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查找文件的目录低了一个目录? 设置似乎与我完成的其他项目相同。 但是,这些项目在项目的根目录中包含static目录和templates目录。

任何帮助和澄清表示赞赏。

编辑:

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)

尝试替换此:

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

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

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

要提供静态文件,您需要在urls.py添加以下配置为:

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)

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

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

您用STATIC_ROOT定义的方式指向的目录不存在。

有一个在StackOverflow的一个很好的参考这里

尝试这个:

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

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

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/zh-CN/2.2/ref/settings/#std:setting-STATICFILES_FINDERS

特别是,这清楚地解释了Django所做的事情:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM