【问题标题】:Django serves static files with runserver but not with foremanDjango 使用 runserver 提供静态文件,但不使用 foreman
【发布时间】:2013-04-16 16:59:21
【问题描述】:

我遇到了与this question 中描述的问题相反的问题。

我的 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(如Getting Started with Django on Heroku 教程中所述):

web: gunicorn project.wsgi

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',
)

就像我说的,所有这些都可以在我的本地计算机上正常使用 runserver,但不适用于 foreman start

如有要求,将发布更多信息。

【问题讨论】:

    标签: django heroku foreman


    【解决方案1】:

    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 不同,后者会自动遍历项目中的各种静态文件夹。这意味着您需要在 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)。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 这很有效,而且很棒,但是没有更清洁的方法吗?我不记得必须像这样使用 urls.py 破解 settings.py。谁有替代品?
      • 这对大多数人来说可能是显而易见的,但作为一个 python 新手,我在发现我还需要在文件顶部添加“导入设置”之前绊了一下。
      猜你喜欢
      • 2016-10-13
      • 2013-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-18
      • 1970-01-01
      • 2020-01-29
      • 2013-06-27
      相关资源
      最近更新 更多