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()  
Вернуться на верх