Django 静态文件未使用 S3 正确上传到 Digitalocean 空间

问题描述 投票:0回答:1

我正在开发 django 项目 v5.1,并且一如既往地使用 digitalocean 空间来存储我的静态和媒体文件。

这是我一直使用的默认配置:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # Our apps
    ...,
    ...,
    ...,
    ...,
    # Third party apps
    'storages',
    
]

# DigitalOcean Spaces Configuration
AWS_ACCESS_KEY_ID = os.getenv('DO_SPACE_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.getenv('DO_SPACE_SECRET_ACCESS_KEY')
AWS_STORAGE_BUCKET_NAME = os.getenv('DO_SPACE_BUCKET_NAME')
AWS_S3_ENDPOINT_URL = f"https://{os.getenv('DO_SPACE_BUCKET_NAME')}.{os.getenv('DO_SPACE_REGION')}.digitaloceanspaces.com"
AWS_S3_OBJECT_PARAMETERS = {
    'CacheControl': 'max-age=86400',  # Cache static files for 1 day
}

# Static and Media Files Settings
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

# Static and Media URL
STATIC_URL = f"{AWS_S3_ENDPOINT_URL}/static/"
MEDIA_URL = f"{AWS_S3_ENDPOINT_URL}/media/"
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

# Optional configurations to prevent overwrite of files with the same name
AWS_S3_FILE_OVERWRITE = False
AWS_DEFAULT_ACL = None

但这一次我遇到了问题。

通常我不定义

STATIC_ROOT
,因为我使用的是Boto3,但现在如果我在运行collectstatic时不定义它,它会给我这个错误:

django.core.exceptions.ImproperlyConfigured: 
You're using the staticfiles app without having set the STATIC_ROOT setting to a filesystem path.

但是当我包含它时,它会收集我定义的 staticfiles 文件夹中的静态文件,而不是上传到 digitalocean 空间。

我不知道 Django 5 是否有变化,但我确实尝试通过转到 django shell 来测试 S3 上传:

from storages.backends.s3boto3 import S3Boto3Storage
from django.core.files.base import ContentFile
storage.save('testfile.txt', ContentFile('This is a test file for DigitalOcean Spaces'))

文件已上传到我的空间存储桶中。

enter image description here

问题出在哪里?有没有人在最新版本的 Django 中遇到过这种情况?

PS:我使用 Digitalocean 作为数据库和空间,使用railway.app 来部署应用程序。

python django boto3 space collectstatic
1个回答
0
投票

经过多次研究,我终于找到了问题所在。确实是Django版本的原因。

如果您正在运行 Django <= 4.2: You will use these 2 lines:

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3StaticStorage'

如果您运行的是 Django > 4.2: 您将使用这些行:

STORAGES = {
    "default": {
        "BACKEND": "storages.backends.s3boto3.S3Boto3Storage",
    },
    "staticfiles" : {
        "BACKEND": "storages.backends.s3boto3.S3Boto3Storage",
    },
}

您还需要删除 STATIC_URL、STATIC_ROOT、MEDIA_URL 和 MEDIA_ROOT 定义。

© www.soinside.com 2019 - 2024. All rights reserved.