7

我有与这个问题中描述的问题相反的问题

我的 Django 站点在服务器启动时正常工作,manage.py runserver但在服务器启动时不提供静态文件foreman start

我的目录结构:

project_name/
  project/
    settings.py
    ...
  app/
    ...
  venv/
    ...
  public/
    static/
      # static files go here #
    media/
      ...
  Procfile
  requirements.txt
  manage.py

Procfile(如Heroku 上的 Django 入门教程中所述):

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.

如果需要,将发布更多信息。

4

2 回答 2

7

runserver 和 foreman 的区别:

Django 的 runserver 命令提供静态文件,因为 django.contrib.staticfiles 会自动为您搜索项目的静态文件夹(假设这里有一些先决条件)并在静态请求时返回它们。

然而,Foreman 是一个独立于 Django 的实用程序,并且对 Django 的内部结构一无所知。所以,你需要一些额外的帮助。两个不错的选择是dj-staticwhitenoise。两者都可以使用 pip 安装。您将需要对您的 wsgi.py 文件进行少量修改,如您选择的设置说明中所述(请参阅链接)。

dj-static 和 whitenoise 都在您的 settings.py 文件中的 STATIC_ROOT 中查找静态文件。这与 Django 的 runserver 不同,后者会自动遍历项目中的各种静态文件夹。这意味着您需要在 dj-static 或 whitenoise 找到它们之前运行 manage.py collectstatic(它将您的静态文件收集到 STATIC_ROOT)。

这是一组示例步骤(用于白噪声):

跑:

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 或 whitenoise 是一个不错的选择。因此,使用带有 dj-static 或 whitenoise 的工头进行开发可以让您放心,当您的网站投入生产时,重大问题不会让您感到惊讶。您无法从其他一些选项中得到保证(例如,将 'django.views.static.serve' 添加到 urls.py)。

于 2015-01-02T16:17:25.317 回答
4

这有点小技巧,但我通过将这条路由添加到 url 来让它工作:

# serve static
(r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.STATIC_ROOT}),
于 2013-04-28T10:10:51.697 回答