Search code examples
djangoheroku

Heroku Django deployment ModuleNotFoundError: No module named 'appointmentApp'


Im trying to deploy a django site using Heroku and I keep running into this error when the page tries to load with heroku logs --tail

 »   Warning: heroku update available from 7.53.0 to 7.60.2.
2022-05-18T01:09:37.493808+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/gunicorn/arbiter.py", line 589, in spawn_worker
2022-05-18T01:09:37.493808+00:00 app[web.1]: worker.init_process()
2022-05-18T01:09:37.493808+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/gunicorn/workers/base.py", line 134, in init_process
2022-05-18T01:09:37.493809+00:00 app[web.1]: self.load_wsgi()
2022-05-18T01:09:37.493809+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/gunicorn/workers/base.py", line 146, in load_wsgi
2022-05-18T01:09:37.493810+00:00 app[web.1]: self.wsgi = self.app.wsgi()
2022-05-18T01:09:37.493810+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/gunicorn/app/base.py", line 67, in wsgi
2022-05-18T01:09:37.493810+00:00 app[web.1]: self.callable = self.load()
2022-05-18T01:09:37.493811+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/gunicorn/app/wsgiapp.py", line 58, in load
2022-05-18T01:09:37.493811+00:00 app[web.1]: return self.load_wsgiapp()
2022-05-18T01:09:37.493811+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/gunicorn/app/wsgiapp.py", line 48, in load_wsgiapp
2022-05-18T01:09:37.493812+00:00 app[web.1]: return util.import_app(self.app_uri)
2022-05-18T01:09:37.493812+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/gunicorn/util.py", line 359, in import_app
2022-05-18T01:09:37.493812+00:00 app[web.1]: mod = importlib.import_module(module)
2022-05-18T01:09:37.493813+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/importlib/__init__.py", line 127, in import_module
2022-05-18T01:09:37.493813+00:00 app[web.1]: return _bootstrap._gcd_import(name[level:], package, level)
2022-05-18T01:09:37.493813+00:00 app[web.1]: File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
2022-05-18T01:09:37.493814+00:00 app[web.1]: File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
2022-05-18T01:09:37.493814+00:00 app[web.1]: File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
2022-05-18T01:09:37.493814+00:00 app[web.1]: File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
2022-05-18T01:09:37.493815+00:00 app[web.1]: File "<frozen importlib._bootstrap_external>", line 850, in exec_module
2022-05-18T01:09:37.493815+00:00 app[web.1]: File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
2022-05-18T01:09:37.493815+00:00 app[web.1]: File "/app/GroomingService/GroomingService/wsgi.py", line 16, in <module>
2022-05-18T01:09:37.493816+00:00 app[web.1]: application = get_wsgi_application()
2022-05-18T01:09:37.493816+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/django/core/wsgi.py", line 12, in get_wsgi_application
2022-05-18T01:09:37.493816+00:00 app[web.1]: django.setup(set_prefix=False)
2022-05-18T01:09:37.493817+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/django/__init__.py", line 24, in setup
2022-05-18T01:09:37.493817+00:00 app[web.1]: apps.populate(settings.INSTALLED_APPS)
2022-05-18T01:09:37.493818+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/django/apps/registry.py", line 91, in populate
2022-05-18T01:09:37.493818+00:00 app[web.1]: app_config = AppConfig.create(entry)
2022-05-18T01:09:37.493818+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/django/apps/config.py", line 223, in create
2022-05-18T01:09:37.493819+00:00 app[web.1]: import_module(entry)
2022-05-18T01:09:37.493819+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/importlib/__init__.py", line 127, in import_module
2022-05-18T01:09:37.493819+00:00 app[web.1]: return _bootstrap._gcd_import(name[level:], package, level)
2022-05-18T01:09:37.493820+00:00 app[web.1]: File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
2022-05-18T01:09:37.493820+00:00 app[web.1]: File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
2022-05-18T01:09:37.493820+00:00 app[web.1]: File "<frozen importlib._bootstrap>", line 984, in _find_and_load_unlocked
2022-05-18T01:09:37.493821+00:00 app[web.1]: ModuleNotFoundError: No module named 'appointmentApp'
2022-05-18T01:09:37.493884+00:00 app[web.1]: [2022-05-17 18:09:37 -0700] [10] [INFO] Worker exiting (pid: 10)
2022-05-18T01:09:37.493951+00:00 app[web.1]: [2022-05-17 18:09:37 -0700] [9] [INFO] Worker exiting (pid: 9)
2022-05-18T01:09:37.553717+00:00 heroku[web.1]: State changed from starting to up
2022-05-18T01:09:37.553815+00:00 app[web.1]: Traceback (most recent call last):
2022-05-18T01:09:37.553820+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/gunicorn/arbiter.py", line 209, in run
2022-05-18T01:09:37.554025+00:00 app[web.1]: self.sleep()
2022-05-18T01:09:37.554037+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/gunicorn/arbiter.py", line 357, in sleep
2022-05-18T01:09:37.554155+00:00 app[web.1]: ready = select.select([self.PIPE[0]], [], [], 1.0)
2022-05-18T01:09:37.554157+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/gunicorn/arbiter.py", line 242, in handle_chld
2022-05-18T01:09:37.554242+00:00 app[web.1]: self.reap_workers()
2022-05-18T01:09:37.554243+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/gunicorn/arbiter.py", line 525, in reap_workers
2022-05-18T01:09:37.554366+00:00 app[web.1]: raise HaltServer(reason, self.WORKER_BOOT_ERROR)
2022-05-18T01:09:37.554411+00:00 app[web.1]: gunicorn.errors.HaltServer: <HaltServer 'Worker failed to boot.' 3>
2022-05-18T01:09:37.554413+00:00 app[web.1]:
2022-05-18T01:09:37.554413+00:00 app[web.1]: During handling of the above exception, another exception occurred:
2022-05-18T01:09:37.554413+00:00 app[web.1]:
2022-05-18T01:09:37.554415+00:00 app[web.1]: Traceback (most recent call last):
2022-05-18T01:09:37.554423+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/gunicorn/arbiter.py", line 642, in kill_worker
2022-05-18T01:09:37.554565+00:00 app[web.1]: os.kill(pid, sig)
2022-05-18T01:09:37.554588+00:00 app[web.1]: ProcessLookupError: [Errno 3] No such process
2022-05-18T01:09:37.554590+00:00 app[web.1]:
2022-05-18T01:09:37.554590+00:00 app[web.1]: During handling of the above exception, another exception occurred:
2022-05-18T01:09:37.554590+00:00 app[web.1]:
2022-05-18T01:09:37.554591+00:00 app[web.1]: Traceback (most recent call last):
2022-05-18T01:09:37.554600+00:00 app[web.1]: File "/app/.heroku/python/bin/gunicorn", line 8, in <module>
2022-05-18T01:09:37.554663+00:00 app[web.1]: sys.exit(run())
2022-05-18T01:09:37.554671+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/gunicorn/app/wsgiapp.py", line 67, in run
2022-05-18T01:09:37.554736+00:00 app[web.1]: WSGIApplication("%(prog)s [OPTIONS] [APP_MODULE]").run()
2022-05-18T01:09:37.554743+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/gunicorn/app/base.py", line 231, in run
2022-05-18T01:09:37.554825+00:00 app[web.1]: super().run()
2022-05-18T01:09:37.554833+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/gunicorn/app/base.py", line 72, in run
2022-05-18T01:09:37.554896+00:00 app[web.1]: Arbiter(self).run()
2022-05-18T01:09:37.554897+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/gunicorn/arbiter.py", line 229, in run
2022-05-18T01:09:37.554979+00:00 app[web.1]: self.halt(reason=inst.reason, exit_status=inst.exit_status)
2022-05-18T01:09:37.554981+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/gunicorn/arbiter.py", line 342, in halt
2022-05-18T01:09:37.555076+00:00 app[web.1]: self.stop()
2022-05-18T01:09:37.555084+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/gunicorn/arbiter.py", line 390, in stop
2022-05-18T01:09:37.555186+00:00 app[web.1]: self.kill_workers(sig)
2022-05-18T01:09:37.555187+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/gunicorn/arbiter.py", line 632, in kill_workers
2022-05-18T01:09:37.555323+00:00 app[web.1]: self.kill_worker(pid, sig)
2022-05-18T01:09:37.555325+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/gunicorn/arbiter.py", line 644, in kill_worker
2022-05-18T01:09:37.555460+00:00 app[web.1]: if e.errno == errno.ESRCH:
2022-05-18T01:09:37.555462+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/gunicorn/arbiter.py", line 242, in handle_chld
2022-05-18T01:09:37.555542+00:00 app[web.1]: self.reap_workers()
2022-05-18T01:09:37.555551+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.9/site-packages/gunicorn/arbiter.py", line 525, in reap_workers
2022-05-18T01:09:37.555663+00:00 app[web.1]: raise HaltServer(reason, self.WORKER_BOOT_ERROR)
2022-05-18T01:09:37.555693+00:00 app[web.1]: gunicorn.errors.HaltServer: <HaltServer 'Worker failed to boot.' 3>
2022-05-18T01:09:37.697703+00:00 heroku[web.1]: Process exited with status 1
2022-05-18T01:09:37.764077+00:00 heroku[web.1]: State changed from up to crashed
2022-05-18T01:09:51.528658+00:00 app[api]: Set maintenance mode off by user [email protected]
2022-05-18T01:10:13.487012+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=elizabethselegantdoggrooming.herokuapp.com request_id=3f02a257-18d8-438d-bcac-778254354ad4 fwd="139.182.209.45" dyno= connect= service= status=503 bytes= protocol=https
2022-05-18T01:10:14.027724+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/favicon.ico" host=elizabethselegantdoggrooming.herokuapp.com request_id=f61fe659-2371-48f5-9c94-87339a85b363 fwd="139.182.209.45" dyno= connect= service= status=503 bytes= protocol=https
2022-05-18T01:10:29.138152+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=elizabethselegantdoggrooming.herokuapp.com request_id=4ef2c6f9-ef8b-4798-a310-8c76e305d2eb fwd="139.182.209.45" dyno= connect= service= status=503 bytes= protocol=https
2022-05-18T01:10:29.502227+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/favicon.ico" host=elizabethselegantdoggrooming.herokuapp.com request_id=84e71487-1c60-4024-b27f-37f24a8bf6c6 fwd="139.182.209.45" dyno= connect= service= status=503 bytes= protocol=https
2022-05-18T01:12:44.961980+00:00 app[api]: Starting process with command `printenv` by user [email protected]
2022-05-18T01:12:51.062148+00:00 heroku[run.5944]: Awaiting client
2022-05-18T01:12:51.079149+00:00 heroku[run.5944]: Starting process with command `printenv`
2022-05-18T01:12:51.186266+00:00 heroku[run.5944]: State changed from starting to up
2022-05-18T01:12:54.516779+00:00 heroku[run.5944]: Process exited with status 0
2022-05-18T01:12:54.655109+00:00 heroku[run.5944]: State changed from up to complete
2022-05-18T01:31:48.081568+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=elizabethselegantdoggrooming.herokuapp.com request_id=a13a7884-78a3-461e-be0e-f047d101ffd3 fwd="139.182.209.45" dyno= connect= service= status=503 bytes= protocol=https
2022-05-18T01:31:48.450104+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/favicon.ico" host=elizabethselegantdoggrooming.herokuapp.com request_id=9473141e-ed72-4fb5-8c9b-9264f9b7f42f fwd="139.182.209.45" dyno= connect= service= status=503 bytes= protocol=https

