2014-01-15 88 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中声明),包含所有静态文件。