Доброго времени суток всем )
Пробую создать первый проект на Django, и сразу уперся в такой вопрос:
Вся пока конфигурация стандартна, только что развернута.
В файлу settings.py убираю настройки SQLite прописываю настройки MySQL:
"""
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
"""
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'cd887xx_xx',
'USER': 'cd887xx_xx',
'PASSWORD': 'Password',
'HOST': 'localhost',
'PORT': '',
'OPTIONS': {
'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
}
}
}
В итоге все перестает работать.
Т.е. с базовыми настройками выдет страницу админки Django, с настройками для MySQL выдает:
"Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request. Please contact the server administrator at info@timeweb.ru to inform them of the time this error occurred, and the actions you performed just before this error. More information about this error may be available in the server error log."
Если меняю обратно опять все ОК.
Запускаю runserver ошибок не выдает.
В техподдержку обращался, ответ такой:
"mod_wsgi (pid=54709): Target WSGI script '/home/c/cd887xx/public_html/index.wsgi' cannot be loaded as Python module.
Проведя поверхностную проверку, настройки окружения, не обнаружил, что вызывает данную ошибку."
Уже пару дней не могу ответ найти, что это такое может быть. И не могу понять, как вообще настройка подключения к БД в setting.py может влиять на загрузку файла index.wsgi.
Может кто сталкивался с подобным?
Ответы (28)
Мне кажется, что это не весь вывод ошибки. Попробуйте выполнить в директории сайта:
python index.wsgi
Dec 1 18:07:52 vh298 apache_error[66675]: cd887xx.tmweb.ru [Tue Dec 01 15:07:52 2020] [error] [pid 54709] src/server/mod_wsgi.c(3692): [client 188.242.63.122:56666] mod_wsgi (pid=54709): Target WSGI script '/home/c/cd887xx/public_html/index.wsgi' cannot be loaded as Python module.
Dec 1 18:07:52 vh298 apache_error[66675]: cd887xx.tmweb.ru [Tue Dec 01 15:07:52 2020] [error] [pid 54709] src/server/wsgi_logger.c(630): [client 188.242.63.122:56666] mod_wsgi (pid=54709): Exception occurred processing WSGI script '/home/c/cd887xx/public_html/index.wsgi'.
При выполнении python index.wsgi не происходит совсем ничего (а что должно выводиться?)
Last login: Tue Dec 8 11:27:08 2020 from 92.53.116.153
cd887xx@vh298:~$ source myenv/bin/activate
(myenv) cd887xx@vh298:~$ cd public_html
(myenv) cd887xx@vh298:~/public_html$ python index.wsgi
(myenv) cd887xx@vh298:~/public_html$ python index.wsgi
(myenv) cd887xx@vh298:~/public_html$
Вы выполняли python index.wsgi после переключения на MySQL? Если нет, то стоит сначала переключиться на MySQL, потом выполнить команду. Я предложил выполнить эту команду в надежде получить более подробный вывод об ошибке.
Да сейчас MySQL стоит в настройках. Обратно пока не возвращал.
В любом случае спасибо за ответ.)
На всякий случай проверьте, что у вас есть модуль для работы с MySQL и используется совместимая версия python.
По этому логу, увы, сложно точно указать на проблему.
И вроде все нормально:
(myenv) cd887xx@vh298:~/public_html/Much$ pip install mysqlclient
Requirement already satisfied: mysqlclient in /home/c/cd887xx/myenv/lib/python3.6/site-packages (2.0.1)
(myenv) cd887xx@vh298:~/public_html/Much$ python --version
Python 3.6.9
(myenv) cd887xx@vh298:~/public_html/Much$ python -m django --version
3.1.3
(myenv) cd887xx@vh298:~/public_html/Much$
Странно конечно. Как вообще они логически связаны смена привязки БД (пустой, новой) в setting.py и отваливающийся index.wsgi....
File "/home/c/cd887xx/myenv/lib/python3.6/site-packages/django/db/backends/mysql/introspection.py", line 27, in DatabaseIntrospection
FIELD_TYPE.JSON: 'JSONField',
AttributeError: module 'MySQLdb.constants.FIELD_TYPE' has no attribute 'JSON'
Как почитал это связано с версионностью. Попробовал новые рекомендации, но все равно не очень помогает.
В общем в конечном итоге решил все удалить, и заново попробовать настроить. ))
Спасибо за поддержку!
File "/home/c/cd887xx/myenv/lib/python3.6/site-packages/django/db/backends/mysql/introspection.py", line 27, in DatabaseIntrospection
FIELD_TYPE.JSON: 'JSONField',
AttributeError: module 'MySQLdb.constants.FIELD_TYPE' has no attribute 'JSON'
Как почитал это связано с версионностью. Попробовал новые рекомендации, но все равно не очень помогает.
В общем в конечном итоге решил все удалить, и заново попробовать настроить. ))
Спасибо за поддержку!
В общем если интересно, решили проблему.
Теперь понятно в чем суть, вариант решения путем обновления mysqlclient. При этом я его рассматривал и делал. Но делал его в виртуальной среде! Там у меня стоит последняя версия, как и у Романа.
А нужно было сделать обновление сразу из под аккаунта, и тогда все работает.
Спасибо, что поделились решением. Предлагаю вам тогда отметить ваш ответ как решение, чтобы другие коллеги могли увидеть его визуально)
Package Version
----------- -------
asgiref 3.3.1
Django 3.1.4
jsonfield 3.1.0
mysql 0.0.2
mysqlclient 2.0.1
pip 20.3.1
pytz 2020.4
setuptools 51.0.0
sqlparse 0.4.1
wheel 0.36.1
С таким списком пакетов - не работает. На stackowerflow рекомендация была обновить mysqlclient до версии 2.0.1 - не помогло.
Версия питона что ли не такая?
AttributeError: module 'MySQLdb.constants.FIELD_TYPE' has no attribute 'JSON'
Очень хорошо, что все заработало :)
"Теперь понятно в чем суть, вариант решения путем обновления mysqlclient. При этом я его рассматривал и делал. Но делал его в виртуальной среде! Там у меня стоит последняя версия, как и у Романа.
А нужно было сделать обновление сразу из под аккаунта, и тогда все работает.
Решение вопроса"
, если установка любых пакетов доступна только через виртуальное окружение?
У меня такая же проблема, шаред хостинг, поэтому могу только в виртуальном окружении могу пакеты обновлять. Методично попробовал разные версии mysqlclient, начиная от 1.4.0, поскольку django начинает работать только с этой, но ничего не помогло.
в файл index.wsgi (наверх после импортов) добавить строчку: sys.path.remove('/usr/lib/python3/dist-packages')
Это исключит путь к необновленному пакету, который висит на сервере, и будет искать фал в пакетах вашего виртуального окружения (где он есть).
И не забываем "pip install mysqlclient"