1
votes

I’m trying to deploy my Django app through Heroku but I’m getting a ModuleNotFound error after running a production environment with gunicorn wsgi path. My app is included in settings.py and it was working fine while in the development environment. But now I’m getting errors for deployment. I have problems with how my project is structured, thus Procfile does not leave in the same directory as manage.py, and I believe this could be the issue. Any hint or help is more than appreciated.

Directory structure

 >FINALPROJECT(root)
    > .vscode
    > project5
        > brainSkills
           > migrations
           > static
           > templates
           apps.py
           models.py
           urls.py
           views.py
        > project5
           _init_.py
           settings.py
           wsgi.py
        _init_.py
        manage.py
    > venv
    .env
    .gitignore
    Procfile
    README.md
    requirements.txt

Procfile

web: gunicorn project5.project5.wsgi

wsgi.py

import os
 
from django.core.wsgi import get_wsgi_application
 
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project5.project5.settings')
 
application = get_wsgi_application()

setting.py

import os
from pathlib import Path
from dotenv import load_dotenv

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

ROOT_URLCONF = 'project5.urls'

WSGI_APPLICATION = 'project5.wsgi.application'

Error after gunicorn project5.project5.wsgi or Heroku local

5:32:28 PM web.1 |    File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/importlib/__init__.py", line 127, in import_module
5:32:28 PM web.1 |      return _bootstrap._gcd_import(name[level:], package, level)
5:32:28 PM web.1 |    File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
5:32:28 PM web.1 |    File "<frozen importlib._bootstrap>", line 991, in _find_and_load
5:32:28 PM web.1 |    File "<frozen importlib._bootstrap>", line 973, in _find_and_load_unlocked
5:32:28 PM web.1 |  ModuleNotFoundError: No module named 'brainSkills'
5:32:28 PM web.1 |  [2020-10-12 21:32:28 +0000] [57691] [INFO] Worker exiting (pid: 57691)
5:32:28 PM web.1 |  [2020-10-12 17:32:28 -0400] [57689] [INFO] Shutting down: Master
5:32:28 PM web.1 |  [2020-10-12 17:32:28 -0400] [57689] [INFO] Reason: Worker failed to boot.
[DONE] Killing all processes with signal  SIGINT
5:32:28 PM web.1 Exited with exit code null

1
You should push your directory from where your manage.p is. Heroku won't work as long as the manage.py is not in the base directoryAhmad Waqar

1 Answers

0
votes

Try changing the way you are adding it to INSTALLED_APPS:

INSTALLED_APPS = [
   'django.contrib.admin',
   'django.contrib.auth',
   'django.contrib.contenttypes',
   'django.contrib.sessions',
   'django.contrib.messages',
   'django.contrib.staticfiles',
   'brainSkills.apps.BrainSkillsConfig',
]

More about this here. While doing the research for this question I learned that prior to Django 1.7 your approach would be correct if you also used default_app_config = 'brainSkills.apps.BrainSkillsConfig' in your app's __init__.py. However Django now recommends the approach I show above.