Хобрук: Ваш путь к мастерству в программировании

Amazon S3 с Django не может загрузить все статические файлы

Я использую Amazon S3 в качестве хранилища статических и мультимедийных файлов. Мой проект Django работает в Digital Ocean Ubuntu 16.04.

После запуска python manage.py collectstatic я обнаружил, что CSS и js не работают на моем сайте. А потом я обнаружил, что CSS и js не были загружены в S3. Я думаю, что это причина, по которой cs и js не работали, потому что их там нет.

в S3 есть только «статическая» папка.введите здесь описание изображения

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

введите здесь описание изображения

Выше находится папка под static в S3.

Когда я проверяю URL-адрес js, он выглядит так:

<link rel="stylesheet" href="https://myproject.s3.amazonaws.com/css/main.css?Signature=imJphDmnb4U%2BWOWHjE0Iagk2tow%3D&amp;AWSAccessKeyId=AKIAI4LFEI2ASSMOYRTQ&amp;Expires=1537337559">


<link rel="icon" href="https://myproject.s3.amazonaws.com/images/logo-blue.png?Signature=ACidpeC946mBazTtHx0McVIk6rM%3D&amp;AWSAccessKeyId=AKIAI4LFEI2ASSMOYRTQ&amp;Expires=1537337559">

Но в моем проекте main.css находится в папке static, изображения — в папке media. Это так странно для меня.

Это папка моего проекта выглядит так:

введите здесь описание изображения

И я обнаружил, что после запуска python manage.py collectstatic система вообще не копировала статические и медиафайлы.

Вот основная часть моего settings.py:

import os
import sys
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))
sys.path.insert(0, os.path.join(BASE_DIR, 'extra_apps'))


ROOT_URLCONF = 'myproject.urls'


STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

AWS_ACCESS_KEY_ID = 'myproject'
AWS_SECRET_ACCESS_KEY = 'myproject'
AWS_STORAGE_BUCKET_NAME = 'myproject'
AWS_S3_FILE_OVERWRITE = False
AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME
# the sub-directories of media and static files
STATICFILES_LOCATION = 'static'
MEDIAFILES_LOCATION = 'media'
# a custom storage file, so we can easily put static and media in one bucket
STATICFILES_STORAGE = 'myproject.custom_storages.StaticStorage'
DEFAULT_FILE_STORAGE = 'myproject.custom_storages.MediaStorage'

# the regular Django file settings but with the custom S3 URLs
STATIC_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, STATICFILES_LOCATION)
MEDIA_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, MEDIAFILES_LOCATION)

Я также создал файл с именем custom_storages.py:

from django.conf import settings
from storages.backends.s3boto3 import S3Boto3Storage

class StaticStorage(S3Boto3Storage):
    location = settings.STATICFILES_LOCATION

class MediaStorage(S3Boto3Storage):
    location = settings.MEDIAFILES_LOCATION

Я следовал этому руководству https://blog.bitlabstudio.com/ultra-short-guide-to-django-and-amazon-s3-2c5aae805ce4

Этот вопрос действительно очень сложный для меня. Любой друг может помочь? Эта проблема тратит мне 2 дня, чтобы решить ее.


  • система не скопировала статику и медиа что показывает? куда он копирует эти папки? 19.09.2018
  • Это выглядит так: Копирование '/home/william/kjmg/kjmgenv/lib/python3.5/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/km.js' всей системы скопированы статический файл в админке и некоторые плагины. Нет копирования файлов в моей статической папке и папке мультимедиа. 19.09.2018
  • STATIC_ROOT определяет, куда копировать все статические файлы при запуске collectstatic. просто удалите STATIC_ROOT, который нацелен на ваш локальный проект... и запустите его снова 19.09.2018
  • Привет, Lemayzeur, спасибо за ваш ответ. Это длинная история, как я пытался решить эту проблему. До сих пор я отказался от Amazon S3, но сейчас, используя digitalocean Spaces, они очень похожи. Теперь я могу загрузить все статические файлы в хранилище. Важно то, что я добавляю STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'), ] в settings.py, это очень важно. Но теперь у меня все еще есть проблема: Нет ' Заголовок Access-Control-Allow-Origin присутствует на запрошенном ресурсе, и я пытаюсь решить эту проблему сейчас. Спасибо, чувак! 21.09.2018
  • Можете ли вы помочь мне с этим относительным вопросом " title="нет контроля доступа, разрешающего заголовок происхождения в запрошенном ресурсе с остроумием"> stackoverflow.com/questions/52449377/ ? Большое спасибо! 21.09.2018
  • Привет, @Lemayzeur, не могли бы вы помочь мне с этим новым вопросом: stackoverflow.com/questions/52461389/ действительно ценю это! 23.09.2018

Новые материалы

Я собираюсь научить вас Python шаг за шагом
Привет, уважаемый энтузиаст Python! 👋 Готовы погрузиться в мир Python? Сегодня я приготовил для вас кое-что интересное, что сделает ваше путешествие более приятным, чем шарик мороженого в..

Альтернатива шаблону исходящих сообщений для архитектуры микросервисов
Познакомьтесь с двухэтапным сообщением В этой статье предлагается альтернативный шаблон для папки Исходящие : двухэтапное сообщение. Он основан не на очереди сообщений, а на..

React on Rails
Основное приложение Reverb - это всеми любимый монолит Rails. Он отлично обслуживает наш API и уровень просмотра трафика. По мере роста мы добавляли больше интерактивных элементов..

Что такое гибкие методологии разработки программного обеспечения
Что представляют собой гибкие методологии разработки программного обеспечения в 2023 году Agile-методологии разработки программного обеспечения заключаются в следующем: И. Введение A...

Ториго  — революция в игре Го
Наш следующий вызов против ИИ и для ИИ. Сможет ли он победить людей в обновленной игре Го? Обратите внимание, что в следующей статье AI означает искусственный интеллект, а Goban  —..

Простое развертывание моделей с помощью Mlflow — Упаковка классификатора обзоров продуктов NLP от HuggingFace
Как сохранить свои модели машинного обучения в формате с открытым исходным кодом с помощью MLFlow, чтобы позже получить возможность легкого развертывания. Сегодня модели упаковки имеют несколько..

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