【问题标题】:collectstatic and DEBUG收集静态和调试
【发布时间】:2016-01-05 15:52:44
【问题描述】:

在开发时,我从硬盘驱动器提供静态文件,而当它们投入生产时,它们从 S3 提供。我通过这个实现了这一点:

DEBUG = False

if 'DYNO' not in os.environ:
    DEBUG = True

...

if DEBUG:
    STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.StaticFilesStorage'
    STATIC_URL = BASE_DIR + '/path/to/stuff/'
else:
    STATICFILES_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
    STATIC_URL = "https://%s/" % AWS_S3_CUSTOM_DOMAIN

因此,如果此代码在 Heroku 上运行,它将从 S3 获取,或者如果在本地运行,则从 path/to/stuff 获取。当我运行collectstatic 时出现问题,它使用StaticFilesStorage 收集并且不推送到S3。有办法解决这个问题吗?也许检查collectstatic 命令是否正在访问代码?

【问题讨论】:

    标签: django amazon-s3 django-staticfiles


    【解决方案1】:

    您可以在运行任何管理命令时使用specify the settings file

    例如,如果您有一个具有正确静态文件设置的 settings_prod.py,那么您将运行:

    ./manage.py collectstatic --settings=settings_static.py
    

    在您的情况下,您可以通过运行带有 DYNO 环境变量集的 collectstatic 管理命令来获得您想要的行为(因为这意味着 DEBUG=False)。

    DYNO='1' ./manage.py collectstatic
    

    或者,您可以寻找不同的环境变量,例如COLLECTSTATIC,并适当设置静态文件设置。

    【讨论】:

    • 我可以附加另一个变量吗?喜欢./manage.py collectstatic --my_variable=True
    • 不,manage.py 不允许您定义像 --my_variable=True 这样的任意设置。
    【解决方案2】:

    您可以在settings.py 中查看主机名:

    HOSTS = ['mac.loc', 'my.dev', ...]
    
    ...
    
    if socket.gethostname() in HOSTS:
        # local settings
        ... 
    else:
        # remote settings
        ...
    

    【讨论】:

    • 这并不能解决这里的问题 - OP 希望使用不同的静态文件设置,具体取决于它们是在运行 collectstatic,还是像 runserver 这样的不同管理命令。
    • 他可以在 if else 块中使用不同的设置。 if socket.gethostname() in HOSTS: from settings_dev import * else: from settings_prod import *
    猜你喜欢
    • 2018-10-06
    • 2012-10-30
    • 2014-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多