J'essaie de déployer une application Django sur Heroku. Elle commence à compiler, à télécharger et à tout installer, mais c'est ce que j'ai pour la collecte de fichiers statiques
$ python manage.py collectstatic --noinput
remote: Traceback (most recent call last):
remote: File "manage.py", line 10, in <module>
remote: execute_from_command_line(sys.argv)
remote: File "/app/.heroku/python/lib/python2.7/site-packages/Django/core/management/__init__.py", line 338, in execute_from_command_line
remote: utility.execute()
remote: File "/app/.heroku/python/lib/python2.7/site-packages/Django/core/management/__init__.py", line 330, in execute
remote: self.fetch_command(subcommand).run_from_argv(self.argv)
remote: File "/app/.heroku/python/lib/python2.7/site-packages/Django/core/management/base.py", line 390, in run_from_argv
remote: self.execute(*args, **cmd_options)
remote: File "/app/.heroku/python/lib/python2.7/site-packages/Django/core/management/base.py", line 441, in execute
remote: output = self.handle(*args, **options)
remote: File "/app/.heroku/python/lib/python2.7/site-packages/Django/contrib/staticfiles/management/commands/collectstatic.py", line 168, in handle
remote: collected = self.collect()
remote: File "/app/.heroku/python/lib/python2.7/site-packages/Django/contrib/staticfiles/management/commands/collectstatic.py", line 98, in collect
remote: for path, storage in Finder.list(self.ignore_patterns):
remote: File "/app/.heroku/python/lib/python2.7/site-packages/Django/contrib/staticfiles/finders.py", line 112, in list
remote: for path in utils.get_files(storage, ignore_patterns):
remote: File "/app/.heroku/python/lib/python2.7/site-packages/Django/contrib/staticfiles/utils.py", line 28, in get_files
remote: directories, files = storage.listdir(location)
remote: File "/app/.heroku/python/lib/python2.7/site-packages/Django/core/files/storage.py", line 300, in listdir
remote: for entry in os.listdir(path):
remote: OSError: [Errno 2] No such file or directory: '/app/blogproject/static'
remote:
remote: ! Error while running '$ python manage.py collectstatic --noinput'.
remote: See traceback above for details.
remote:
remote: You may need to update application code to resolve this error.
remote: Or, you can disable collectstatic for this application:
remote:
remote: $ heroku config:set DISABLE_COLLECTSTATIC=1
remote:
remote: https://devcenter.heroku.com/articles/Django-assets
remote:
remote: ! Push rejected, failed to compile Python app
remote:
remote: Verifying deploy...
remote:
remote: ! Push rejected to pin-a-voyage.
Ceci est l'ensemble du fichier settings.py
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
import os
import dj_database_url
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.8/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '*********************'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
# Application definition
INSTALLED_APPS = (
'Django.contrib.admin',
'Django.contrib.auth',
'Django.contrib.contenttypes',
'Django.contrib.sessions',
'Django.contrib.messages',
'Django.contrib.staticfiles',
'blog',
'custom_user',
'Django_markdown',
'parsley',
)
#### AUTH ###
AUTH_USER_MODEL = 'custom_user.CustomUser'
AUTHENTICATION_BACKENDS = (
'custom_user.backends.CustomUserAuth',
'Django.contrib.auth.backends.ModelBackend',
# 'Django.contrib.auth.backends.RemoteUserBackend',
)
#############
#### EMAIL ###
EMAIL_USE_TLS = True
EMAIL_BACKEND = 'Django.core.mail.backends.smtp.EmailBackend'
EMAIL_Host = 'smtp.gmail.com'
EMAIL_Host_PASSWORD = '***' #my gmail password
EMAIL_Host_USER = '[email protected]' #my gmail username
DEFAULT_FROM_EMAIL = '[email protected]'
SERVER_EMAIL = '[email protected]'
EMAIL_PORT = 587
DEFAULT_FROM_EMAIL = EMAIL_Host_USER
##############
MIDDLEWARE_CLASSES = (
'Django.contrib.sessions.middleware.SessionMiddleware',
'Django.middleware.common.CommonMiddleware',
'Django.middleware.csrf.CsrfViewMiddleware',
'Django.contrib.auth.middleware.AuthenticationMiddleware',
'Django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'Django.contrib.messages.middleware.MessageMiddleware',
'Django.middleware.clickjacking.XFrameOptionsMiddleware',
'Django.middleware.security.SecurityMiddleware',
)
ROOT_URLCONF = 'blogproject.urls'
TEMPLATES = [
{
'BACKEND': 'Django.template.backends.Django.DjangoTemplates',
'DIRS': [],
'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 = 'blogproject.wsgi.application'
# Database
# https://docs.djangoproject.com/en/1.8/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'Django.db.backends.postgresql_psycopg2',
'NAME': 'blogproject',
'USER': '***',
'PASSWORD': '***',
'Host': 'localhost',
'PORT': '',
}
}
# Internationalization
# https://docs.djangoproject.com/en/1.8/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Update database configuration with $DATABASE_URL.
db_from_env = dj_database_url.config(conn_max_age=500)
DATABASES['default'].update(db_from_env)
# Honor the 'X-Forwarded-Proto' header for request.is_secure()
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
# Allow all Host headers
ALLOWED_HOSTS = ['*']
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.8/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'
C'est la structure du projet
blog-project -- blog -- migrations
-- static
-- templates
-- blogproject
-- blogprojectenv
-- custom_user
-- media
-- .git
Des pensées?
Je viens de mettre à jour la version 1.10 de Django aujourd’hui et j’ai eu exactement le même problème… .. Vos paramètres statiques sont identiques aux miens.
Cela a fonctionné pour moi, lancez les commandes suivantes:
désactiver le collectstatic lors d'un déploiement
heroku config:set DISABLE_COLLECTSTATIC=1
déployer
git Push heroku master
exécuter les migrations (Django 1.10 ajouté au moins un)
heroku run python manage.py migrate
exécuter collectstatic en utilisant bower
heroku run 'bower install --config.interactive=false;grunt prep;python manage.py collectstatic --noinput'
activer collecstatic pour les futurs déploiements
heroku config:unset DISABLE_COLLECTSTATIC
essayez vous-même (facultatif)
heroku run python manage.py collectstatic
les futurs déploiements devraient fonctionner normalement à partir de maintenant
STATICFILES_DIRS
est configuré pour attendre un répertoire static
dans le même répertoire que votre fichier settings.py
; assurez-vous qu'il ne se trouve pas ailleurs.
De plus, avez-vous des fichiers dans ce répertoire static
? Si vous ne le faites pas, git ne le suivra pas et, bien qu'il existe localement, il n'existera pas dans git. La solution habituelle consiste à créer un fichier vide appelé .keep
dans le répertoire, ce qui permettra à git de le suivre. Mais une fois que vous aurez quelques fichiers statiques dans ce répertoire, ce ne sera plus un problème.
Exécutez python manage.py collectstatic
localement et corrigez les erreurs éventuelles. Dans mon cas, des erreurs de référence ont empêché l'exécution de cette commande.
Il me semble que la création de ce dossier blogproject/static
pose des problèmes. Je vois que votre application de blog contient un dossier statique, mais il devrait être de niveau supérieur dans votre dossier blogproject.
Essayez de créer un dossier static
dans votre dossier blogproject
et cette erreur devrait disparaître.
cela a fonctionné pour moi:
heroku config:set DISABLE_COLLECSTATIC=1
et après:
git Push heroku master
Aujourd'hui, toutes les conditions requises ne sont pas correctement entrées avec $ pipenv install Django
du heroku-Django-template et $ pip install -r requirements.txt
.
La dernière version du modèle inclut un dossier /static
avec un humans.txt
; la solution précédente n'est donc probablement pas le proplem
Essayez d'exécuter $ pipenv install whitenoise
puis $ pip freeze > requirements.txt
.
Si cela fonctionne, je recommanderais également $ pip install psycopg2 --ignore-installed
et $ pip freeze > requirements.txt
, sinon vous aurez également des problèmes de migration.
Heroku avait rédigé un document contenant des suggestions sur la manière de gérer cela https://devcenter.heroku.com/articles/Django-assets
ajouter à settings.py
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)
créez un répertoire appelé staticfiles
à la racine de votre projet, mettez un favicon ou quelque chose à l'intérieur, assurez-vous simplement que git le suit. Ensuite, la commande collectstatic devrait se terminer sur heroku.