the two most notable things I could find from this error list were

2022-05-18T01:09:37.493821+00:00 app[web.1]: ModuleNotFoundError: No module named 'appointmentApp'

and

2022-05-18T01:09:37.554411+00:00 app[web.1]: gunicorn.errors.HaltServer: <HaltServer 'Worker failed to boot.' 3>

I know that with error H10 there might be something wrong with my procfile

web: gunicorn GroomingService.GroomingService.wsgi

My project file struture

Project/
  GroomingService/
    accountApp/
    adminApp/
    appointmentApp/
    GroomingService/
      __pycache__
      _init_.py
      asagi.py
      settings.py
      urls.py
      views.py
      wsgi.py
    loginApp/
    static/
    staticfiles/
    templates/
    .env
  .gitattributes
  Procfile
  README.md
  requirements.txt
  runtime.txt

Earlier I was also having trouble because it was telling me that wsgi could not found

No module named 'GroomingService.wsgi'

and then that settings could not be found Because of that I added an extra GroomingService to the file path so that it could find it in both my Procfile and my wsgifile

#wsgi.py
import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'GroomingService.GroomingService.settings')
application = get_wsgi_application()

procfile

web: gunicorn GroomingService.GroomingService.wsgi

requirements.txt

asgiref==3.5.0
dj-database-url==0.5.0
Django==4.0.1
django-activeurl==0.2.0
django-appconf==1.0.5
django-classy-tags==3.0.1
django-crispy-forms==1.14.0
django-environ==0.8.1
django-heroku==0.3.1
gunicorn==20.1.0
lxml==4.8.0
psycopg2==2.9.3
python-decouple==3.6
python-dotenv==0.20.0
sqlparse==0.4.2
tzdata==2021.5
whitenoise==6.1.0

