Apache/mod_wsgi/Django AJAX : 500 Внутренняя ошибка сервера: ModuleNotFoundError: Нет модуля с именем 'corsheaders'
Наша проблема связана с тем, что в проекте Django модуль corsheaders запущен через Apache/WSGI. Код работает нормально, используя локальный сервер Django, но при доступе через Apache (v.2.4.41) выдает 500 Internal Server Error. Если мы закомментируем приложение и промежуточное ПО в settings.py, сайт и другой код работает нормально (за исключением функциональности API, которая нуждается в corsheaders).
Мы исчерпали все доступные нам онлайн-ресурсы, поэтому заранее благодарим вас за совет удалить и переустановить django-cors-headers различными способами с помощью pip. Мы используем несколько других модулей, которые были установлены через этот шлюз без каких-либо проблем. Насколько мы можем судить, проблема связана с тем, что django wsgi не видит модуль.
Ниже я привел соответствующие журналы и настройки. Я также отметил места установки модуля corsheader.
Релевантные версии
- django-cors-headers==3.13.0 (установлен по адресу: /home/geekfest/.local/lib/python3.8/site-packages)
- django-cors-middleware==1.5.0
- python==3.8.10
- Django==4.1.2
- Ubuntu==20.04.1
pythonpath: ['', '/usr/lib/python38.zip', '/usr/lib/python3.8', '/usr/lib/python3.8/lib-dynload', '/home/geekfest/.local/lib/python3.8/site-packages', '/usr/local/lib/python3.8/dist-packages', '/usr/lib/python3/dist-packages']
**settings.py**
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'corsheaders',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.humanize',
'stats',
]
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware',
'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',
'django.middleware.common.CommonMiddleware',
'stats.middleware.EventData',
]
ROOT_URLCONF = 'geekstats.urls'
CORS_ORIGIN_ALLOW_ALL = True
error.log
wsgi.py:
import os,sys
sys.path.append('/home/geekfest/geekstats/.../geekstats')
sys.path.append('/usr/lib/python3/dist-packages')
sys.path.append('/home/geekfest/.local/lib/python3.8/site-packages')
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'geekstats.settings')
application = get_wsgi_application()
Определение виртуального хоста в Apache .conf:
<VirtualHost *:80>
ServerName xxx.com
ServerAlias stats.xxx.com
DocumentRoot /home/geekfest/.../geekstats/stats
ErrorLog ${APACHE_LOG_DIR}/gferror.log
CustomLog ${APACHE_LOG_DIR}/gfaccess.log combined
WSGIDaemonProcess xxx.com python-path=/usr/lib/python3.8:/home/geekfest/geekstats/...geekstats/geekstats:/usr/lib/python3/dist-packages:/home/geekfest/.local/lib/python3.8/site-packages
WSGIProcessGroup xxx.com
# Tell Apache what it should call when the “xxx” url alias is called
WSGIScriptAlias / /home/geekfest/.../geekstats/geekstats/wsgi.py
# Tell Apache where to find the “static” subdir for the django site
Alias /static /home/geekfest/.../stats/static
# Give Apache the location and permissions to where the wsgi.py file resides in>
<Directory /home/geekfest/.../geekstats/geekstats>
<Files wsgi.py>
Require all granted
Options +Indexes +ExecCGI
</Files>
</Directory>
# Give Apache the location and permissions to the static directory (images) for>
<Directory /home/geekfest/.../stats/static>
Order deny,allow
Allow from all
Require all granted
</Directory>
</VirtualHost>
Убедитесь, что вы установили coreheaders. Для его установки вы можете попробовать pip install django-cors-headers
. Если вы используете virtualenv для пакетов python, то вам необходимо указать в конфигурационном файле apache, где находится ваш virtualenv.
Ок, я понял. Я знал, что это должно быть проблемой пути, потому что модуль был там. Если вы посмотрите выше, то pip установил его в /home. WSGI работал из каталога /user. Как только я заставил Django сказать мне, где находятся мои другие рабочие библиотеки, я увидел проблему и принудительно установил библиотеку в /user.
Команда, направляющая pip на принудительную переустановку другой директивы, следующая:
sudo pip install --upgrade --force-reinstall --target /usr/lib/python3/dist-packages/ django-cors-headers