Verzamel statische fout tijdens het implementeren van de Django-app naar Heroku

Ik probeer een Django-app in Heroku te implementeren, hij begint alles te bouwen, downloaden en installeren, maar dat krijg ik als het gaat om het verzamelen van statische bestanden

$ 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.

Dit is het hele bestand 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'

Dit is de structuur van het project

blog-project -- blog -- migrations
                     -- static
                     -- templates
             -- blogproject
             -- blogprojectenv
             -- custom_user
             -- media
             -- .git

Enige gedachten?


Antwoord 1, autoriteit 100%

Ik heb net vandaag geüpdatet naar Django 1.10 en had exact hetzelfde probleem.
Jouw statische instellingen zijn ook identiek aan de mijne.

Dit werkte voor mij, voer de volgende opdrachten uit:

  1. schakel de collectstatic uit tijdens een implementatie

    heroku config:set DISABLE_COLLECTSTATIC=1

  2. implementeren

    git push heroku master

  3. voer migraties uit (django 1.10 heeft er minstens één toegevoegd)

    heroku run python manage.py migrate

  4. voer collectstatic uit met prieel

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

  5. Collectatic inschakelen voor toekomstige implementaties

    heroku config:unset DISABLE_COLLECTSTATIC

  6. probeer het zelf (optioneel)

    heroku run python manage.py collectstatic

toekomstige implementaties zouden vanaf nu normaal moeten werken


Antwoord 2, autoriteit 42%

Je hebt STATICFILES_DIRSgeconfigureerd om een ​​staticmap te verwachten in dezelfde map als je settings.pybestand, dus zorg ervoor dat het daar niet is ergens anders.

Ook, heb je bestanden in die staticdirectory? Als je dat niet doet, zal git het niet volgen en dus, hoewel het lokaal bestaat, zal het niet bestaan ​​in git. De gebruikelijke oplossing hiervoor is om een ​​leeg bestand met de naam .keepin de map aan te maken, wat ervoor zorgt dat git het bijhoudt. Maar als je eenmaal wat statische bestanden in deze map hebt staan, is dat geen probleem meer.


Antwoord 3, autoriteit 17%

Schakel collectstaticop heroku NIET uit met heroku config:set DISABLE_COLLECTSTATIC=1. Dit verbergt alleen de fout en maakt je app niet gezond.

In plaats daarvan is het beter om te begrijpen waarom de opdracht collectstatic mislukt, omdat dit betekent dat er iets niet klopt met uw instellingen.

Stap 1

Voer beide opdrachten lokaal uit:

python manage.py collectstatic
python manage.py test

U zou een of meer foutmeldingen moeten zien. Meestal is het een ontbrekende variabele (bijvoorbeeld: STATIC_ROOT) die u aan het settings.py-bestand van uw project moet toevoegen.

Het is noodzakelijk om de opdracht testtoe te voegen, omdat sommige collectstatic-gerelateerde problemen alleen met testaan het licht komen, zoals deze

Stap 2

Zodra je alle foutmeldingen lokaal hebt opgelost, push je opnieuw naar heroku.

Problemen oplossen

Vergeet niet dat u opdrachten ook rechtstreeks in uw heroku-VM kunt uitvoeren.
Als u niet lokaal kunt reproduceren, voert u het collectstatic-commando uit in heroku en controleert u direct wat er in uw productieomgeving gebeurt:

python manage.py collectstatic --dry-run --noinput

Start heroku VM

(Hetzelfde geldt uiteraard voor de Heroku-console)


Antwoord 4, autoriteit 8%

Voer python manage.py collectstaticlokaal uit en los eventuele fouten op. In mijn geval waren er verwijzingsfouten die verhinderden dat die opdracht met succes werd uitgevoerd.


Antwoord 5, autoriteit 7%

  • Deze fout is opgetreden omdat u geen staticfilesin
    de hoofdmap van uw project.

  • Maak je geen zorgen. De oplossing is EENVOUDIG.

  • Je hebt slechts TWEE STAPPENnodig.

Stap 1:Open uw settings.py-bestand en schrijf

import os
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent.parent
STATIC_ROOT = BASE_DIR / 'staticfiles'

Stap 2:Voer onderstaande opdracht uit in terminal in de hoofdmap van uw project.
(Als je een virtuele omgeving voor Django Project gebruikt, ga dan naar je virtuele omgeving en ga dan naar de hoofdmap van je project en voer het onderstaande commando uit.)

python manage.py collectstatic

Gefeliciteerd: uw probleem is opgelost.

Je kunt nu je “wijzigingen” COMMITen PUSHzodat deze worden weergegeven in je repository en dan ben je klaar om te gaan.


Antwoord 6, autoriteit 4%

Dit werkte voor mij:

stap 1 – heroku config:set DISABLE_COLLECTSTATIC=1
stap 2 – git push heroku master


Antwoord 7, autoriteit 4%

Ik heb hetzelfde probleem..

Volg deze stap

  1. heroku config:set DISABLE_COLLECTSTATIC=1
  2. git push heroku master
  3. python manage.py collectstatic
  4. python manage.py test
  5. Als er een fout is opgetreden na het uitvoeren van de test..controleer uw
    STATIC_ROOT is zo correct ==> STATIC_ROOT = os.path.join(BASE_DIR, 'static').
  6. Controleer na het uitvoeren van de opdracht collectstatic of alle statische bestanden zijn
    opslaan in de map staticvoor uw hoofdmap. level(manage.py)
    richt. niveau)…
  7. heroku run python manage.py collectstatic.
  8. heroku run python manage.py migrate
  9. heroku config:unset DISABLE_COLLECTSTATIC(voor toekomstig gebruik).

Antwoord 8, autoriteit 3%

als je de django-heroku-bibliotheek

