Django 2.2不提供静态文件

时间:2019-06-09 14:04:12

标签: python django django-2.2

我目前正在通过一些教程来增强对Django的了解。为此,我决定使用最新版本的Django。我可以克服我的代码与教程代码之间的大部分差异,唯一的区别是-不提供静态文件。现在,我不能完全确定差异是否完全取决于Django版本。这是怎么回事。

我具有以下项目结构:

enter image description here

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)

5 个答案:

答案 0 :(得分: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消息)

答案 1 :(得分:1)

要提供静态文件,您需要在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)

这表示,只要我们处于调试模式,便会提供静态文件。

答案 2 :(得分:1)

据我所知,

STATIC_FILES对Django没有任何意义,尽管也许您将其用于其他目的。

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

StackOverflow here

中有很好的参考

答案 3 :(得分:1)

尝试一下:

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

答案 4 :(得分:0)

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

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)。如果多个   存在具有相同名称的文件,找到的第一个文件   将被使用。