我已经使用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,这会导致错误。
答案 0 :(得分:2)
出于这个原因,WhiteNoise有一个名为WHITENOISE_AUTOREFRESH
的设置。
WHITENOISE_AUTOREFRESH
:重新检查文件系统,以查看在响应之前是否有任何文件已更改。这是为了在开发中使用,可以方便地获取静态文件的更改而无需重新启动服务器。出于性能和安全原因,不应在生产中使用此设置。
默认设置是settings.DEBUG
的值,因此如果您正在运行开发服务器,它应默认打开。
答案 1 :(得分:1)
看起来默认的Heroku模板指定旧版本的WhiteNoise。如果你运行
settings.DEBUG
您应该会发现它在开发过程中会自动获取静态文件的更改(即True
为while(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)