我正在尝试使用values.SecretValue()
来设置我的aws存储桶名称。要设置Django的媒体网址,我曾经使用过:
AWS_STORAGE_BUCKET_NAME = values.SecretValue()
MEDIA_URL = 'https://s3.amazonaws.com/{}/'.format(AWS_STORAGE_BUCKET_NAME)
现在,即使AWS_STORAGE_BUCKET_NAME正确地从设置的enironmental变量中提取值,MEDIA_URL也是https://s3.amazonaws.com/None/
。
可以使用以下设置重现:
class Production(Common):
AWS_ACCESS_KEY_ID = values.SecretValue()
AWS_SECRET_ACCESS_KEY = values.SecretValue()
AWS_STORAGE_BUCKET_NAME = values.SecretValue()
MEDIA_URL = 'https://s3.amazonaws.com/{}/'.format(AWS_STORAGE_BUCKET_NAME)
print MEDIA_URL, AWS_STORAGE_BUCKET_NAME
# -> https://s3.amazonaws.com/None/ None
使用此manage.py运行服务器:
import os
import sys
from django.conf import settings
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config")
os.environ.setdefault("DJANGO_CONFIGURATION", "Production")
os.environ.setdefault("DJANGO_AWS_STORAGE_BUCKET_NAME", "my-bucket")
os.environ.setdefault("DJANGO_SECRET_KEY", "my-secret")
os.environ.setdefault("DJANGO_AWS_ACCESS_KEY_ID", "my-key")
os.environ.setdefault("DJANGO_AWS_SECRET_ACCESS_KEY", "my-secret-key")
print settings.MEDIA_URL, settings.AWS_STORAGE_BUCKET_NAME, os.environ.get('DJANGO_AWS_STORAGE_BUCKET_NAME')
# -> https://s3.amazonaws.com/None/ my-bucket my-bucket
from configurations.management import execute_from_command_line
execute_from_command_line(sys.argv)
临时修复是使用属性在每次调用时评估变量:
@property
def MEDIA_URL(self):
return 'https://s3.amazonaws.com/{}/'.format(Production.AWS_STORAGE_BUCKET_NAME)
但在初始化时设置此值一次更有意义。
使用Django-configurations 1.0
和Django 1.9.2
。
答案 0 :(得分:1)
也许你可以尝试懒惰的事情:
from django.utils.functional import lazy
def get_media_url():
from django.conf import settings
return 'https://s3.amazonaws.com/{}/'.format(settings.AWS_STORAGE_BUCKET_NAME)
MEDIA_URL = lazy(get_media_url)()