Завершаем развертывание Django-сайта на хостинге

Курс по Django: https://stepik.org/a/183363

Архив проекта: sbalak.beget.tech.zip

Продолжаем разворачивать наш ранее созданный проект на хостинге Beget. На предыдущем занятии мы с вами установили нужную версию языка Python и фреймворка Django. Теперь пришло время для непосредственного переноса проекта (сайта) на хостинг. Первое, что здесь нужно сделать – это установить все необходимые зависимости в виртуальное окружение на хостинге. Что это за зависимости? Например, пакет для капчи или django-debug-tools и другие необходимые пакеты. Как узнать, что именно устанавливать и какие версии брать? Для этого мы перейдем в проект на локальном компьютере и из активного виртуального окружения сайта в терминале выполним команду:

pip freeze > requirements.txt

Будет создан файл requirements.txt с набором всех имеющихся зависимостей. У меня они следующие:

asgiref==3.3.1
Django==3.1.5
django-debug-toolbar==3.2
django-ranged-response==0.2.0
django-simple-captcha==0.5.13
Pillow==8.1.0
pytz==2020.5
six==1.15.0
sqlparse==0.4.1

Мы воспользуемся этим файлом на сервере для установки всех этих пакетов в виртуальное окружение, кроме Django, так как он уже установлен с нужной версией, поэтому строчку Django==3.1.5 удалим из этого файла.

Далее, я воспользуюсь своей любимой программой Far Manager для FTP-доступа к хостингу и скопирую в каталог:

sbalak.beget.tech/coolsite

следующие каталоги и файлы:

coolsite
media
templates
women
manage.py
requirements.txt

Теперь, с помощью программы PuTTy установим SSH-соединение с хостингом для выполнения на нем команд. Зайдем в Docker:

ssh localhost -p222

и из каталога:

cd sbalak.beget.tech

активируем виртуальное окружение:

source djangoenv/bin/activate

После этого можем выполнить установку всех необходимых зависимостей командой:

pip install -r requirements.txt

и еще установим mysqlclient для Django (чтобы иметь возможность работать с БД MySQL):

pip install django mysqlclient

Перенос файлов и установка зависимостей выполнена. Далее, я соберу все статические файлы в единую папку static, где будут располагаться стили оформления, изображения, скрипты и прочие статические данные. Для этого на сервере выполним команду:

python manage.py collectstatic

появится каталог static в рабочем каталоге проекта со всеми необходимыми файлами.

Следующим шагом создадим БД, с которой будет работать наше приложение. Это делается из админки хостера Beget. Я здесь создал БД со следующими данными:

  • имя: sbalak_django
  • пароль: hS&Elv8S

(Разумеется, когда вы будете делать деплой проекта, ни в коем случае никому не сообщайте имени БД и пароль).

Теперь, нам нужно связать приложение с этой БД. Для этого перейдем пакет конфигурации и откроем файл settings.py. В этом файле выключим режим отладки и разрешим использовать хост с именем sbalak.beget.tech (домен сайта):

Debug=False
ALLOWED_HOSTS = ['sbalak.beget.tech', 'www.sbalak.beget.tech']

Затем, в коллекции DATABASES нужно прописать следующую информацию:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', 
        'NAME': 'Имя вашей базы данных',
        'USER': 'Ваш пользователь совпадает с именем базы',
        'PASSWORD': 'Ваш пароль',
        'HOST': 'localhost',   
        'PORT': '3306',
    }
}

Эти сведения мне подсказали в службе поддержки Beget. На другом хостинге могут присутствовать другие параметры, в частности, другой номер порта. Для ключей NAME, USER и PASSWORD прописываем данные для созданной БД:

DATABASES = {
    'default': {
#        'ENGINE': 'django.db.backends.sqlite3',
#        'NAME': BASE_DIR / 'db.sqlite3',
        'ENGINE': 'django.db.backends.mysql', 
        'NAME': 'sbalak_django',
        'USER': 'sbalak_django',
        'PASSWORD': 'hS&Elv8S',
        'HOST': 'localhost',   
        'PORT': '3306',
    }
}

