如何调试带有whitenoise,gunicorn和heroku的Django静态文件?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何调试带有whitenoise,gunicorn和heroku的Django静态文件?相关的知识,希望对你有一定的参考价值。

我有一个从Dockerfile和heroku.yml在Heroku上运行的项目。

该站点通常可以正常运行,但是我在处理静态文件时遇到了麻烦。

[collectstatic在构建包时运行。

如果将DEBUG设置为True,它将找到文件。

我正在尝试使用白噪声,但不确定为什么它不起作用。听起来很简单,所以我敢肯定这很愚蠢。

heroku.yml

setup:
    addons:
        - plan: heroku-postgresql
build:
    docker:
        web: Dockerfile
release:
    image: web
    command:
        - python manage.py collectstatic --noinput
run:
    web: gunicorn records_project.wsgi

settings.py

MIDDLEWARE = [
    'django.middleware.cache.UpdateCacheMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'whitenoise.middleware.WhiteNoiseMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.contrib.sites.middleware.CurrentSiteMiddleware',
]
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'whitenoise.runserver_nostatic',
    'django.contrib.staticfiles',
    'django.contrib.sites',
    ... more stuff here...
# Static files (CSS, javascript, Images)
# https://docs.djangoproject.com/en/3.0/howto/static-files/

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
# for referencing files with a URL
STATIC_URL = '/static/'
# where to find static files when local
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'),]
# location of satatic files for production
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
# how Django should look for static file directories; below is default
STATICFILES_FINDERS = [
    # defaults
    "django.contrib.staticfiles.finders.FileSystemFinder",
    "django.contrib.staticfiles.finders.AppDirectoriesFinder",
]
# This gives me a 500 error
# STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

urls.py

urlpatterns here...
...
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
答案

[您是否有机会在模板中引用不存在的静态文件(例如CSS文件或图像?我遇到了同样的问题,因为我的基本模板中包含以下内容:

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

但是我的css文件夹中没有styles.css文件。

另一答案

我有类似的问题,因为在发布阶段收集的静态文件在运行时丢失。所以我将代码更改为:

heroku.yml

setup:
  addons:
    - plan: heroku-postgresql
build:
  docker:
    web: Dockerfile
release:
  image: web
  command:
    - chmod u+x entrypoint_heroku.sh
run:
  web: ./entrypoint_heroku.sh

entrypoint_heroku.sh

#!/bin/sh
mkdir -p /storage/static/
python manage.py migrate --noinput
python manage.py collectstatic --noinput
gunicorn app.wsgi

settings.py

STATIC_URL = '/static/'
MEDIA_ROOT = '/storage/'
STATIC_ROOT = MEDIA_ROOT + 'static/'
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

不是最佳解决方案。但这帮助我使用Debug = False]运行服务器

以上是关于如何调试带有whitenoise,gunicorn和heroku的Django静态文件?的主要内容,如果未能解决你的问题,请参考以下文章

仅使用 gunicorn、django 和 whitenoise 我如何提供媒体服务?

Django:Whitenoise 在调试错误的情况下无法在生产中工作

gzip 在带有 Whitenoise 的 Django 中不起作用

使用 Django 在 Heroku 上接收带有图像的特定页面的服务器错误 500(由 WhiteNoise 提供静态服务)

django/whitenoise 存储后端导致错误

Whitenoise 应该自动压缩静态文件吗?如何?