Python 如何调试由whitenoise、gunicorn和heroku提供的django静态文件?

Python 如何调试由whitenoise、gunicorn和heroku提供的django静态文件?,python,django,docker,heroku,gunicorn,Python,Django,Docker,Heroku,Gunicorn,我从Dockerfile和Heroku.yml中得到了一个在Heroku上运行的项目 该网站通常工作,但我有静态文件的问题 collectstatic在构建包时运行 如果我将DEBUG设置为True,它将查找文件 我正在尝试使用whitenoise,但不确定它为什么不起作用。这听起来很简单,所以我肯定这是件愚蠢的事 赫罗库 setup: addons: - plan: heroku-postgresql build: docker: web: Do

我从Dockerfile和Heroku.yml中得到了一个在Heroku上运行的项目

该网站通常工作,但我有静态文件的问题

collectstatic
在构建包时运行

如果我将
DEBUG
设置为True,它将查找文件

我正在尝试使用whitenoise,但不确定它为什么不起作用。这听起来很简单,所以我肯定这是件愚蠢的事

赫罗库

setup:
    addons:
        - plan: heroku-postgresql
build:
    docker:
        web: Dockerfile
release:
    image: web
    command:
        - python manage.py collectstatic --noinput
run:
    web: gunicorn records_project.wsgi
设置.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',
]
url.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
build:
  docker:
    web: Dockerfile
run:
  web: ./heroku_entrypoint.sh
Dockerfile

FROM python:3.7

WORKDIR /usr/src/app

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

RUN apt-get update
RUN apt install -y netcat

RUN pip install pipenv
COPY Pipfile* /usr/src/app/
RUN pipenv install --system --dev

COPY . /usr/src/app/

RUN mkdir -p /storage/static/
--- some code ---

RUN chmod +x heroku_entrypoint.sh
RUN mkdir -p /app/static/

--- other code ---
entrypoint\u heroku.sh

#!/bin/sh
python manage.py migrate --noinput
python manage.py collectstatic --noinput
gunicorn app.wsgi
python manage.py collectstatic --noinput
python manage.py migrate
gunicorn app.wsgi:application --bind 0.0.0.0:$PORT
设置.py

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

这不是最好的解决办法。但它帮助我用Debug=False运行服务器。因为它的价值,我从未找到一种方法让WhiteNoise为这些静态文件提供服务。我发誓,它在过去的类似设置中起到了作用,所以这仍然是一个谜


我从justdjango.com收到Matt的提示,Heroku不想从同一台服务器提供静态文件。一旦我将静态文件移到AWS S3存储桶中,一切都很好。

我也面临这个问题。虽然在发布阶段成功地收集了静态文件,但在dyno启动时它们并不存在(因此Django缺少清单错误)

此设置有效:

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
build:
  docker:
    web: Dockerfile
run:
  web: ./heroku_entrypoint.sh
Dockerfile

FROM python:3.7

WORKDIR /usr/src/app

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

RUN apt-get update
RUN apt install -y netcat

RUN pip install pipenv
COPY Pipfile* /usr/src/app/
RUN pipenv install --system --dev

COPY . /usr/src/app/

RUN mkdir -p /storage/static/
--- some code ---

RUN chmod +x heroku_entrypoint.sh
RUN mkdir -p /app/static/

--- other code ---
heroku\u entrypoint.sh

#!/bin/sh
python manage.py migrate --noinput
python manage.py collectstatic --noinput
gunicorn app.wsgi
python manage.py collectstatic --noinput
python manage.py migrate
gunicorn app.wsgi:application --bind 0.0.0.0:$PORT

谢谢你的回复。我不认为是这样,但也许我错了。下面是我通过一个例子所知道的:这两个都在我的
<代码>第一个加载良好。第二个在控制台中显示错误:
拒绝应用来自的样式'https://subdomain.domain.com/static/css/base.css'因为它的MIME类型('text/html')不是受支持的样式表MIME类型,并且启用了严格的MIME检查。
很抱歉,直接回答:我有这些文件,它无法在管理员中加载样式表。
/static/css/base.css
可能是问题所在。尝试在模板中使用
{%static'css/base.css%}
。您还需要在模板顶部包含
{%load static%}
。很抱歉造成混淆:我已经在模板顶部使用
{%load static%}
,并使用
{%static'css/base.css%}
呈现指向该css文件的链接
/static/css/base.css
是模板在浏览器中呈现的内容。我看到您的
STATICFILES\u存储已被注释掉。我想你需要这个。我也犯了500个错误。丢失或错误引用静态文件将导致500错误。如果不是那样,我不知道会是什么。祝你好运谢谢你的提示。有机会的话我会试试的。奇怪。即使使用chmod命令,当它试图运行
entrypoint\u heroku.sh
时,我也收到了一个权限拒绝错误。