2017-04-13 3 views
0

Ich versuche Heroku's documentation zu verwenden statische Dateien auf meinem lokalen Rechner und in der Produktion dienen. Wie auch immer, wenn ich meine App mit debug=True starte, funktioniert alles wie erwartet; Statische Dateien werden abgerufen und die App wird wie beabsichtigt angezeigt. Jedoch, wenn ich debug=False ändere, bekomme ich eine Server Error (500). Soweit ich das beurteilen kann, läuft alles auf meine STATICFILE_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage' hinaus. Wenn ich dies kommentiere, läuft meine App mit debug=False, aber ohne Styling aufgrund des Mangels an statischen Dateien. Ich bin durch die whitenoise documentation und heroku's gegangen, aber ich kann nicht herausfinden, was los ist, abgesehen von STATICFILE_STORAGE ist das Problem. Ist Whitenoise nicht für die Produktion gedacht? Muss ich ein CDN in der Produktion verwenden? Es ist eine kleine Zeit-App, also habe ich gehofft, dass ich CDN nicht benutzen muss, aber wenn nötig.Django statische Dateien mit Whitenoise auf Heroku

settings.py (I enthalten nur die Teile, die ich settings.py relevant gedacht waren. Wenn Sie das Ganze benötigen, lassen Sie es mich wissen.)

import os 


# Build paths inside the project like this: os.path.join(BASE_DIR, ...) 
BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) 
PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) 

# SECURITY WARNING: don't run with debug turned on in production! 
DEBUG = False 

MIDDLEWARE = [ 
    'django_hosts.middleware.HostsRequestMiddleware', 
    'django.middleware.security.SecurityMiddleware', 
    'whitenoise.middleware.WhiteNoiseMiddleware', 
    ....... 

# Static files (CSS, JavaScript, Images) 
# https://docs.djangoproject.com/en/1.9/howto/static-files/ 
STATIC_ROOT = os.path.join(PROJECT_ROOT, 'staticfiles') 
STATIC_URL = '/static/' 

# Extra places for collectstatic to find static files. 
STATICFILES_DIRS = (
    os.path.join(PROJECT_ROOT, 'static'), 
) 

# Simplified static file serving. 
# https://warehouse.python.org/project/whitenoise/ 

STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage' 

wsgi.py

import os 

from django.core.wsgi import get_wsgi_application 
from whitenoise.django import DjangoWhiteNoise 

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "MySite.settings") 

application = get_wsgi_application() 
application = DjangoWhiteNoise(application) 

logs

2017-04-14T08:40:06.800390+00:00 heroku[router]: at=info method=GET path="/" host=wgsite.herokuapp.com request_id=6bf564f7-efba-42fb-b8b1-970a02a5283a fwd="5.51.58.217" dyno=web.1 connect=0ms service=11ms status=302 bytes=223 protocol=https 
2017-04-14T08:40:06.997956+00:00 heroku[router]: at=info method=GET path="/login" host=wgsite.herokuapp.com request_id=4ce4486e-7e06-4fcd-a562-88ec3ffd8fa9 fwd="5.51.58.217" dyno=web.1 connect=0ms service=6ms status=302 bytes=243 protocol=https 

Vielen Dank im Voraus für Ihre Hilfe!

UPDATE:

So stellt sich heraus, dass ich heroku config:unset DISABLE_COLLECTSTATIC laufen mussten Heroku auf Auto collectstatic zu bekommen. Nun wirft seine mir diese Fehler:

remote: !  Error while running '$ python manage.py collectstatic --noinput'. 
remote:  See traceback above for details. 

Welche ungerade ist, da ich lokal Python manage.py collectstatic mit Erfolg laufen kann ...

UPDATE # 2

ich collectstatic lokal lief und Ein Verzeichnis mit dem Namen "staticfiles" wurde erstellt, wobei alle meine statischen Dateien von der App selbst organisiert wurden. Ich schob nach heroku und jetzt öffnet sich meine Seite mit allen statischen Dateien, die mit debug=False funktionieren. Ich kann Heroku immer noch nicht dazu bringen, statische Daten automatisch zu erfassen, ohne dass es zu Fehlern kommt.

+0

Was ist die vollständigen Fehler aus den Protokollen? –

+0

Wenn Sie Whitenoise verwenden brauchen Sie keine CDN, ich benutze es ständig für meine statischen Dateien auf Heroku. Haben Sie Fehlerprotokollinformationen? – dentemm