runtime.txt

python-3.9.12

Edit: settings.py

from pathlib import Path
import os
from decouple import config

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent


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

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = config('SECRET_KEY')

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

ALLOWED_HOSTS = ['elizabethselegantdoggrooming.herokuapp.com/', '127.0.0.1', 'elizabethselegantdoggrooming.com']

#is used for crispyforms?
CRISPY_TEMPLATE_PACK = 'bootstrap5'


# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    #django apps
    'crispy_forms',
    'appointmentApp',
    'loginApp',
    'accountApp',
    'adminApp',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    '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',
    'whitenoise.middleware.WhiteNoiseMiddleware',
]

ROOT_URLCONF = 'GroomingService.urls'

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 = 'GroomingService.wsgi.application'


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

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}


# Password validation
# https://docs.djangoproject.com/en/4.0/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/4.0/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'America/Los_Angeles'

USE_I18N = True

USE_TZ = True


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

STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'static'), )

# Default primary key field type
# https://docs.djangoproject.com/en/4.0/ref/settings/#default-auto-field

DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

#csrf
CSRF_COOKIE_SECURE = True
SESSION_COOKIE_SECURE = True
SECURE_SSL_REDIRECT = True

How can I direct it to find the modules?


Solution

  • I had to back track, if someone else runs into this, you might be having the same issue

    Basically this Couldn't find WSGI module deploying Heroku

    The file structure is wrong manage.py has to be at the root of the project, where Procfile and requirements.txt are, but if that's not possible to change then you can change the proc file

    old procfile

    web: gunicorn GroomingService.GroomingService.wsgi
    

    new procfile

    web: gunicorn --pythonpath GroomingService GroomingService.wsgi