Django env设置在检查是否设置了env变量之前进行评估

时间:2016-03-01 20:09:04

标签: python django

我正在尝试使用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

1 个答案:

答案 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)()