Django使用runserver提供静态文件,但不提供foreman

mba*_*tas 7 django heroku foreman

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

当服务器启动时,我的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
Run Code Online (Sandbox Code Playgroud)

Procfile(如Djokuo on Heroku入门教程中所述):

web: gunicorn project.wsgi
Run Code Online (Sandbox Code Playgroud)

settings.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',
)
Run Code Online (Sandbox Code Playgroud)

就像我说的,所有这些都可以runserver在我的本地机器上正常工作,但不能正常工作foreman start.

如果要求,将发布更多信息.

Chr*_*ott 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中).

以下是一组示例步骤(用于whitenoise):

跑:

pip install whitenoise
Run Code Online (Sandbox Code Playgroud)

将wsgi.py修改为如下所示:

from django.core.wsgi import get_wsgi_application
from whitenoise.django import DjangoWhiteNoise

application = DjangoWhiteNoise(get_wsgi_application())
Run Code Online (Sandbox Code Playgroud)

然后静态文件将工作:

# Run collectstatic before foreman whenever you've changed static files
python manage.py collectstatic
foreman start
Run Code Online (Sandbox Code Playgroud)

Foreman需要比runserver更多的努力.但是,工头可以非常模仿生产环境,而runserver则不会(希望它不会).在许多情况下,在生产中使用dj-static或whitenoise是一个不错的选择.因此,使用带有dj-static或whitenoise的工头开发将让您放心,当您的网站进入生产阶段时,主要问题不会让您感到惊讶.你没有从其他一些选项中得到这种保证(例如将'django.views.static.serve'添加到urls.py).


and*_*oot 4

这有点像黑客,但我通过将此路由添加到网址来使其工作:

# serve static
(r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.STATIC_ROOT}),
Run Code Online (Sandbox Code Playgroud)