【问题标题】:How to serve django static files on heroku with gunicorn如何使用 gunicorn 在 heroku 上提供 django 静态文件
【发布时间】:2013-07-03 04:32:49
【问题描述】:

我在 Django 中有一个应用程序,我将它部署在 heroku 上,但我无法在服务器上提供静态文件,下面是我的代码和设置:

settings.py

DEBUG = True
TEMPLATE_DEBUG = DEBUG
import os
PROJECT_PATH = os.path.abspath(os.path.dirname(__file__))
SITE_PATH = os.path.abspath(os.path.join(PROJECT_PATH, os.path.pardir))

STATIC_ROOT = ''
STATIC_URL = '/static/'
STATICFILES_DIRS = (
    os.path.join(SITE_PATH, 'staticfiles'),)
STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
#    'django.contrib.staticfiles.finders.DefaultStorageFinder',
)

urls.py

from django.conf import settings
from django.conf.urls import patterns, include, url
from polls.views import VoteClassBasedView
from django.contrib import admin
admin.autodiscover()


urlpatterns = patterns('',
    url(r'^polls/', include('polls.urls')),
    url(r'^admin/', include(admin.site.urls)),
)

过程文件

web: gunicorn django_polls.wsgi

我的本​​地目录结构

drwxrwxr-x 2 user1 user1  4096 Jul  5 11:48 django_polls/
-rwxr-xr-x 1 user1 user1   255 Jun 22 15:50 manage.py*
drwxrwxr-x 5 user1 user1  4096 Jul  3 14:41 polls/
-rw-r--r-- 1 user1 user1 50176 Jul  5 11:41 polls.db
-rw-rw-r-- 1 user1 user1    32 Jul  4 18:57 Procfile
-rw-rw-r-- 1 user1 user1   338 Jun 25 18:51 README.md
-rw-rw-r-- 1 user1 user1   310 Jul  4 17:09 requirements.txt
drwxrwxr-x 5 user1 user1  4096 Jul  4 17:57 staticfiles/
                                                         /bootstrap
                                                         /admin
                                                         /polls 
drwxrwxrwx 3 user1 user1  4096 Jun 22 18:59 templates/

Heroku 文件结构

drwx------ 2 u19068 19068 4096 2013-07-05 11:31 django_polls/
-rwx------ 1 u19068 19068  255 2013-07-05 11:28 manage.py*
drwx------ 5 u19068 19068 4096 2013-07-05 11:31 polls/
-rw------- 1 u19068 19068   32 2013-07-05 11:28 Procfile
-rw------- 1 u19068 19068  338 2013-07-05 11:28 README.md
-rw------- 1 u19068 19068  310 2013-07-05 11:28 requirements.txt
-rw------- 1 u19068 19068   13 2013-07-05 11:28 runtime.txt
drwx------ 5 u19068 19068 4096 2013-07-05 11:28 staticfiles/
                                                          /bootstrap
                                                          /admin
                                                          /polls 
drwx------ 3 u19068 19068 4096 2013-07-05 11:28 templates/

上面的代码能够在本地机器上提供 css 文件(实际上我与 bootstrap 集成),但是在将它提交到 heroku git hub 并运行类似 polls.herokuapp.com/polls/ 的 url 之后,它正在提供 html 文件和完整的功能,但无法提供 css 文件。

此外,当我运行命令 foreman start 时,它也提供静态(css,js)文件,但部署在 heroku 上的相同代码无法提供静态文件。

谁能告诉我需要对哪些文件进行哪些更改才能在heroku上部署Django应用?

注意,我已经进行了研发并应用了各种代码,例如在urls.py 中使用from django.contrib.staticfiles.urls import staticfiles_urlpatterns,但无法得到解决方案。

【问题讨论】:

    标签: python django heroku django-staticfiles


    【解决方案1】:

    在部署您的应用时,首先在您的设置文件中更改DEBUG=FALSE

    以下链接可能很有用。

    https://devcenter.heroku.com/articles/django#deploy-to-heroku

    【讨论】:

    • 如果我这样做显示“内部服务器错误”,我也已经使用上面的链接在 heroku 上部署了应用程序
    【解决方案2】:

    为了提供静态文件,我强烈建议您使用 whitenoise http://whitenoise.evans.io/en/stable/django.html

    STATIC_ROOT = os.path.join(PROJECT_PATH, 'staticfiles')
    STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
    MIDDLEWARE_CLASSES = [
      # 'django.middleware.security.SecurityMiddleware',
      'whitenoise.middleware.WhiteNoiseMiddleware',
      # ...
    ]
    

    无需运行collectstatic,因为 heroku 会为您执行此操作。这样做的目的是将所有文件放入 STATIC_ROOT 中(所有文件均已压缩,并带有长时间过期的散列文件名)。

    【讨论】:

      猜你喜欢
      • 2012-09-29
      • 2013-06-27
      • 2012-12-03
      • 2019-02-13
      • 2021-07-18
      • 2015-11-30
      • 2012-07-20
      • 2013-09-04
      • 2023-03-05
      相关资源
      最近更新 更多