Все, связь с БД настроена, осталось создать нужные таблицы. Здесь мы воспользуемся механизмом миграций пакета Django. Выполним знакомую нам команду:

python manage.py migrate

и все нужные таблицы появятся в БД.

Решение проблемы со статическими файлами на реальном сервере

В целом, в базовом варианте мы уже сделали перенос нашего сайта на реальный веб-сервер. Но, если сейчас открыть сайт, то увидим проблемы с обращением к статическим файлам. Это довольно частая неприятность, которая может нас поджидать при развертывании сайта на реальном хостинге. И решать ее можно по-разному. Я не стал здесь особо прыгать с бубном и пытаться настроить конфигурацию веб-сервера, тем более, что на простом хостинге это может быть недоступно. Вместо этого поставил один костыль, который решает всю эту проблему (по крайней мере, на хостинге Beget).

Мы самостоятельно пропишем пути к каталогам static и media при выключенном режиме отладки. Для этого откроем файл urls.py и пропишем следующие строчки:

from django.views.static import serve as mediaserve
from django.conf.urls import url
 
if settings.DEBUG:
    import debug_toolbar
 
    urlpatterns = [
        path('__debug__/', include(debug_toolbar.urls)),
    ] + urlpatterns
 
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
 
else:
    urlpatterns += [
        url(f'^{settings.MEDIA_URL.lstrip("/")}(?P<path>.*)$',
            mediaserve, {'document_root': settings.MEDIA_ROOT}),
        url(f'^{settings.STATIC_URL.lstrip("/")}(?P<path>.*)$',
            mediaserve, {'document_root': settings.STATIC_ROOT}),
    ]

Теперь, при обновлении страниц сайта мы видим, что все работает корректно – внешние статические файлы успешно загружаются.

Перенос записей БД

В принципе, сайт полностью работоспособный, мы можем самостоятельно добавлять новые записи и просматривать их. Но у нас уже были записи на тестовом веб-сервере. Если требуется их перенести на хостинг и разместить в БД MySQL, то это можно сделать следующим образом.

Вот на этой странице приведено подробное описание работы команды dumpdata:

https://the-bosha.ru/2016/06/29/django-delaem-damp-bazy-dannykh-i-vosstanavlivaem-iz-nego-s-dumpdata-i-loaddata/

С ее помощью можно выполнять перенос данных из одной БД в другую. И, как всегда, есть несколько нюансов работы этой команды. Если мы хотим перенести все таблицы, то для этого в терминале на локальном компьютере (откуда переносим) следует записать:

python manage.py dumpdata > db.json

Однако, затем, при импорте этих данных на стороне сервера (хостинга) с помощью команды:

python manage.py loaddata db.json

возникнут проблемы из-за наличия таблиц auth.permission и contenttypes. Их переносить не нужно. Поэтому, правильно сформировать все таблицы для переноса на другой сервер, следует так:

python manage.py dumpdata --exclude auth.permission --exclude contenttypes > db.json

Затем, преобразовать кодировку файла в UTF-8 и скопировать в корневой каталог проекта на сервер. После этого, через SSH-клиент выполнить команду:

python manage.py loaddata db.json

И таблицы должны быть успешно сформированы. Все, теперь мы полностью развернули свой сайт на боевом веб-сервере хостинга Beget.

Я, надеюсь, теперь вам стало понятнее как делается перенос сайтов на хостинги. Опять же, этот процесс уникален для каждого хостинга, но, как правило, имеется подробное описание последовательности шагов для развертывания сайта на Django, так как это довольно популярный фреймворк. Просто, внимательно следуйте указанным пунктам, ну и старайтесь в целом понимать, что делаете. Совсем бездумно выполнять подобные операции все же не стоит. Удачи всем в разработке своих собственных сайтов на Django!

Курс по Django: https://stepik.org/a/183363

Видео по теме