hoo*_*ter 7 python django amazon-s3 amazon-web-services collectstatic
我一直在移动一些设置来制作更明确的本地和生产环境,我一定是搞砸了。
以下是大部分相关设置。如果我将 production.py 设置(目前只包含与 AWS 相关的设置)移动到 base.py,我可以从我的本地机器更新 S3 就好了。同样,如果我将这些 AWS 设置保留在 base.py 中并推送到生产环境,S3 会相应地更新。另外,如果我从 production.py 打印一些东西,它会打印。但是,如果我在 manage.py 上将 production.py 设为我的“本地”设置,或者当我使用如下所示的设置推送到 Heroku 时,S3 不会更新。
我的设置不正确怎么办?(嗯,我确定一些事情,但特别是导致 S3 不更新?)
这是一些相关的代码:
__init__.py (在包含 base、local 和 production 的目录中)
from cobev.settings.base import *
Run Code Online (Sandbox Code Playgroud)
base.py
INSTALLED_APPS = [
...
'whitenoise.runserver_nostatic',
'django.contrib.staticfiles',
...
'storages',
]
...
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, "global_static"),
os.path.join(BASE_DIR, "media", )
]
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
MEDIA_URL = '/media/'
Run Code Online (Sandbox Code Playgroud)
local.py
# local_settings.py
from .base import *
...
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
Run Code Online (Sandbox Code Playgroud)
production.py
from .base import *
# AWS Settings
AWS_ACCESS_KEY_ID = config('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = config('AWS_SECRET_ACCESS_KEY')
AWS_STORAGE_BUCKET_NAME = 'cobev'
AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME
AWS_S3_OBJECT_PARAMETERS = {
'CacheControl': 'max-age=86400',
}
AWS_LOCATION = 'static'
AWS_DEFAULT_ACL = 'public-read'
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
DEFAULT_FILE_STORAGE = 'cobev.storage_backends.MediaStorage'
STATIC_URL = 'https://%s/%s/' % (AWS_S3_CUSTOM_DOMAIN, AWS_LOCATION)
ADMIN_MEDIA_PREFIX = STATIC_URL + 'admin/'
# End AWS
Run Code Online (Sandbox Code Playgroud)
wsgi.py
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "cobev.settings.production")
application = get_wsgi_application()
from whitenoise.django import DjangoWhiteNoise
application = DjangoWhiteNoise(application)
Run Code Online (Sandbox Code Playgroud)
manage.py
#!/usr/bin/env python
import os
import sys
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "cobev.settings.local")
try:
from django.core.management import execute_from_command_line
except ImportError as exc:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
) from exc
execute_from_command_line(sys.argv)
Run Code Online (Sandbox Code Playgroud)
好吧,让我尝试一下,正如问题评论中所发现的那样,您使用 S3 更新collectstatic,但这是一个管理命令,称为使用manage.py文件,您在其中设置的cobev.settings.local设置不等于cobev.settings.production用于wsgi.py文件的设置。
我认为你应该使用正常的 Django 方式管理你的设置文件,操作系统环境变量名为DJANGO_SETTINGS_MODULE.
当然,您应该能够在正在运行的任何生产环境中设置它。