Cat

Разворачивание Django-проекта на PythonAnyWhere

В этом посте мы разберём как развернуть Django на бесплатном сервисе PythonAnyWhere

Дополнительные материалы

Icon Link

Реклама

Icon Link
Полезные инструменты proDream 08 Февраль 2024 Просмотров: 3052

Есть несколько сервисов, которые позволяют бесплатно развернуть проекты на Django (и не только).
Их немного и в каждом есть свои ограничения, но они порой бывают полезны, когда собственного сервера нет, но нужно, например, показать результат работы заказчику.

В этом посте мы развернём проект на сервисе PythonAnyWhere.

Адрес сервиса: https://www.pythonanywhere.com

Регистрация в сервисе достаточно простая, нет смысла её описывать. В процессе регистрации осознанно выбирайте username, поскольку именно он будет адресом сайта в интернете.
После регистрации обязательно подтвердите электронную почту.

 

Подготовка проекта.

Перед тем, как приступить к работе с сервисом, необходимо подготовить проект для работы.

В корне проекта, рядом с файлом manage.py, создайте файл requirements.txt, если его нет. Добавьте туда используемые в вашем проекте библиотеки в формате <название_библиотеки><версия>, например, Django5.0.1.
Также можно воспользоваться командой pip freeze > requirements.txt которая соберёт все установленные библиотеки и запишет их в файл.

 

Также в корне проекта создайте .env-файл. В нём будут храниться секретные данные, такие, как секретный ключ Django, данные для подключения к БД и т.д. Всё, что не следует хранить в коде.
Подробнее об этом файле рассказано в посте "AIOgram3 17. Подготовка к разворачиванию на сервере".

Для получения данных из .env-файла нам потребуется библиотека python-dotenv.
Установим её командой pip install python-dotenv и добавим в requirements.txt.

 

Конфигурация настроек.

Откроем файл settings.py.

В самом начале файла, сразу после импортов, добавляем вызов функции load_dotenv().

from dotenv import load_dotenv  


load_dotenv()

 

После переменной DEBUG добавим две переменные:

SESSION_COOKIE_SECURE = True  
CSRF_COOKIE_SECURE = True

 

Они нужны для повышения безопасности проекта.

В переменную ALLOWED_HOSTS добавляем два адреса: один локальный, второй адрес будущей страницы на сервисе – ["127.0.0.1", "username.pythonanywhere.com"], где вместо username необходимо указать ваш логин в сервисе.

Далее перейдём к блоку DATABASES и заменим его с настроек для sqlite на mysql:

DATABASES = {  
    "default": {  
        "ENGINE": "django.db.backends.mysql",  
        "NAME": os.getenv("MYSQL_DBNAME"),  
        "USER": os.getenv("MYSQL_USER"),  
        "PASSWORD": os.getenv("MYSQL_PASSWORD"),  
        "HOST": os.getenv("MYSQL_HOST"),  
        "OPTIONS": {  
            "init_command": "SET NAMES 'utf8mb4';SET sql_mode = 'STRICT_TRANS_TABLES'",  
            "charset": "utf8mb4",  
        },  
    }  
}

 

Для поддержки MySQL установим библиотеку mysqlclient, выполнив команду pip install mysqlclient. И сразу добавим её в requirements.txt.

Убедитесь, что STATIC и MEDIA пути у вас верно указаны:

STATIC_URL = "static/"  
STATIC_ROOT = BASE_DIR / "static/"  

MEDIA_URL = "media/"  
MEDIA_ROOT = BASE_DIR / "media/"

 

Далее нам нужны следующие переменные: SECRET_KEY, DEBUG, NAME, USER, PASSWORD, HOST.
Заменяем в них значения на os.environ.get(""), где в кавычках "" указываем имя переменной окружения.

Переменную DEBUG оборачиваем в if-else конструкцию.

SECRET_KEY = os.environ.get("SECRET_KEY")  

if os.environ.get("DEBUG") == "False":
    DEBUG = False
else:
    DEBUG = True

 

Создадим соответствующие переменные в .env-файле в виде <имя_переменной>=<значение>, без кавычек.

SECRET_KEY=...  
DEBUG=False  
MYSQL_DBNAME=...  
MYSQL_USER=...  
MYSQL_PASSWORD=...  
MYSQL_HOST=...

 

База данных.

Откроем на сайте раздел Databases. Нам сразу предлагают ввести пароль базы данных. Он должен отличаться от пароля к личному кабинету сервиса.

Придумываем пароль и сразу вписываем его в .env-файл в переменную MYSQL_PASSWORD.

После того, как будет сконфигурирована БД, откроется страница, на которой в блоке Connecting будет две строки: Database host address и Username. Вписываем их в .env-файл в переменные MYSQL_HOST и MYSQL_USER, соответственно.

 

