Wsgi: ModuleNotFoundError: Нет модуля с именем 'django' ошибка

Я пытаюсь разместить мое приложение Django на моем сервере Ubuntu, и при попытке получить доступ к моему веб-сайту я получаю эту ошибку из журнала Apache:

ModuleNotFoundError: No module named 'django'

Я использую venv для моего приложения Django с python версии 3.8 (я также скомпилировал и установил mod_wsgi в моем venv). Запустив pip freeze, я вижу, что Django установлен в моем venv:

APScheduler==3.8.1
asgiref==3.5.0
backports.zoneinfo==0.2.1
certifi==2021.10.8
charset-normalizer==2.0.10
colorama==0.4.4
commonmark==0.9.1
deepdiff==5.7.0
Django==4.0.1
django-cors-headers==3.11.0
djangorestframework==3.13.1
idna==3.3
lxml==4.7.1
mod-wsgi==4.9.1.dev1
ordered-set==4.0.2
prettytable==3.0.0
psycopg2-binary==2.9.3
Pygments==2.11.2
pytz==2021.3
pytz-deprecation-shim==0.1.0.post0
requests==2.27.1
rich==11.1.0
six==1.16.0
soupsieve==2.3.1
sqlparse==0.4.2
tzdata==2021.5
tzlocal==4.1
urllib3==1.26.8
wcwidth==0.2.5
whitenoise==5.3.0

На всякий случай, если это может решить проблему, я установил Django глобально, но все равно получил ошибку в Apache. Я пытался следовать некоторым общим решениям, но не могу заставить его работать. Есть ли что-то, что я упускаю или какие-то настройки, которые могут быть отключены?

Я заметил, что мой Apache говорит, что он настроен на 3.6, может ли это быть причиной? Есть ли способ заставить его использовать 3.8, который является моим python3 по умолчанию?

Мой wsgi для моего проекта Django (backend/core/wsgi.py):

import os, sys
sys.path.append('/home/brickmane/djangoapp/pricewatcher/backend/')

sys.path.append('/home/brickmane/djangoapp/pricewatcher/backend/core/')
sys.path.append('/home/brickmane/djangoapp/pricewatcher/venv/lib/python3.8/site-packages')


from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'core.settings')

application = get_wsgi_application()

Мои настройки virtualhost в /etc/apache2/apache2.conf:

WSGIPythonHome /home/brickmane/djangoapp/pricewatcher/venv
WSGIPythonPath /home/brickmane/djangoapp/pricewatcher/backend
<VirtualHost *:80>
  ServerAlias www.d8pricecheck.tk

  WSGIProcessGroup backend

  Alias /static/ /home/brickmane/djangoapp/pricewatcher/backend/static/

  <Directory /home/brickmane/djangoapp/pricewatcher/backend/static>
    Require all granted
  </Directory>

  WSGIScriptAlias / /home/brickmane/djangoapp/pricewatcher/backend/core/wsgi.py
  
  <Directory /home/brickmane/djangoapp/pricewatcher/backend/core>
    <Files wsgi.py>
      Require all granted
    </Files>
  </Directory>
 WSGIDaemonProcess backend python-path=/home/brickmane/djangoapp/pricewatcher/backend/core python-home=/home/brickmane/djangoapp/pricewatcher/venv
 WSGIProcessGroup backend
</VirtualHost>

Полный журнал ошибок Apache после перезапуска и посещения веб-сайта:

Вам необходимо установить в venv Python версии не ниже 3.8, так как 3.7 и ниже не совместимы с Django 4.0+. Вам следует полностью удалить venv и заново инициализировать с установленным Python более новой (самой новой является 3.10.2) версии.

Если Ubuntu имеет версию не ниже 3.8, то все должно быть в порядке. Если нет, попробуйте установить/обновить ее. Здесь есть несколько подсказок, как это сделать: https://cloudbytes.dev/snippets/upgrade-python-to-latest-version-on-ubuntu-linux

Этот вопрос немного старый, но если кто-то все еще сталкивается с этим. Я решил эту проблему, установив python-path в мои python's site-packages. Также для вашего случая выше

WSGIDaemonProcess backend python-path=/home/brickmane/djangoapp/pricewatcher/venv/lib/python
3.8/site-packages python-home=/home/brickmane/djangoapp/pricewatcher/venv

Это решило мою проблему

Для себя я определил, что Apache2 mod_wsgi был скомпилирован под python 3.9, а мой экземпляр django использовал python 3.10.

ldd /usr/lib/apache2/modules/mod_wsgi.so
linux-vdso.so.1 (0x00007ffe32535000)
libpython3.9.so.1.0 => /usr/lib/x86_64-linux-gnu/libpython3.9.so.1.0 (0x00007f9c59b77000)
. . .

Убедившись, что мой системный Python также установлен на 3.9, я исправил эту ошибку.

Вернуться на верх