gebruikt

misschien vergeet je deze instelling in de onderkantvan regeltekst settings.py voor kan mogelijk alle configuratieparameters lezen

import django_heroku
django_heroku.settings(locals())

zoals de documentatie:

Gebruik van Django-Heroku

In settings.py, helemaal onderaan::

…
# Configure Django App for Heroku.
import django_heroku
django_heroku.settings(locals())

Hiermee worden automatisch DATABASE_URL, ALLOWED_HOSTS, WhiteNoise (voor statische activa), Logging en Heroku CI voor uw toepassing geconfigureerd.

p.s: sorry voor mijn slechte Engels


Antwoord 9, autoriteit 2%

Heroku had een document gemaakt met suggesties over hoe hiermee om te gaan https://devcenter.heroku .com/articles/django-assets

toevoegen aan 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'),
)

maak een map in de hoofdmap van je project genaamd staticfiles, plaats er een favicon of iets dergelijks in, zorg er gewoon voor dat git het bijhoudt. Dan moet het collectstatic-commando eindigen op heroku.


Antwoord 10

Loop naar dat probleem nadat ik opnieuw had geprobeerd een app te implementeren. Het probleem werd verholpen nadat ik deze commando’s had opgegeven:

$ heroku config:set SECRET_KEY="*secret_key*"
$ heroku config:set DEBUG_VALUE="True"
$ heroku config:set EMAIL_USER="*user-email*"
$ heroku config:set EMAIL_PASS="*pass*"

Deze variabelen in settings.py zijn aangeroepen met lokale omgevingsvariabelen,
die Heroku niet in zijn omgeving had, vandaar de fout.


Antwoord 11

Het lijkt me dat het problemen heeft met het maken van die map blogproject/static. Ik zie dat je een statische map in je blog-app hebt, maar deze zou een niveau hoger moeten staan ​​in je blogproject-map.

Probeer een staticmap te maken in je blogprojectmap en die fout zou moeten verdwijnen.


Antwoord 12

Vandaag kwamen niet alle vereisten goed binnen met $ pipenv install djangovan de heroku-django-template en $ pip install -r requirements.txt.

De nieuwste versie van de sjabloon bevat een map /staticmet een humans.txt, dus de vorige oplossing is waarschijnlijk niet het proplem

Probeer $ pipenv install whitenoiseuit te voeren en vervolgens $ pip freeze > requirements.txt.

Als dat werkt, raad ik u aan $ pip install psycopg2 --ignore-installeden $ pip freeze > requirements.txtook, anders heb je ook problemen met migreren.


Antwoord 13

Ik had hetzelfde probleem bij het implementeren van mijn app. Ik realiseerde me dat ik mijn pip-versie had bijgewerkt, een paar plug-ins had geïnstalleerd, maar vergat een nieuw requirements.txt-bestand te maken.

Voer pip freeze > requirements.txtin uw terminal
Voer python manage.py collectstatic
uit
Duw nu de code naar github en implementeer naar de heroku-server

Ik hoop dat dit helpt als dat het geval is


Antwoord 14

voeg deze regel code in uw setting.py-bestand in.

STATIC_ROOT = os.path.join(BASE_DIR, ‘statisch’)


Antwoord 15

In mijn geval was een fout bijna zoals hierboven beschreven, na te hebben gepusht die in fouten resulteerde, stelde ik de SECRET_KEY "heroku config:set SECRET_KEY='*************************'",
git push heroku main(opnieuw)
,
heroku run python manage.py migrate
,
heroku run python manage.py createsuperuser.. en alles
,
heroku open
en het werkte 🙂


Antwoord 16

het verwijderen van STATICFILES_DIRS werkte in mijn geval


Antwoord 17

heroku config:set DISABLE_COLLECTSTATIC=1 --app #yourappname

Voer gewoon de opdracht uit


Antwoord 18

Dit probleem treedt op omdat Heroku probeert manage.py uit te voeren.
Tijdens het uitvoeren van manage.py
we moeten schrijven als
python manage.py 'some_command'

Maar Heroku probeert het als
python manage.py --noinput

In dit geval kunnen we dus wijzigingen aanbrengen in ons manage.py-bestand:
In eerste instantie ziet het er zo uit:

#!/usr/bin/env python
 """Django's command-line utility for administrative tasks."""
 import os
 import sys
 def main():
     """Run administrative tasks."""
     os.environ.setdefault('DJANGO_SETTINGS_MODULE', 
'your_project.settings')
     try:
         from django.core.management import execute_from_command_line
     except ImportError as exc:
         raise ImportError(
             "Couldn't import Django. Are you sure it's installed and "
             "available on your PYTHONPATH environment variable? Did you "
             "forget to activate a virtual environment?"
         ) from exc
     execute_from_command_line(sys.argv) # just put this in try block
 if __name__ == '__main__':
     main()

Dus we veranderen onze main.py in:

#!/usr/bin/env python
 """Django's command-line utility for administrative tasks."""
 import os
 import sys
 def main():
     """Run administrative tasks."""
     os.environ.setdefault('DJANGO_SETTINGS_MODULE', 
'your_project.settings')
     try:
         from django.core.management import execute_from_command_line
     except ImportError as exc:
         raise ImportError(
             "Couldn't import Django. Are you sure it's installed and "
             "available on your PYTHONPATH environment variable? Did you "
             "forget to activate a virtual environment?"
         ) from exc
     try:
          execute_from_command_line(sys.argv) # just put this in try block
     except:
          pass
 if __name__ == '__main__':
     main()

Antwoord 19

Als je .env-bestanden en python-decouplehebt gebruikt, moet je de omgevingsvariabelen definiëren in Heroku app settings > Config Vars. Anders werkt collectstaticniet.

Other episodes