Статические файлы не отображаются в Django 2.2 при отключенной отладке - PullRequest
0 голосов
/ 30 сентября 2019

В Django 2.2, когда у меня DEBUG=True, все мои статические файлы отображаются нормально. Но когда я установил DEBUG=False для проверки своих производственных параметров, все статические URL-адреса файлов неожиданно возвращают 404 ошибки.

У меня есть такая структура проекта:

myproject/
    myproject/
        settings.py
        urls.py
    manage.py
static/
    thumbnails/
         image.png

Мои соответствующие статические настройки в settings.py:

 STATIC_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', 'static'))

 INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]

STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)
ROOT_URLCONF = 'myproject.urls'
STATIC_URL = '/static/'
DEBUG = False

И мой urls.py выглядит следующим образом:

import os

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

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

Почему URL-адрес, такой как http://localhost:8000/static/thumbnails/image.png, работает нормально при включенной отладке, но возвращает 404 при отладкевыключен?

Ответы [ 2 ]

2 голосов
/ 30 сентября 2019

Django никогда не предназначался для замены веб-серверов. Из документов Django:

Django не обслуживает файлы самостоятельно;он оставляет эту работу любому веб-серверу, который вы выберете.

Этот метод крайне неэффективен и, вероятно, небезопасен, поэтому он не подходит для производства. На localhost с DEBUG = TRUE он развертывает статический файл. Во время работы вы должны использовать свой веб-сервер (Apache, 'Nginx' etc) для развертывания статических файлов. Просто укажите статический каталог в файле конфигурации вашего веб-сервера. Более подробные инструкции по развертыванию можно найти здесь

2 голосов
/ 30 сентября 2019

В производственном процессе вы должны запустить python manage.py collectstatic и фактически обслуживать ваши статические файлы откуда-либо.

Если вы посмотрите документы для статических файлов , вы увидите

Обслуживание файлов

В дополнение к этим шагам настройки вам также необходимо будет фактически обслуживать статические файлы.

Во время разработкиесли вы используете django.contrib.staticfiles, это будет выполнено автоматически с помощью runserver, когда для DEBUG установлено значение True (см. django.contrib.staticfiles.views.serve ()).

Этот метод крайне неэффективен и, вероятно,небезопасно, поэтому оно непригодно для производства.

См. Развертывание статических файлов для правильной стратегии обслуживания статических файлов в производственных средах.

Вы должны установить STATIC_ROOTв ваших производственных настройках перейдите в папку на вашем веб-сервере и настройте веб-сервер так, чтобы он указывал STATIC_URL на эту папку. См. здесь.

В вашем случае кажется, что вы предприняли все эти шаги, кроме фактической обработки ваших статических файлов. Вы можете сделать это, указав свой веб-сервер в нужную папку или предоставив вам статические файлы из CDN или другого решения. Вот как это сделать, используя apache

...