Ниже в блоке Your databases будет указано имя базы данных в формате <username>$<default>. Копируем и вписываем в переменную MYSQL_DBNAME.

 

Далее необходимо изменить кодировку БД с латинской на кириллическую. Для этого в блоке Your databases кликаем по имени базы данных и в открывшейся MySQL-консоли вводим, заменив username$default на имя базы данных:

ALTER DATABASE username$default CHARACTER SET utf8 COLLATE utf8_general_ci;

 

Должно вывести:

Query OK, 1 row affected, 2 warnings (0.03 sec)

 

Выходим из консоли, набрав команду exit.

 

Загрузка файлов на сервер.

Загрузить файлы на сервер можно разными способами, например, опубликовать проект в GitHub или загрузить архив и распаковать его.

Я выбрал вариант с репозиторием на GitHub.

После того, как проект опубликован, на странице раздела Consoles выбираем Bash для создания нового терминала.

 

Вводим команду:

git clone <ссылка_на_репозиторий>

 

Когда скачаются файлы, вводим команду для перехода в директорию проекта:

cd <имя_проекта>

 

Создаём и затем активируем виртуальное окружение Python:

python3 -m venv venv

source venv/bin/activate

 

Устанавливаем зависимости:

pip install -r requirements.txt

 

Настройка веб-приложения.

Переходим в раздел Web и нажимаем кнопку Add a new web app.

На экране выбора веб-фреймворка нажимаем Manual configuration (including virtualenvs). Далее Python 3.10.

После создания веб-приложения мы попадаем на страницу настройки.

Находим раздел Virtualenv и указываем путь к директории с виртуальным окружением. Если вы в точности повторяли всё, что было указано выше, то он будет таким: /home/<имя_пользователя>/<имя_проекта>/venv.

 

Находим раздел Code и в нём строку WSGI configuration file. Кликаем по ссылке и попадаем в окно редактирования WSGI-файла. Находим блок # +++++++++++ DJANGO +++++++++++ и удаляем всё, что находится до и после него.

 

Раскомментируем все строки, начинающиеся с одного символа решётки #.

Сразу после импортов добавляем загрузку .env-файла. Обратите внимание, в этой директории должен находиться .env-файл:

from dotenv import load_dotenv

project_folder = os.path.expanduser('~/<имя_проекта>')
load_dotenv(os.path.join(project_folder, '.env'))

 

Далее в переменной path указываем полный путь до директории проекта. Обратите внимание, в этой директории должен находиться файл manage.py:

path = '/home/<имя_пользователя>/<имя_проекта>'
if path not in sys.path:
    sys.path.append(path)

os.environ['DJANGO_SETTINGS_MODULE'] = '<имя_проекта>.settings'

## then:
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

 

В месте, где указываем файл настроек проекта <имя_проекта>.settings, прописывайте его так, как он указан в вашем файле settings.py в переменной WSGI_APPLICATION - <имя_проекта>.wsgi.application.

 

Мой код файла:

# +++++++++++ DJANGO +++++++++++
# To use your own django app use code like this:
import os
import sys

from dotenv import load_dotenv

project_folder = os.path.expanduser('~/temp_project')
load_dotenv(os.path.join(project_folder, '.env'))

path = '/home/proDream/temp_project'
if path not in sys.path:
    sys.path.append(path)

os.environ['DJANGO_SETTINGS_MODULE'] = 'pressanybutton.settings'

## then:
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

 

Миграции и статика.

Вернёмся в консоль с активированным виртуальным окружением. Его можно найти в разделе Consoles
Если закрыли, то откройте снова и активируйте venv, либо на странице веб-приложения, в разделе Virtualenv нажмите Start a console in this virtualenv.

Убеждаемся, что мы находимся в той же директории, что и файл manage.py, выполнив команду ls. Если нет, то перейдите в нужную директорию командой cd.

Выполним команду миграции базы данных:

python manage.py migrate

 

Создаём суперпользователя командой:

python manage.py createsuperuser

 

И следом выполняем команду сбора статических файлов:

python manage.py collectstatic

 

В результате выполнения третьей команды все статические файлы проекта будут собраны в одно место. В консоли будет отображен полный путь до директории со статическими файлами.
Скопируйте его.

На странице веб-приложения находим раздел Static files.
В блок URL вводим /static/, а в блок Directory - скопированный ранее путь.

 

Если в вашем проекте помимо статики используется ещё и media, укажите директорию и путь.

 

Завершение.

Остался последний шаг.

В самом верху страницы есть блок Reload с большой зелёной кнопкой. Нажимаем на неё и ждём несколько секунд.

 

После чего переходим по адресу, указанному над кнопкой Configuration for ....

В результате должна отобразиться главная страница сайта.

 

Поздравляю, ваш сайт доступен всему интернету по этому адресу.

Автор

    Нет комментариев

    Реклама