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

标签 django heroku foreman

我遇到了与 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-staticwhitenoise 。两者都可以使用 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/

相关文章:

django - Models.DateField 格式问题

ruby-on-rails - 多个 worker 的 Rails DB Performance

ruby-on-rails-4 - 使用 foreman 时重新加载 Rails 代码

windows - "No Processes Defined"来自工头检查一个简单的 node.js Procfile

python - Django 在标题之前结束脚本输出

django - django的auth_user.username可以是varchar(75)吗?那怎么可能呢?

python - Django 。 get_profile() 不起作用

django - Heroku 不想将我的 Django 模型引用到 View

ruby-on-rails - 通过 bundle 在 heroku 上安装本地 gem 不起作用

ruby-on-rails - 工头开发与生产( rails )