Статические файлы, загруженные на s3, не будут отображаться локально - PullRequest
0 голосов
/ 11 февраля 2019

Я только что загрузил свою статику на S3 и CloudFront.python manage.py collectstatic успешно.Теперь я знаю, что правильное поведение будет таким: когда я запускаю свое приложение локально, вся статика будет запускаться с S3, поскольку статический URL был изменен.Но ничего этого не происходит.Я попытался запустить python manage.py runserver --nostatic: сервер работает, но все мои ресурсы пропали локально (даже когда я запускаю эту команду без --nostatic).

Вот мой settings.py:

import os
from django.utils.translation import ugettext_lazy as _
import boto3

...

# AWS CloudFront
AWS_S3_REGION_NAME = 'us-east-2'  # e.g. us-east-2
AWS_ACCESS_KEY_ID = '*******'
AWS_SECRET_ACCESS_KEY = '*******'
AWS_S3_HOST = 's3-us-east-2.amazonaws.com'
AWS_S3_OBJECT_PARAMETERS = {
    'CacheControl': 'max-age=1209600, no-transform'
}

# static
BUCKET_STATIC_NAME = '*******'
CLOUDFRONT_STATIC_DOMAIN = '*******.cloudfront.net'

# media
BUCKET_MEDIA_NAME = '*******'
CLOUDFRONT_MEDIA_DOMAIN = '*******.cloudfront.net'

# storage
DEFAULT_FILE_STORAGE = 'elef.custom_storage.MediaS3BotoStorage'
STATICFILES_STORAGE = 'elef.custom_storage.CachedStaticS3BotoStorage'

MEDIA_URL = 'https://%s/' % CLOUDFRONT_MEDIA_DOMAIN
STATIC_URL = 'https://%s/' % CLOUDFRONT_STATIC_DOMAIN

AWS_DEFAULT_ACL = None

У меня также есть custom_storage.py:

from storages.backends.s3boto3 import S3Boto3Storage, SpooledTemporaryFile
import boto3
import os

from django.conf import settings
from django.contrib.staticfiles.storage import CachedFilesMixin


class CachedStaticS3BotoStorage(CachedFilesMixin, S3Boto3Storage):
    """
    S3BotoStorage backend which also saves a hashed copies of the files it saves.
    """
    bucket_name = settings.BUCKET_STATIC_NAME
    custom_domain = settings.CLOUDFRONT_STATIC_DOMAIN

    def _save_content(self, obj, content, parameters):
        content.seek(0, os.SEEK_SET)
        content_autoclose = SpooledTemporaryFile()
        content_autoclose.write(content.read())
        super(CachedStaticS3BotoStorage, self)._save_content(obj, content_autoclose, parameters)

        if not content_autoclose.closed:
            content_autoclose.close()


class MediaS3BotoStorage(S3Boto3Storage):
    """
    S3BotoStorage backend for media files.
    """
    bucket_name = settings.BUCKET_MEDIA_NAME
    custom_domain = settings.CLOUDFRONT_MEDIA_DOMAIN

Вот трассировка сервера при запуске python manage.py runserver (или python manage.py runserver --nostatic):

^C(*****) djeustinezzz:***** justine_dev$ python manage.py runserver --nostatic
Performing system checks...

System check identified no issues (0 silenced).

You have 15 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.

February 11, 2019 - 11:28:11
Django version 2.1.5, using settings 'elefmarket.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
[11/Feb/2019 11:28:16] "GET / HTTP/1.1" 200 5775
Not Found: /static/images/logos/logo_bronze_2.png
[11/Feb/2019 11:28:16] "GET /static/images/logos/logo_bronze_2.png HTTP/1.1" 404 3082
Not Found: /static/images/pictos/btc-5.png
[11/Feb/2019 11:28:16] "GET /static/images/pictos/btc-5.png HTTP/1.1" 404 3061
Not Found: /static/images/pictos/margin-5.png
Not Found: /static/images/pictos/aws.png
[11/Feb/2019 11:28:16] "GET /static/images/pictos/aws.png HTTP/1.1" 404 3055
[11/Feb/2019 11:28:16] "GET /static/images/pictos/margin-5.png HTTP/1.1" 404 3070

НеНе обращайте внимания на непримененные миграции, я использую базу данных nosql.

Также вот как я называю статику в home.html:

{% load static %}
{% load i18n %}

<!DOCTYPE html>
<html>
    <head>
        <title>******</title>
        <link rel="shortcut icon" type="image/png" href="static/images/logos/elef.png"/>
        <link rel="stylesheet" href="{% static 'css/app.css' %}">
        <link rel="stylesheet" href="{% static 'css/home.css' %}">
    </head>
    <body></body>
</html>



Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Я нашел проблему, если она может помочь другим.У меня были общие настройки, неправильно установленные в консоли S3.В доступе было отказано, поэтому мой сервер не мог получить доступ к статике.Вам нужно будет проверить права доступа: Amazon S3> your-bucket> permissions> public access settings, а затем отредактируйте настройки по своему усмотрению.

Надеюсь, это поможет.

0 голосов
/ 11 февраля 2019

Вы установили MEDIA_URL для указания на свой домен S3, но не STATIC_URL.

...