当前位置: 首页 > 知识库问答 >
问题:

在Django项目中,为什么静态文件是在本地提供的,而不是来自AWS s3?

苏硕
2023-03-14

我有Django应用程序,我想从AWS s3存储桶提供静态和媒体文件,但在配置后,只有媒体文件从s3提供,静态文件在本地提供。当我收集静态时,所有静态文件都收集在本地静态文件夹中。没有文件发送到AWS s3存储桶。我不得不手动将它们复制到s3。

我使用Django==2.1.4,boto3==1.18.3,django-store==1.11.1

下面我展示了settings.py中的配置(一些不相关的部分被删除,我评论STATIC_URL和我尝试过的MEDIA_URL值)我尝试了例如本主题Django和S3 Bucket AWS Admin Static文件中的建议。

import os
from decouple import config
import django_heroku

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

SECRET_KEY = config('SECRET_KEY')

DEBUG = config('DEBUG', default=False, cast=bool)

ALLOWED_HOSTS = ['yogahouse-ap.herokuapp.com']

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'core',
    'storages',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'yogahouse.urls'

IMAGEKIT_URL = config('IMAGEKIT_URL')

AWS_ACCESS_KEY_ID = config('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = config('AWS_SECRET_ACCESS_KEY')
AWS_STORAGE_BUCKET_NAME = config('AWS_STORAGE_BUCKET_NAME')
AWS_S3_REGION_NAME = 'eu-central-1'
AWS_S3_FILE_OVERWRITE = False
AWS_DEFAULT_ACL = None
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3StaticStorage'
AWS_STATIC_LOCATION = 'static'
DEFAULT_FILE_STORAGE = 'yogahouse.storages.MediaStorage'
AWS_S3_CUSTOM_DOMAIN = f"{AWS_STORAGE_BUCKET_NAME}.s3.{AWS_S3_REGION_NAME}.amazonaws.com"
AWS_IS_GZIPPED = True

STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATIC_URL = '/static/'
# STATIC_URL = f"{IMAGEKIT_URL}/static/"
# STATIC_URL = f"https://{AWS_S3_CUSTOM_DOMAIN}/static/"

MEDIA_URL = '/media/'
# MEDIA_URL = f"{IMAGEKIT_URL}/media/"
# MEDIA_URL = f"https://{AWS_S3_CUSTOM_DOMAIN}/media/"
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

django_heroku.settings(locals())

瑜伽馆。存储。py:

from storages.backends.s3boto3 import S3Boto3Storage


class MediaStorage(S3Boto3Storage):
    location = 'media'
    file_overwrite = False


class StaticStorage(S3Boto3Storage):
    location = 'static'
    file_overwrite = False

共有2个答案

戚祺
2023-03-14

settings.py文件中尝试以下操作-

STATICFILES_DIRS = [
    'mystatic',
]    
AWS_STORAGE_BUCKET_NAME = config('AWS_STORAGE_BUCKET_NAME')
AWS_LOCATION = 'static'
AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME
STATIC_URL = 'https://%s/%s/' % (AWS_S3_CUSTOM_DOMAIN, AWS_LOCATION)
    # STATIC_URL = '/static/'

分享我从这个视频中学习和实施的知识-https://youtu.be/4VIkWSZKMRA

编辑:为STATICFILES_DIRS添加了值。我注意到您没有为此设置值。

勾炳
2023-03-14

主要问题是:

ALLOWED_HOSTS = ['yogahouse-ap.herokuapp.com']

django_heroku.settings(locals())

添加参数staticfiles=False后,文件从s3提供。

对于允许的\u主机=[]静态文件也将从s3提供。

django_heroku.settings(locals(), staticfiles=False)

url仍然不正确,因为我在s3中有静态文件“静态”文件夹。此设置修复它:

AWS_LOCATION = 'static' 
 类似资料:
  • 问题内容: 我正在使用,我的django应用的结构如下 的是 在我尝试使用它为: 但是它没有加载并给出错误 我跑去收集所有静态文件。 为什么要加载CSS文件?是否缺少任何配置? 请提出建议。 问题答案: 根据文档正确的方式来加载静态文件是 这会工作

  • 最后,当我启动spring boot web application时,我发现,当我转到url时,我得到了我的angular应用程序。 接下来的问题是:spring-boot如何理解它应该从依赖项服务静态内容?注意,我在spring-boot模块资源中没有静态文件夹。

  • 问题内容: 让我感谢Stack Overflow社区的人们帮助我解决了各种Django和Apache(带有mod_wsgi)错误。到目前为止,我已经问了5个相关的问题,现在我越来越接近在生产站点上发布内容了! 我读到有关,(很快就会过时),并在Apache配置中设置。我试图逐个测试每个解决方案,但是我什么也做不了。 这是我的管理网站现在的样子 我也有一个奇怪的情况,那就是 任何子 域都可以在我的服

  • Spring boot不提供放置在jar中的静态文件。 我有一个后端应用程序,我决定添加前端。设置任务以将静态前端文件复制到 。在SO上经历了一堆答案,他们都建议静态内容(索引.html,.js和.css文件)应该驻留在或下,我都尝试过。我打开构建的.jar,静态文件在那里,但是使用启动应用程序.jar并打开给了我默认的白标错误页面。我的应用程序工作,因为我可以访问我在其上运行的API。应用程序没

  • 问题内容: 我正在为Django使用apache + mod_wsgi。 并且所有css / js / images都通过提供。 出于某种奇怪的原因,当其他人/朋友/同事尝试访问该网站时,jquery / css不会为他们加载,因此页面看上去很混乱。 我的html文件使用这样的代码- 我的nginx配置是这样的 有一个目录,其中有相应的&目录。 奇怪的是,当我访问它们时页面显示正常。 我已经清除了

  • 关于静态和动态之间的区别,我仍然有点困惑。据我所知,动态使用对象,而静态使用类型,动态在运行时解析,而静态在编译时解析。所以this.lastName.compare(s1.last名称)不应该使用动态绑定吗? 钥匙compareTo(list[position-1])使用动态绑定 (this . last name . compare to(S1 . last name))为什么使用静态绑定?