2014-01-15 141 views
14

我用「git push heroku master」部署了一個django應用到heroku,它工作得很好。heroku上的Django靜態文件

我然後使用「的Heroku創建第二應用內-r分期」

創建的第二應用程序在相同的GIT中,並使用推:GIT中推分期主

當我打開第二應用內,沒有靜態文件被拾起或裝載(即沒有CSS,JS,或圖像工作)

這是非常令人困惑 - !請幫助

我的設置文件低於

import os 
import platform 
import dj_database_url 

DEBUG = True 
TEMPLATE_DEBUG = DEBUG 

# This should work for any deployment 
BASE_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) 

ADMINS = (
    ('me', '[email protected]'), 
) 

MANAGERS = ADMINS 
# LOCAL SETTINGS 
if platform.system() in ['Windows', 'Darwin']: 
    #EV = 'LOCAL' 
    DATABASES = { 
      'default': { 
       'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'. 
       'NAME': BASE_DIR + '//db//db.sqlite3', 
       'USER': '',      # Not used with sqlite3. 
       'PASSWORD': '',     # Not used with sqlite3. 
       'HOST': '',      # Set to empty string for localhost. Not used with sqlite3. 
       'PORT': '',      # Set to empty string for default. Not used with sqlite3. 
      } 
    } 
    # Hosts/domain names that are valid for this site; required if DEBUG is False 
    # See https://docs.djangoproject.com/en/1.4/ref/settings/#allowed-hosts 
    ALLOWED_HOSTS = [] 

    CACHES = { 
    'default': { 
     'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', 
     'LOCATION': 'unique-snowflake', 
     'TIMEOUT': 86400, 
     'OPTIONS': { 
      'MAX_ENTRIES': 10000 
      }, 
     } 
    } 

# HEROKU SETTINGS 
else: 
    #EV = 'HEROKU' 
    # DEBUG = False 
    DATABASES = {} 
    DATABASES['default'] = dj_database_url.config() 

    # Honor the 'X-Forwarded-Proto' header for request.is_secure() 
    SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') 

    # Hosts/domain names that are valid for this site; required if DEBUG is False 
    # See https://docs.djangoproject.com/en/1.4/ref/settings/#allowed-hosts 
    # Allow all host headers 
    ALLOWED_HOSTS = ['*'] 

    # Todo: ammar - update to Memcached 
    CACHES = { 
    'default': { 
     'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', 
     'LOCATION': 'unique-snowflake', 
     'TIMEOUT': 86400, 
     'OPTIONS': {'MAX_ENTRIES': 10000}, 
     } 
    } 

TIME_ZONE = 'Europe/London' 

LANGUAGE_CODE = 'en-gb' 

SITE_ID = 1 

USE_I18N = True 

USE_L10N = True 

USE_TZ = False 

MEDIA_ROOT = '' 

MEDIA_URL = '/media/' 

STATIC_ROOT = '' 

STATIC_URL = '/static/' 


STATICFILES_DIRS =() 

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder', 
    'django.contrib.staticfiles.finders.AppDirectoriesFinder', 
) 


SECRET_KEY = '***' 

TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader', 
    'django.template.loaders.app_directories.Loader', 
#  'django.template.loaders.eggs.Loader', 

) 

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    # Uncomment the next line for simple clickjacking protection: 
    # 'django.middleware.clickjacking.XFrameOptionsMiddleware', 
) 

ROOT_URLCONF = 'sm.urls' 

# Python dotted path to the WSGI application used by Django's runserver. 
WSGI_APPLICATION = 'sm.wsgi.application' 

TEMPLATE_DIRS = (
    os.path.join(BASE_DIR, 'mytemplates') 
) 

INSTALLED_APPS = (
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.sites', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
    # Uncomment the next line to enable the admin: 
    'django.contrib.admin', 
    # Uncomment the next line to enable admin documentation: 
    'django.contrib.admindocs', 
    'smcore', 
    'south', 
    'django.contrib.humanize', 
) 



LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': False, 
    'filters': { 
     'require_debug_false': { 
      '()': 'django.utils.log.RequireDebugFalse' 
     } 
    }, 
    'handlers': { 
     'mail_admins': { 
      'level': 'ERROR', 
      'filters': ['require_debug_false'], 
      'class': 'django.utils.log.AdminEmailHandler' 
     } 
    }, 
    'loggers': { 
     'django.request': { 
      'handlers': ['mail_admins'], 
      'level': 'ERROR', 
      'propagate': True, 
     }, 
    } 
} 

LOGIN_URL = '/login/' 
LOGIN_REDIRECT_URL = '/getStarted/' 
LOGOUT_URL = '/do_logout/' 

# e-mail server 
EMAIL_HOST_USER = '***@gmail.com' 
EMAIL_HOST= 'smtp.gmail.com' 
# EMAIL_PORT = 465 
EMAIL_USE_TLS = True 
EMAIL_HOST_PASSWORD = '***' 
DEFAULT_FROM_EMAIL = '***@gmail.com' 
SERVER_EMAIL = '***@gmail.com' 