+0

Ich habe die Logs zur obigen Frage hinzugefügt. – grigs

Antwort

0

So stellt sich heraus, dass mein Einstellungsverzeichnis viel mit den Problemen zu tun hatte. In meinem Einstellungsverzeichnis habe ich eine lokale und eine Produktionseinstellungsdatei. Als Ergebnis musste ich meine BASE_DIR und meine PROJECT_ROOT Richt. Ich habe PROJECT_ROOT2 dir hinzugefügt, um heroku zu meinen lokalen statischen Dateien zu finden. Danach musste ich eine leere CSS-Datei in das benötigte settings/static-Verzeichnis stellen, da git keine leeren Verzeichnisse lesen kann. Nach all dem konnte ich endlich Collectstatic bekommen, um lokal und auf Heroku zu laufen. Hier ist meine aktualisiert settings.py:

import os 


# Build paths inside the project like this: os.path.join(BASE_DIR, ...) 
BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) 
PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) 
PROJECT_ROOT2 = os.path.dirname(os.path.abspath(__file__)) 

# Quick-start development settings - unsuitable for production 
# See https://docs.djangoproject.com/en/1.10/howto/deployment/checklist/ 

# SECURITY WARNING: don't run with debug turned on in production! 
DEBUG = False 

ALLOWED_HOSTS = ['www.site.co', 'site', 'wgsite.herokuapp.com'] 

# Application definition 

INSTALLED_APPS = [ 
    # Django Apps 
    'django.contrib.admin', 
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
    # Third Party Apps 
    'crispy_forms', 
    'django.contrib.humanize', 
    'django_hosts', 
    # My Apps 
    'argent', 
    'home', 
    'accounts', 

] 

MIDDLEWARE = [ 
    'django_hosts.middleware.HostsRequestMiddleware', 
    'django.middleware.security.SecurityMiddleware', 
    'whitenoise.middleware.WhiteNoiseMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.clickjacking.XFrameOptionsMiddleware', 
    'MySite.middleware.LoginRequiredMiddleware', 
    'django_hosts.middleware.HostsResponseMiddleware', 
] 

LOGIN_URL = '/login' 

LOGIN_EXEMPT_URLS = [ 
    '/logout', 
    '/register', 
] 

ROOT_URLCONF = 'MySite.urls' 
ROOT_HOSTCONF = 'MySite.hosts' 
DEFAULT_HOST = 'www' 
DEFAULT_REDIRECT_URL = 'http://www.site.co' 


TEMPLATES = [ 
    { 
     'BACKEND': 'django.template.backends.django.DjangoTemplates', 
     'DIRS': [os.path.join(BASE_DIR, 'templates')] 
     , 
     'APP_DIRS': True, 
     'OPTIONS': { 
      'context_processors': [ 
       'django.template.context_processors.debug', 
       'django.template.context_processors.request', 
       'django.contrib.auth.context_processors.auth', 
       'django.contrib.messages.context_processors.messages', 
      ], 
     }, 
    }, 
] 

WSGI_APPLICATION = 'MySite.wsgi.application' 

# Database 
# https://docs.djangoproject.com/en/1.10/ref/settings/#databases 

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.sqlite3', 
     'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 
    } 
} 

# Password validation 
# https://docs.djangoproject.com/en/1.10/ref/settings/#auth-password-validators 

AUTH_PASSWORD_VALIDATORS = [ 
    { 
     'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', 
    }, 
    { 
     'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 
    }, 
    { 
     'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', 
    }, 
    { 
     'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', 
    }, 
] 

# Internationalization 
# https://docs.djangoproject.com/en/1.10/topics/i18n/ 

LANGUAGE_CODE = 'en-us' 

TIME_ZONE = 'CET' 

USE_I18N = True 

USE_L10N = True 

USE_TZ = True 

CRISPY_TEMPLATE_PACK = 'bootstrap3' 


# Static files (CSS, JavaScript, Images) 
# https://docs.djangoproject.com/en/1.9/howto/static-files/ 
STATIC_ROOT = os.path.join(PROJECT_ROOT, 'staticfiles') 
STATIC_URL = '/static/' 

# Extra places for collectstatic to find static files. 
STATICFILES_DIRS = (
    os.path.join(PROJECT_ROOT2, 'static'), 
) 

# Simplified static file serving. 
# https://warehouse.python.org/project/whitenoise/ 

STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage' 
Verwandte Themen