Gunicorn Проблемы с ModuleNotFoundError при развертывании DRF-проекта в Render из-за
ПроектDRF запущен в среде разработки, ожидает развертывания в Render через yaml. Сообщение об ошибке выглядит следующим образом:
==> Running 'gunicorn core.wsgi:application'
Traceback (most recent call last):
File "/opt/render/project/src/.venv/bin/gunicorn", line 8, in <module>
sys.exit(run())
^^^^^
File "/opt/render/project/src/.venv/lib/python3.11/site-packages/gunicorn/app/wsgiapp.py", line 67, in run
WSGIApplication("%(prog)s [OPTIONS] [APP_MODULE]", prog=prog).run()
File "/opt/render/project/src/.venv/lib/python3.11/site-packages/gunicorn/app/base.py", line 236, in run
super().run()
File "/opt/render/project/src/.venv/lib/python3.11/site-packages/gunicorn/app/base.py", line 72, in run
Arbiter(self).run()
^^^^^^^^^^^^^
File "/opt/render/project/src/.venv/lib/python3.11/site-packages/gunicorn/arbiter.py", line 58, in __init__
self.setup(app)
File "/opt/render/project/src/.venv/lib/python3.11/site-packages/gunicorn/arbiter.py", line 118, in setup
self.app.wsgi()
File "/opt/render/project/src/.venv/lib/python3.11/site-packages/gunicorn/app/base.py", line 67, in wsgi
self.callable = self.load()
^^^^^^^^^^^
File "/opt/render/project/src/.venv/lib/python3.11/site-packages/gunicorn/app/wsgiapp.py", line 58, in load
return self.load_wsgiapp()
^^^^^^^^^^^^^^^^^^^
File "/opt/render/project/src/.venv/lib/python3.11/site-packages/gunicorn/app/wsgiapp.py", line 48, in load_wsgiapp
return util.import_app(self.app_uri)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/render/project/src/.venv/lib/python3.11/site-packages/gunicorn/util.py", line 371, in import_app
mod = importlib.import_module(module)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/importlib/__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "<frozen importlib._bootstrap>", line 1204, in _gcd_import
File "<frozen importlib._bootstrap>", line 1176, in _find_and_load
File "<frozen importlib._bootstrap>", line 1126, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
File "<frozen importlib._bootstrap>", line 1204, in _gcd_import
File "<frozen importlib._bootstrap>", line 1176, in _find_and_load
File "<frozen importlib._bootstrap>", line 1140, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'core'
gunicorn вызывается в Procfile следующим образом:
web: gunicorn core.wsgi:application
попробовал изменить название модуля на django_project.core.wsgi:application
, но ошибка сохраняется.
Я пробовал использовать следующую структуру проекта:
django_project
django_project\core
django_project\core\__pycache__
django_project\core\__init__.py
django_project\core\asgi.py
django_project\core\settings.py
django_project\core\urls.py
django_project\core\wsgi.py # module is defined here? Why can't gunicorn recognise it?
django_project\myapp
django_project\myapp\__pycache__
django_project\myapp\migrations
django_project\myapp\__init__.py
django_project\myapp\admin.py
django_project\myapp\apps.py
django_project\myapp\models.py
django_project\myapp\tests.py
django_project\myapp\urls.py
django_project\myapp\views.py
.env
.gitignore
db.sqlite3
manage.py
Procfile # reads "web: gunicorn core.wsgi:application"
README.md
render.yaml
requirements.txt
Еще одной потенциальной проблемной зоной является yaml-файл:
databases:
- name: my-database
plan: free
region: oregon
services:
- type: web
name: my-drf-app
env: python
plan: free
buildCommand: "pip install -r requirements.txt && python manage.py collectstatic --noinput && python manage.py migrate"
startCommand: "gunicorn core.wsgi:application"
envVars:
- key: DJANGO_SETTINGS_MODULE
value: core.settings
- key: SECRET_KEY
generateValue: true
- key: ALLOWED_HOSTS
value: my-drf-app.onrender.com
- key: DATABASE_URL
value: postgresql://my_database_0jkb_user:oRsLKq[...hidden...]
также попытался изменить startCommand на gunicorn django_project.core.wsgi:application
, но ошибка сохраняется.
Вы можете посмотреть мое полное репо здесь: http://github.com/lmcrean/drf-practise
Проблема заключалась в отсутствии конкретики и точности в render.yaml
. Я успешно развернул его на Render с фиксацией ниже.
Во-первых, пути должны быть указаны правильно, чтобы учитывать структуру файлов в startCommand
и DJANGO_SETTINGS_MODULE
.
Во-вторых, PYTHONPATH должен быть явно определен в envVars
, чтобы найти проект, который развертывается.
Вот обновленная render.yaml
конфигурация:
databases:
- name: my-database
plan: free
region: oregon
services:
- type: web
name: my-drf-app
env: python
plan: free
buildCommand: "pip install -r requirements.txt && python manage.py collectstatic --noinput && python manage.py migrate"
startCommand: "gunicorn django_project.core.wsgi:application" # updated to specify project folder
envVars:
- key: DJANGO_SETTINGS_MODULE
value: django_project.core.settings # updated to specify project folder
- key: SECRET_KEY
generateValue: true
- key: ALLOWED_HOSTS
value: my-drf-app.onrender.com
- key: DATABASE_URL
value: postgresql://my_database_0jkb_user:oRsLKqo9HGQePCmmRgYGMXedUZWTBNpc@dpg-cq4jau5ds78s73cl6650-a:5432/my_database_0jkb
- key: PYTHONPATH
value: /opt/render/project/src/django_project # sets the python path