如何为我的Django项目的本地开发禁用whitenoise?

时间:2015-08-10 04:09:34

标签: python django heroku collectstatic

我已经使用Heroku Django project template在Heroku上部署了一个Django项目。 Heroku的模板使用whitenoise来收集位于项目根目录的/ static /目录中的静态文件。

这对我的生产环境很有用; Heroku运行" manage.py collectstatic"每次我将新文件推送到我的服务器。然而,在本地开发时很痛苦:每次我更改静态文件(例如,css)时,我都必须手动运行" python manage.py collectstatic"在看到我的开发服务器上的更改之前。

是否有一种简单的方法可以在我的本地计算机上禁用whitenoise,这样我就不必运行" python manage.py collectstatic"每次我想看到本地静态文件的更改?

我尝试过创建一个单独的" development_settings.py"文件并删除该文件中对whitenoise的所有引用,但它不起作用,因为在wsgi.py中仍然引用了whitenoise,这会导致错误。

4 个答案:

答案 0 :(得分:2)

出于这个原因,WhiteNoise有一个名为WHITENOISE_AUTOREFRESH的设置。

来自WhiteNoise Docs

  

WHITENOISE_AUTOREFRESH:重新检查文件系统,以查看在响应之前是否有任何文件已更改。这是为了在开发中使用,可以方便地获取静态文件的更改而无需重新启动服务器。出于性能和安全原因,不应在生产中使用此设置。

默认设置是settings.DEBUG的值,因此如果您正在运行开发服务器,它应默认打开。

答案 1 :(得分:1)

看起来默认的Heroku模板指定旧版本的WhiteNoise。如果你运行

settings.DEBUG

您应该会发现它在开发过程中会自动获取静态文件的更改(即Truewhile(loop)时)。

答案 2 :(得分:0)

虽然我没有找到一种在我的开发服务器上禁用whitenoise的简单方法,但我找到了一个方便的解决方法,使整个过程更容易:

为您的.bash_profile文件添加一个新的命令别名(如果您使用虚拟环境进行开发,则为bin / activate),它们同时运行collectstatic并启动服务器:

alias launch='python manage.py collectstatic --noinput; foreman start'

答案 3 :(得分:0)

当前版本的whitenoise将自动获取静态文件中的更改。但它可以减慢runserver的启动速度,因为它会迭代所有静态文件。我通过在runserver中禁用whitenoise来修复此问题。现在我的wsgi.py看起来像这样:

import os
import sys

from django.core.wsgi import get_wsgi_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "...")

application = get_wsgi_application()

# guess whether this is a runserver invocation with staticfiles
has_staticfiles = False
if 'runserver' in sys.argv:
    from django.conf import settings
    import inspect
    if settings.DEBUG:
        has_staticfiles = any(
            "django/contrib/staticfiles/management/commands/runserver"
            in x[1]
            for x in inspect.stack())

if has_staticfiles:
    print('runserver with staticfiles detected, skipping whitenoise')
else:
    # Do not use whitenoise with runserver, as it's slow
    from whitenoise.django import DjangoWhiteNoise
    application = DjangoWhiteNoise(application)