2

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

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

有没有一种简单的方法可以在我的本地机器上禁用白噪声,这样我每次想查看本地静态文件的更改时就不必运行“python manage.py collectstatic”?

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

4

4 回答 4

2

WhiteNoise 有一个WHITENOISE_AUTOREFRESH正是出于这个原因而调用的设置。

来自WhiteNoise 文档

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

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

于 2015-12-28T14:43:32.443 回答
1

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

pip install --upgrade whitenoise

您应该会发现它会在开发时(即 when settings.DEBUGis True)自动获取对静态文件的更改。

于 2015-08-11T17:16:12.680 回答
0

虽然我没有找到在我的开发服务器上禁用白噪声的简单方法,但我确实找到了一种方便的解决方法来简化整个过程:

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

alias launch='python manage.py collectstatic --noinput; foreman start'
于 2015-08-10T04:19:56.673 回答
0

当前版本的 whitenoise 将自动获取静态文件中的更改。但它会减慢启动速度runserver,因为它会遍历所有静态文件。我通过禁用 runserver 中的白噪声来解决此问题。现在我的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)
于 2015-12-10T15:42:30.677 回答