AWS S3 存储桶上的 Django 静态文件

时间:2021-05-12 22:27:44

标签: django amazon-s3 django-storage

有一堆和这个类似的问题,但是我看了其中一些,还是没能答对。

我有一个 Django 应用程序,我想使用 AWS S3 存储桶提供静态和媒体文件。我可以运行 python manage.py collectstatic 并将文件添加到存储桶中。但是,对于浏览器上的静态文件,我收到 404 not found 错误。有一段时间我的配置有效,因为我能够通过检查页面看到来自 s3 的文件,但我找不到更改了什么使其现在无法工作。

这是我的 settings.py:

USES_S3 = os.getenv('USES_S3') == 'True'

if USES_S3:
    AWS_ACCESS_KEY_ID = os.getenv('AWS_ACCESS_KEY_ID')
    AWS_SECRET_ACCESS_KEY = os.getenv('AWS_SECRET_ACCESS_KEY')
    AWS_STORAGE_BUCKET_NAME = os.getenv('AWS_STORAGE_BUCKET_NAME')
    AWS_DEFAULT_ACL = 'public-read'
    AWS_S3_CUSTOM_DOMAIN = f'{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com'
    AWS_S3_OBJECT_PARAMETERS = {'CacheControl': 'max-age=31536000'}
    AWS_LOCATION = 'static'
    STATIC_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/{AWS_LOCATION}/'
    STATICFILES_STORAGE = 'core.storage_backends.StaticStorage'
    PUBLIC_MEDIA_LOCATION = 'media'
    MEDIA_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/{PUBLIC_MEDIA_LOCATION}/'
    DEFAULT_FILE_STORAGE = 'core.storage_backends.MediaStorage'
else:
    STATIC_URL = '/static/'
    STATIC_ROOT = os.path.join(CORE_DIR, 'staticfiles')
    MEDIA_URL = '/mediafiles/'
    MEDIA_ROOT = os.path.join(BASE_DIR, 'mediafiles')

STATICFILES_DIRS = (
    os.path.join(CORE_DIR, 'core/static'),
)

storages_backend.py:

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

class MediaStorage(S3Boto3Storage):
    location = 'media'
    default_acl = 'public-read'
    file_overwrite = False

class StaticStorage(S3Boto3Storage):
    location = 'static'
    default_acl = 'public-read'

我也尝试设置以下变量,但没有成功:

AWS_S3_SIGNATURE_VERSION = 'virtual'
AWS_S3_REGION_NAME = 'eu-west-3'
AWS_S3_SIGNATURE_VERSION = 's3v4'

知道它是什么吗?我不明白 collectstatic 如何工作并在存储桶上创建文件,但我得到 404。

这也是我的一个 html 文件的示例(这是 base.html):

<!DOCTYPE html>
<html lang="en">
{% load static %}
<head>
    <title>
    </title>
    <!-- HTML5 Shim and Respond.js IE10 support of HTML5 elements and media queries -->
    <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
    <!--[if lt IE 10]>
        <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
        <script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
        <![endif]-->
    <!-- Meta -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimal-ui">
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <link rel="canonical" href="https://appseed.us/admin-dashboards/django-dashboard-dattaable">
    
    <!-- Favicon icon -->
    <link rel="icon" href="/static/assets/images/favicon.ico" type="image/x-icon">
    <!-- fontawesome icon -->
    <link rel="stylesheet" href="/static/assets/fonts/fontawesome/css/fontawesome-all.min.css">
    <!-- animation css -->
    <link rel="stylesheet" href="/static/assets/plugins/animation/css/animate.min.css">
    <!-- vendor css -->
    <link rel="stylesheet" href="/static/assets/css/style.css">

    <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.24/css/jquery.dataTables.css">

    <link href="{% static 'ronfe.css' %}" rel="stylesheet" type="text/css" />


    <!-- Specific CSS goes HERE -->
    {% block stylesheets %}{% endblock stylesheets %}

</head>

<body>

    <!-- [ Pre-loader ] start -->
    <div class="loader-bg">
        <div class="loader-track">
            <div class="loader-fill"></div>
        </div>
    </div>    
    
    <!-- Top Bar -->
    {% include 'includes/navigation.html' %}

    <!-- SideBar -->
    {% include 'includes/sidebar.html' %}

    <div class="pcoded-main-container">
        <div class="pcoded-wrapper">

            {% block content %}{% endblock content %}

        </div>
    </div>

    {% include 'includes/scripts.html' %}

    <!-- Specific Page JS goes HERE  -->
    {% block javascripts %}{% endblock javascripts %}

</body>
</html>

0 个答案:

没有答案