更新

我把代碼的副本,並重新部署,這與以下更新工作將設置:

STATIC_ROOT = 'staticfiles' 

STATIC_URL = '/static/' 

STATICFILES_DIRS = (
    (os.path.join(BASE_DIR,'smcore','static')), 
) 


STATICFILES_FINDERS = (

    #'django.contrib.staticfiles.finders.FileSystemFinder', 
    #'django.contrib.staticfiles.finders.AppDirectoriesFinder', 
    #'django.contrib.staticfiles.finders.DefaultStorageFinder', 
) 

我再支我的代碼(所以我有師傅和分期)並將新的heroku遙控器同步到我的舞臺分支中。然後我做了一個git push staging:master並完成了一個完整的上傳;這再次讓我回到了同一個地方......幫助!

+0

我也有與第二個應用程序相同的問題。當我刪除第一個並重新提交時,問題就解決了。 –

回答

17

最終解決了這個使用下面我的網址文件 - 從這樣一個問題:Heroku - Handling static files in Django app

from <app> import settings 
urlpatterns += patterns('', 
     (r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.STATIC_ROOT}), 
    ) 
+2

感謝它爲我工作。 –

+0

請注意''patterns'現在已經從Django中移除了,因此您應該只需將其他路由追加到您的現有列表中就可以解決這個問題:https://stackoverflow.com/questions/8074955/cannot-import-name-patterns –

3

看起來,這是因爲您正在使用staticfiles應用程序而未設置STATIC_ROOT設置。

相比較而言,我的settings.py是一樣的東西:

# Static asset configuration 
BASE_DIR = os.path.dirname(os.path.abspath(__file__)) 
STATIC_ROOT = 'staticfiles' 
STATIC_URL = '/static/' 
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, '../myapp/static') 

應設置STATICFILES_DIRS太(注意,我這個變種的conf可能不是比你的一樣)

然後,推送您的代碼並重試。 如果仍不能正常工作,你可以用它來調試: https://devcenter.heroku.com/articles/django-assets#debugging

+0

但是,完全相同的設置文件適用於舊的應用程序 - 我只是不明白爲什麼會有區別? –

+0

很難說,但是當可能的時候,我更喜歡明確的事情,而不是「它的工作原理,但我不知道爲什麼」......在發生奇怪的行爲之後,我決定設置所有變量來防止這種事情發生。當你使用PaaS時,你不能確定它在服務器端做了什麼,所以你應該仔細遵循指導。在Heroku Django指南示例中,設置了STATIC_ROOT和STATICFILES_DIRS變量。你應該嘗試遵循這一點。 –

+0

我嘗試了你的建議,並在標準heroku推送輸出中獲得了這一點 - 但沒有任何區別: ----->收集靜態文件 複製了245個靜態文件。 –

1

由於Django的1.3你」已經能夠做到以下幾點

# only showing relevant imports 
from django.conf import settings 
from django.conf.urls.static import static 


urlpatterns = patterns(
    '', 

    # your urls go here 
) 

if settings.DEBUG: 
    urlpatterns += static(settings.STATIC_URL, 
          document_root=settings.STATIC_ROOT) 
    urlpatterns += static(settings.MEDIA_URL, 
          document_root=settings.MEDIA_ROOT) 
6

我也一直在處理同樣的問題。我嘗試不使用David推薦的解決方案,因爲它似乎只用於開發(而不是生產)(請參閱:Heroku static files not loading, Django

以下是我在代碼中更改的兩件事情。

(我使用Django 1.7)

1)的settings.py

我這行添加到設置文件

BASE_DIR = os.path.dirname(os.path.dirname(__file__)) 
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') 
STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage' 
TEMPLATE_DIRS = (
    os.path.join(BASE_DIR, 'templates'), 
    # Add to this list all the locations containing your static files 
) 

STATIC_ROOT:這個告訴Django在哪裏(一)在運行「python管理」時放置靜態文件。PY collectstatic」和(b)找到靜態文件,當您運行應用程序

TEMPLATE_DIRS:這個告訴Django去哪裏尋找你的靜態文件時,搜索文件靜態當您運行‘蟒蛇manage.py collectstatic’

2)wsgi.py

本來我的文件是:

import os 
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "xxxx.settings") 

from django.core.wsgi import get_wsgi_application 
application = get_wsgi_application() 

我把它改爲:

import os 
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "xxxx.settings") 

from django.core.wsgi import get_wsgi_application 
from whitenoise.django import DjangoWhiteNoise 
application = get_wsgi_application() 
application = DjangoWhiteNoise(application) 

這裏閱讀更多信息,白噪聲:https://devcenter.heroku.com/articles/django-assets#whitenoise


而且,記住安裝白噪聲: PIP安裝白噪聲== 2.0.6

部署項目之前,運行: 蟒蛇管理。 py collectstatic

這將創建一個由STATIC_ROOT指示的文件夾(在settings.py中聲明),包含所有靜態文件。