web-dev-qa-db-fra.com

Erreur Collectstatic lors du déploiement de l'application Django sur Heroku

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?

22
Stefano De Rosso

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:

  1. désactiver le collectstatic lors d'un déploiement

    heroku config:set DISABLE_COLLECTSTATIC=1

  2. déployer

    git Push heroku master

  3. exécuter les migrations (Django 1.10 ajouté au moins un)

    heroku run python manage.py migrate

  4. exécuter collectstatic en utilisant bower

    heroku run 'bower install --config.interactive=false;grunt prep;python manage.py collectstatic --noinput'

  5. activer collecstatic pour les futurs déploiements

    heroku config:unset DISABLE_COLLECTSTATIC

  6. essayez vous-même (facultatif)

    heroku run python manage.py collectstatic

les futurs déploiements devraient fonctionner normalement à partir de maintenant

30
tomcounsell

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.

20
D. Evans

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. 

3
citynorman

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.

1
awwester

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.

0

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.

0
Harry Moreno