我遇到了与 this question 中描述的问题相反的问题.
当使用 manage.py runserver
启动服务器时,我的 Django 站点可以正常工作,但当使用 foreman start
启动服务器时,不会提供静态文件。
我的目录结构:
project_name/
project/
settings.py
...
app/
...
venv/
...
public/
static/
# static files go here #
media/
...
Procfile
requirements.txt
manage.py
Procfile(如 Getting Started with Django on Heroku 教程中所述):
web: gunicorn project.wsgi
设置.py:
import os
SITE_ROOT = os.path.dirname(os.path.realpath(__file__))
UP_ROOT = os.path.abspath(os.path.join(SITE_ROOT, '..'))
...
MEDIA_ROOT = UP_ROOT + '/public/media/'
...
STATIC_ROOT = UP_ROOT + '/public/static'
...
STATIC_URL = '/static/'
...
STATICFILES_DIRS = (
UP_ROOT + '/public',
UP_ROOT + '/public/static',
)
就像我说的,所有这些都可以在我的本地计算机上的 runserver
上正常工作,但不能在 foreman start
上正常工作。
如果需要,将发布更多信息。
最佳答案
runserver 和 foreman 的区别:
Django 的 runserver 命令提供静态文件,因为 django.contrib.staticfiles 会自动为您搜索项目的静态文件夹(前提是满足一些先决条件 here )并根据静态请求返回它们。
然而,Foreman 是一个独立于 Django 的实用程序,对 Django 的内部结构一无所知。因此,您需要一些额外的帮助。两个不错的选择是 dj-static或whitenoise 。两者都可以使用 pip 安装。您需要对 wsgi.py 文件进行一些小修改,如您选择的设置说明中所述(请参阅链接)。
dj-static 和whitenoise 都会在settings.py 文件中的STATIC_ROOT 中查找静态文件。这与 Django 的 runserver 不同,后者会自动遍历项目中的各种静态文件夹。这意味着您需要运行manage.pycollectstatic(它将静态文件收集到STATIC_ROOT中),然后dj-static或whitenoise才能找到它们。
以下是一组示例步骤(针对白噪声):
运行:
pip install whitenoise
修改 wsgi.py 如下所示:
from django.core.wsgi import get_wsgi_application
from whitenoise.django import DjangoWhiteNoise
application = DjangoWhiteNoise(get_wsgi_application())
然后静态文件就可以工作了:
# Run collectstatic before foreman whenever you've changed static files
python manage.py collectstatic
foreman start
Foreman 比 runserver 需要更多的努力。然而,foreman 可以非常接近地模拟生产环境,而 runserver 则不能(希望它不会)。在许多情况下,在制作中使用 dj-static 或白噪声是一个不错的选择。因此,使用带有 dj-static 或白噪声的 foreman 进行开发可以让您放心,当您的站点投入生产时,重大问题不会让您感到惊讶。您无法从其他一些选项中获得这种保证(例如,将“django.views.static.serve”添加到 urls.py)。
关于Django 使用 runserver 提供静态文件,但不使用 foreman,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16170030/