Загрузка статических файлов Django 2.1 в производство, но не в разработку - PullRequest
0 голосов
/ 03 марта 2019

Обычно у меня возникает эта проблема как раз наоборот!

В моей среде разработки мое приложение Django не будет загружать некоторые из моих статических файлов, в частности те, которые я добавил сам: то есть два пакетаЯ добавил в свое приложение (admin и ckeditor), оба загружаются нормально, но две из папок, которые я сам создал и связал (img и css), не найдены.Вот карта моего каталога:

root
 |-- blog    (this is the name of my app)
 |-- mysite  (name of my site)
      |-- settings.py
      |-- urls.py
 |-- media
 |-- static
      |-- admin
      |-- ckeditor
      |-- css
      |-- img

Как уже говорилось, ckeditor и admin прекрасно загружаются, а остальные нет.Вот пример из вывода runserver в режиме отладки (файл в static/css/base.css существует в моем дереве файлов):

GET /static/ckeditor/ckeditor/ckeditor.js HTTP/1.1" 200 690627
GET /static/admin/css/fonts.css HTTP/1.1" 200 423
GET /static/admin/css/widgets.css HTTP/1.1" 200 10340
GET /static/css/base.css HTTP/1.1" 404 1761
GET /static/img/brand.png HTTP/1.1" 404 1764

Вот еще некоторая информация, которая может представлять интерес:

  • Отлично работает в производстве!Я предположил, что это потому, что у меня были выделенные псевдонимы в моей конфигурации apache, но это не объясняет, почему admin и ckeditor работают.
  • Я перенаправил мультимедиа почти таким же образом (см. Файл настроекниже), и это прекрасно работает при разработке.
  • Я использую тег шаблона {% load static %}, как указано в документации Django.В более старых версиях я использовал {% load staticfiles %}, и я тоже это пробовал.
  • Я запускал collectstatic в обеих средах.
  • Запуск с DEBUG=False отлично работает на производстве (всестатические файлы загружаются) но статические файлы вообще не загружаются, когда DEBUG=False в разработке.Это, однако, следовало ожидать, так как в процессе разработки у меня нет веб-сервера, чтобы справиться с этим (чтобы уточнить, я обычно запускаю сервер в режиме отладки, но попытался отключить и включить этот параметр впосмотрите, какие изменения произошли)

Чтобы помочь кому-либо отладить мою проблему, вот несколько соответствующих файлов с выдержками:

settings.py

DEBUG = True
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
...
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog',
    'ckeditor',
    'ckeditor_uploader',
]
...
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = '/static/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

urls.py

from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    path('', include('blog.urls')),
    path('admin/', admin.site.urls),
    path('ckeditor', include('ckeditor_uploader.urls')),
]
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

Ответы [ 4 ]

0 голосов
/ 09 марта 2019

Это простой подход для обработки статических файлов в django (который работает сразу после установки параметров по умолчанию в Django):

  1. Никогда ничего не вкладывайте впапка, указанная вами как STATIC_ROOT.
  2. Поместите статические файлы, относящиеся к приложению, в папку static внутри приложения.
  3. Для статических файлов, которые не принадлежат напрямуюприложение, создайте папку static_files в своем проекте и добавьте в свои настройки: STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static_files'),]. Очевидно, что вы можете выбрать другое имя, static_files - это просто предложение.
  4. Для производства запустить collectstatic, чтобы Django собирал ваши статические файлы (из пунктов 2. и 3.) и помещает их в папку, созданную вами в 1.

Если вы находитесь в режиме отладки, вы закончите после шага 3.


В вашем случае проблема заключалась в том, что вы помещали статический контент в STATIC_ROOT, который является папкой, в которой Django не будет искать контент в режиме отладки.admin и ckeditor работают, потому что они выполняют шаг 2. Таким образом, их статические файлы на самом деле поступают из папки установленного приложения, а не из папки static в режиме отладки.


Итак, вот как исправить проблему :

  • выполните шаг 3. сверху.
  • переместите папки img и css впапка, созданная на шаге 3.
  • (необязательно), чтобы стереть папку STATIC_ROOT.
0 голосов
/ 09 марта 2019

Так как в вашем списке приложений 'django.contrib.staticfiles', Django фактически НЕ загружает файлы из STATIC_ROOT, когда DEBUG равен True.

Когда DEBUG включен, Django использует опцию STATICFILES_FINDERS, которая по умолчанию:

[
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
]

FileSystemFinder найдет файлы, сохраненные в параметре STATICFILES_DIRS, а AppDirectoriesFinder ищет файлы в подкаталоге static каждого приложения.

Вот почему папки admin и ckeditor работают - Django вообще не использует вашу папку / root / static, когда DEBUG имеет значение True.Вместо этого он получает файлы от AppDirectoriesFinder из подкаталогов apps static.Что-то вроде ... / 3.5 / lib / python3.5 / site-packages / django-ckeditor / static /...

Когда вы запускаете команду collectstatic, она собирает все статические файлы, которые STATICFILES_FINDERS может найти, икопирует их в ваш STATIC_ROOT (/ root / static /) и, если DEBUG имеет значение False, Django просто использует эту папку вместо STATICFILES_FINDERS

Так как вы можете заставить ее работать с включенной отладкой.Просто создайте папку и добавьте ее в STATICFILES_DIRS следующим образом:

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

Также вы можете удалить все файлы из /root/static/ вам не нужно ничего создавать внутри этой папки вручную, collectstatic сделает этоавтоматически для производства.

0 голосов
/ 09 марта 2019

У меня также были некоторые проблемы с локальными файлами, и это помогло моей ситуации.

Я храню свои статические файлы на S3, но вы можете настроить URL-адрес вашего изображения.

if DEBUG == False:
    STATICFILES_LOCATION = 'static'
    STATIC_URL = "//%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, STATICFILES_LOCATION)
    MEDIAFILES_LOCATION = 'media'
    MEDIA_URL = "//%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, MEDIAFILES_LOCATION)
else:
    MEDIA_URL = '/media/'
    STATIC_URL = '/static/'
0 голосов
/ 08 марта 2019

Ваши urlpatterns верны, что означает, что проблема, скорее всего, settings.DEBUG = False в файле настроек.Убедитесь, что settings.DEBUG равно True, и статические файлы должны загрузиться.Вы можете проверить это, используя manage.py shell и проверив значение флага DEBUG.

Единственные другие проблемы, на которые нужно обратить внимание, это то, указываете ли вы на правильный файл URL-адресов в своих настройках, проверяяROOT_URLCONF и указывает, указывает ли ваш BASE_DIR на родительский каталог каталога static.Оба значения также можно проверить в shell.

Например, если ваш файл настроек находится в /path/to/root/blog/settings.py, то вы устанавливаете BASE_DIR как:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
...