Django本地版本使用远程静态文件,尽管本地设置

时间:2013-08-29 07:58:23

标签: django boto django-staticfiles django-storage

我已成功将我的Django应用程序部署到AWS Elastic Beanstalk(使用eb)。我已经按照这里列出的步骤http://www.youtube.com/watch?v=YJoOnKiSYwshttp://grigory.ca/2012/09/getting-started-with-django-on-aws-elastic-beanstalk/进行了操作,并使用django-storages(boto)框架来协助对S3进行静态文件管理。

我的SETTINGS.PY中有以下设置:

STATIC_ROOT = os.path.join(
    os.path.dirname(
        os.path.dirname(
            os.path.abspath(__file__))), 'static')

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
STATICFILES_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
AWS_ACCESS_KEY_ID = 'access-key'
AWS_SECRET_ACCESS_KEY = 'secret-key'
AWS_STORAGE_BUCKET_NAME = 'bucket-name'
STATIC_URL = '/static/'
STATICFILES_DIRS = ()
STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)
.
.
.
try:
 from local_settings import *
except ImportError, e:
 pass

我的LOCAL_SETTINGS.PY有以下内容:

STATIC_ROOT = ''
STATIC_URL = '/static/'
STATICFILES_DIRS = (
  ('js', '/blah/blah/static/js'),
  ('css', '/blah/blah/static/css'),
  ('images', '/blah/blah/static/images'),
)

在我的模板中,我使用:

{% load staticfiles %}
<link href="{% static "css/styles.css" %}" rel="stylesheet">

问题在于,当我在本地运行应用程序时,它会引用我在S3中的静态文件,而不是在我的本地目录中。我需要更改哪些设置,以便在本地运行应用程序时,它使用本地静态文件,当它在AWS上运行时,它使用S3文件?

2 个答案:

答案 0 :(得分:1)

问题是您必须重置local_settings.py文件中的默认存储后端;首先处理settings.py文件,当你到达local_settings.py时,Django仍在使用默认值。

另一种策略(可能更好的策略)是在settings.py中测试环境,以确定您是本地还是远程(即开发或生产),然后决定使用哪些设置。

编辑:因此,举例来说,AWS Django指南会告诉您执行以下操作:

if 'RDS_DB_NAME' in os.environ:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': os.environ['RDS_DB_NAME'],
            'USER': os.environ['RDS_USERNAME'],
            'PASSWORD': os.environ['RDS_PASSWORD'],
            'HOST': os.environ['RDS_HOSTNAME'],
            'PORT': os.environ['RDS_PORT'],
        }
    }

然后,在local_settings.py中,为本地配置定义DATABASES。我过去做过的事情是这样的:

if 'RDS_DB_NAME' in os.environ:
    LOCAL_ENVIRONMENT = False
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': os.environ['RDS_DB_NAME'],
            'USER': os.environ['RDS_USERNAME'],
            'PASSWORD': os.environ['RDS_PASSWORD'],
            'HOST': os.environ['RDS_HOSTNAME'],
            'PORT': os.environ['RDS_PORT'],
        }
    }

然后使用LOCAL_ENVIRONMENT(或任何您想要的名称)来驱动其余的配置。

答案 1 :(得分:0)

你能发布你的urls.py吗? 顺便说一句,你必须有debug = True才能在本地提供静态服务 这可能有助于您配置设置和local_settings