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:
-
schakel de collectstatic uit tijdens een implementatie
heroku config:set DISABLE_COLLECTSTATIC=1
-
implementeren
git push heroku master
-
voer migraties uit (django 1.10 heeft er minstens één toegevoegd)
heroku run python manage.py migrate
-
voer collectstatic uit met prieel
heroku run 'bower install --config.interactive=false;grunt prep;python manage.py collectstatic --noinput'
-
Collectatic inschakelen voor toekomstige implementaties
heroku config:unset DISABLE_COLLECTSTATIC
-
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_DIRS
geconfigureerd om een static
map te verwachten in dezelfde map als je settings.py
bestand, dus zorg ervoor dat het daar niet is ergens anders.
Ook, heb je bestanden in die static
directory? 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 .keep
in 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 collectstatic
op 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 test
toe te voegen, omdat sommige collectstatic
-gerelateerde problemen alleen met test
aan 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
(Hetzelfde geldt uiteraard voor de Heroku-console)
Antwoord 4, autoriteit 8%
Voer python manage.py collectstatic
lokaal 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
- heroku config:set
DISABLE_COLLECTSTATIC=1
git push heroku master
python manage.py collectstatic
python manage.py test
- 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')
. - 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)… heroku run python manage.py collectstatic
.heroku run python manage.py migrate
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 static
map te maken in je blogproject
map en die fout zou moeten verdwijnen.
Antwoord 12
Vandaag kwamen niet alle vereisten goed binnen met $ pipenv install django
van de heroku-django-template en $ pip install -r requirements.txt
.
De nieuwste versie van de sjabloon bevat een map /static
met een humans.txt
, dus de vorige oplossing is waarschijnlijk niet het proplem
Probeer $ pipenv install whitenoise
uit te voeren en vervolgens $ pip freeze > requirements.txt
.
Als dat werkt, raad ik u aan $ pip install psycopg2 --ignore-installed
en $ pip freeze > requirements.txt
ook, 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.txt
in 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-decouple
hebt gebruikt, moet je de omgevingsvariabelen definiëren in Heroku app settings > Config Vars
. Anders werkt collectstatic
niet.