Django, модуль Settings не найден на хостингах YouStable
Я разворачиваю django-сайты на платформе виртуального хостинга (YouStable). При последней попытке я получаю страницу с ошибкой сервера 500, поскольку он не может найти файл настроек.
Фон
Ранее мне удалось развернуть сайт, который работал. Я удалил его, когда у меня возникли проблемы, потому что я выбрал имена приложений, которые конфликтуют с зарезервированными словами, а также обнаружил, что не могу установить веб-фреймворк Bootstrap (хотя сначала мне нужно разобраться с этим вопросом). С тех пор у меня возникли проблемы с созданием нового сайта. Я сообщил о проблеме, когда хостинг-сервер пытался запустить код из виртуальной среды, подключенной к предыдущему сайту (сайт и venv были удалены). Техники службы поддержки хостинга устранили эту проблему.
Что я сделал.
Процедура развертывания включает в себя создание Python 'app' в CPanel's 'Setup Python app' путем; выбора версии Python (я выбрал 3.11), выбора имени ('myapp'), выбора доменного имени и сохранения приложения. Это создаст виртуальную среду (или venv), используя мое имя пользователя ('username'), имя приложения и версию Python. Для меня:
/home/username/virtualenv/appname/3.11/
CPanel затем отображает код для выбора и активации этого venv для использования в терминальном разделе CPanel. Я переключился на терминал, активировал venv, установил Django с помощью pip и использовал django-admin startproject ... для создания сайта ('mysite'). Затем я нашел файл wsgi.py в проекте и сохранил его расположение в приложении CPanel Setup Python
(/mysite/site/wsgi.py)
CPanel подтверждает, что может найти файл настроек. Без каких-либо дополнительных изменений должна появиться домашняя страница отладки (с включенной ракетой). Однако я получаю страницу с ошибкой сервера 500 и журнал ошибок.
В журнале ошибок stderr.log видно, что сервер дважды проходит через один и тот же цикл, один из которых приведен ниже. Большую часть цикла он использует код из правильного venv, но с парой исключений; один раз он пытается использовать imp.py для загрузки passenger_wsgi.py (чего не должен делать, потому что я сказал ему, где находится файл wsgi.py) и один раз для использования importlib.py, где он не может найти файл настроек. Оба раза он использует
/opt/alt/python311/lib64/python3.11
вместо моей венеры и провалов.
Когда я обратился в службу поддержки, мне посоветовали обратиться к разработчику (то есть ко мне). Мои вопросы таковы
Является ли причиной ошибки своп из моего venv в /opt/alt...?
Есть ли еще что-нибудь, что я могу сделать, чтобы исправить это?
Или мне нужно снова обратиться в службу поддержки, потому что это их проблема?
Заранее спасибо за любую помощь в этом вопросе.
Содержимое stderr.log выглядит следующим образом:
stderr.log (ASCII text)
Traceback (most recent call last):
File "/home/username/appname/passenger_wsgi.py", line 8, in <module>
wsgi = imp.load_source('wsgi', 'mysite/mysite/wsgi.py')
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/alt/python311/lib64/python3.11/imp.py", line 172, in load_source
module = _load(spec)
^^^^^^^^^^^
File "<frozen importlib._bootstrap>", line 721, in _load
File "<frozen importlib._bootstrap>", line 690, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 940, in exec_module
File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
File "mysite/mysite/wsgi.py", line 16, in <module>
application = get_wsgi_application()
^^^^^^^^^^^^^^^^^^^^^^
File "/home/username/virtualenv/appname/3.11/lib/python3.11/site-packages/django/core/wsgi.py", line 12, in get_wsgi_application
django.setup(set_prefix=False)
File "/home/username/virtualenv/appname/3.11/lib/python3.11/site-packages/django/__init__.py", line 19, in setup
configure_logging(settings.LOGGING_CONFIG, settings.LOGGING)
^^^^^^^^^^^^^^^^^^^^^^^
File "/home/username/virtualenv/appname/3.11/lib/python3.11/site-packages/django/conf/__init__.py", line 89, in __getattr__
self._setup(name)
File "/home/username/virtualenv/appname/3.11/lib/python3.11/site-packages/django/conf/__init__.py", line 76, in _setup
self._wrapped = Settings(settings_module)
^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/username/virtualenv/appname/3.11/lib/python3.11/site-packages/django/conf/__init__.py", line 190, in __init__
mod = importlib.import_module(self.SETTINGS_MODULE)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/alt/python311/lib64/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 1140, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'mysite.settings'
[UID:1295][2353167] Child process with pid: 2353179 was killed by signal: 15, core dumped: no
Q1 Похоже, что проблема возникает из-за интерфейса между пассажиром сервера и файловой системой Django
Q2 Да. Я изменил их файл passenger.py, и теперь мой сайт работает. Большинство шагов описано ниже.
Q3 Я снова обратился в службу поддержки, но не получил никаких полезных ответов.
Зарегистрируйте домен в диалоге Cpanel, Domains, Domains.
Диалог добавления домена панели
Перейдите в раздел Cpanel, Software, Setup Python App и нажмите кнопку Create Application
Диалог настройки Python-приложения в панели
В разделе Setup Python App выберите версию Python, имя приложения ('myapp') и доменное имя, затем Save.
(я выбрал python 3.10, так как он был рекомендован и подходит для Django 5.0.3 - последней версии на момент написания статьи)
Введите версию python, имя приложения и домен в меню Setup Python App
Сервер создаст папку для вашего приложения ("myapp") с файлом passenger.py, который он использует для запуска вашего приложения, и одноименную виртуальную среду в папке Virtualenv. Он предоставляет код для активации venv и перехода в папку приложения в диалоге, появляющемся после создания приложения. Его можно скопировать, просто щелкнув по нему.
Приложение Python создало диалог
В этом примере код будет
source /home/username/virtualenv/myapp/3.10/bin/activate && cd /home/username/myapp
В Cpanel, Advanced, Terminal этот код активирует venv и перенесет вас в верхнюю часть вашего приложения. Примечание: В веб-терминале используйте ctrl + shift + v для вставки
(Вместо этого вы можете загружать файлы в приложение)
python -m pip install Django
Здесь будет отображаться версия Django после завершения
Упрощенная структура файла выглядит следующим образом:
-
myapp/
-
passenger.py
-
myproject/
-
manage.py
-
myproject/
-
settings.py
-
urls.py
-
wsgi.py
-
Измените urls.py так, чтобы сайту было что отображать
# myproject/urls.py
from django.contrib import admin
from django.urls import path
from django.views import debug
urlpatterns = [
path('', debug.default_urlconf),
path('admin/', admin.site.urls),
]
В файле настроек добавьте доменное имя в список разрешенных хостов.
ALLOWED_HOSTS = ['mysite.com']
Наконец-то Django создает файл wsgi.py, и я использовал его для модификации их passenger.py.
# passenger.py
import os
import sys
from django.core.wsgi import get_wsgi_application
# Change myproject to the name of your project
# sys.path holds a list of directories that the python interpreter
# will search for a required module
# The following works out the directories to search
# in your python app and Django project
# Get the directory path of this passenger file - myapp
this_path = os.path.dirname(os.path.abspath(__file__))
# Only add this if it's not in the list
if this_path not in sys.path:
sys.path.insert(0, this_path)
# Work out the directory of the Settings file
settings_path = os.path.join(this_path, 'myproject', 'myproject')
if settings_path not in sys.path: # Only add this if ...
sys.path.insert(1, settings_path)
# Work out the directory path of the top of the project
project_path = os.path.join(this_path, 'myproject')
if project_path not in sys.path: # Only add this if ...
sys.path.insert(2, project_path)
# The last lines are taken from the wsgi.py file created by Django
# Set the settings module environment variable
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_project.settings')
# Passenger looks for a function called application
application = get_wsgi_application()