简体   繁体   中英

Django 2.2 Not Serving Static Files

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, ie, 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)

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)

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.

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

尝试这个:

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

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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