disable_collectstatic - Django archivos estáticos en heroku
heroku config:set disable_collectstatic=1 (4)
Desplegué una aplicación django para heroku, usando "git push heroku master" que funcionó absolutamente bien.
Luego creé una segunda aplicación en el mismo git usando "heroku create second-app -r staging ''
y pulsado usando: git push staging master
cuando abro la segunda aplicación, ninguno de los archivos estáticos se selecciona o carga (es decir, no funciona css, js o imágenes)
Esto es extremadamente confuso - por favor ayuda!
mi archivo de configuración está abajo
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'', ''me@gmailcom''),
)
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''
Actualizar
Tomé una copia del código y la reubicé, que funcionó con las siguientes actualizaciones de la configuración:
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'',
)
Luego ramifiqué mi código (así que tengo maestría y puesta en escena) y sincronicé el nuevo control remoto de heroku en mi sucursal de estadificación. Luego hice una puesta en escena de git push: master e hizo una subida completa; lo que una vez más me hizo volver al mismo lugar ... ¡ayuda!
Desde Django 1.3 has podido hacer lo siguiente
# 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)
Finalmente, resolví esto usando lo siguiente en mi archivo urls - de esta pregunta: Heroku - Manejo de archivos estáticos en la aplicación Django
from <app> import settings
urlpatterns += patterns('''',
(r''^static/(?P<path>.*)$'', ''django.views.static.serve'', {''document_root'': settings.STATIC_ROOT}),
)
Parece que es porque estás usando la aplicación staticfiles sin haber establecido la configuración STATIC_ROOT.
En comparación, mi settings.py es algo como:
# 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'')
También debe establecer STATICFILES_DIRS (tenga en cuenta que mi conf para esta var es probablemente no igual a la suya)
Luego, presione su código y vuelva a intentarlo. Si aún no funciona, puede usar esto para depurar: https://devcenter.heroku.com/articles/django-assets#debugging
También he estado lidiando con el mismo problema. Intenté no usar la solución recomendada por David, ya que parece que solo se usa en desarrollo (y no en producción) (ver: archivos estáticos de Heroku que no se cargan, Django )
Y aquí están las 2 cosas que cambié en mi código.
(Estoy usando Django 1.7)
1) settings.py
Añado estas líneas a los archivos de configuración.
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: esto le dice a Django dónde (a) colocar los archivos estáticos cuando ejecutas "python manage.py collectstatic" y (b) encontrar los archivos estáticos cuando ejecutas la aplicación
TEMPLATE_DIRS: esto le dice a Django dónde buscar tus archivos estáticos cuando busca archivos estáticos cuando ejecutas "python manage.py collectstatic"
2) wsgi.py
Originalmente mi archivo era:
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "xxxx.settings")
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
Y lo cambié a:
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)
Lea aquí para obtener más información sobre whitenoise: https://devcenter.heroku.com/articles/django-assets#whitenoise
Además, recuerde instalar whitenoise: pip install whitenoise == 2.0.6
Antes de implementar el proyecto, ejecute: python manage.py collectstatic
Esto creará una carpeta indicada por STATIC_ROOT (declarada en su configuración.py), que contiene todos sus archivos estáticos.