Django 2.2 Not Serving Static Files

不羁的心 提交于 2019-12-24 11:15:42

问题


I am currently working through some tutorials to enhance my knowledge of Django. In doing so, I decided to use to most recent version of Django. I have been able to overcome most of the divergences between my code and that of the tutorial except for one - static files are not being served. Now, I am not fully sure that the difference is strictly due to the Django version. Here is what is going on.

I have the following project structure:

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',
            ],
        },
    },
]

What is interesting is that with this configuration, the project is able to find templates successfully. However, as mentioned above, it cannot find the static files. Why is that?

Also, this tutorial sets up an unusual configuration in that the static and templates directories are located inside the main app's directory, whereas I typically have them one level higher, i.e., in the project root's directory. Could this be a part of the problem? What in the settings of this particular project makes Django look for files one directory lower? The settings seem the same as those of other project I had done. However, those project contained the static and templates directories in the project's root directory.

Any help and clarification is appreciated.

Edit:

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)

回答1:


try replacing this:

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

with

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

Also provide the status of files (like 404 messages)




回答2:


STATIC_FILES doesn't mean anything to Django, as far as I know, although maybe you are using it for another purpose.

The way you had STATIC_ROOT defined it was pointing to a non-existent directory.

There is a good reference in StackOverflow here




回答3:


To serve static files you need to add the following configuration in urls.py as:

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)

Next, I believe it is a good practice to put static and templates within their own apps, this is useful if you want to make that app plug-able any near future.

Or it is also a good practice to gather all static files in project level directory and add the following in settings to identify it.

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

edit: I just see the updated question. Try adding this:

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)

This says, as long as we are in debug mode serve the static files.




回答4:


try this:

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



回答5:


I was able to solve the issue by changing the settings to the following:

STATIC_URL = '/static/'

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

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

Furthermore, it was helpful to read the following documentation when trying to understand how to fix it

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

Particularly, this explained clearly what Django did:

The default will find files stored in the STATICFILES_DIRS setting (using django.contrib.staticfiles.finders.FileSystemFinder) and in a static subdirectory of each app (using django.contrib.staticfiles.finders.AppDirectoriesFinder). If multiple files with the same name are present, the first file that is found will be used.



来源:https://stackoverflow.com/questions/56515239/django-2-2-not-serving-static-files

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!