Расписание занятий

Понедельник 19:00 – 21:30
Среда 19:00 – 21:30
Суббота 10:00 – 15:00

Django на PythonAnywhere

18 декабря 2016

Развёртывание django-сайта на хостинге PythonAnywhere — довольно простая, но комплексная задача. Для её решения обычно выполняется следующая последовательность действий.

Создание окружения VirtualEnv

Для этого нужно войти на https://www.pythonanywhere.com/ под своим именем, перейти в раздел Consoles и открыть консоль Bash.

Обратите внимание, что PythonAnywhere ограничивает число одновременно открытых консолей. Список уже открытых консолей показан в разделе Consoles под надписью Your Consoles. Вы можете выполнять действия в уже имеющейся консоли (для этого щёлкните по её названию), либо закрыть консоль, щёлкнув на Kill возле неё.

В консоли нужно выполнить следующие команды. Здесь и далее предполагается, что ваш проект называется my_project. Замените слово my_project на название вашего проекта.

cd ~
virtualenv -p /usr/bin/python3.5 my_project_env
cd my_project_env
source bin/activate

С этого момента вы находитесь в вашем рабочем окружении. Чтобы деактивировать его, выйдите из консоли командой exit, либо, чтобы продолжить работу в этой консоли, деактивируйте его командой deactivate. Этого сейчас делать не нужно! Не убивайте эту консоль, она нам ещё не раз понадобится. Однако выходить из неё (щелком по логотипу PythonAnywhere слева вверху) и возвращаться обратно можно сколько угодно раз — состояние консоли сохраняется.

Установка необходимых пакетов

Находясь в консоли с активным окружением, выполните следующие команды.

pip install Pillow
pip install Django

Если вам требуется конкретная версия Django (например, 1.8, или 1.7), её можно установить следующей командой:

pip install Django==1.7

Вместо 1.7 укажите желаемую версию.

Аналогично установите другие желаемые пакеты (например, Requests, или BeautifulSoup4, или любые другие).

Подготовка проекта к развёртыванию

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

Для этого скопируйте ваш проект целиком в отдельный каталог. Затем удалите из вашего MEDIA_ROOT загруженные файлы, если они есть, а так же удалите файл базы данных, если вы использовали SQLite (файл db.sqlite3).

Упакуйте каталог проекта в zip-архив любым способом. Допустим, файл архива будет называться my_project.zip.

Загрузка проекта на сервер

На странице PythonAnywhere перейдите в раздел Files (для этого, находясь в консоли, щёлкните по логотипу сайта слева вверху и щёлкните ссылку Files).

Не используйте команду exit — это закроет консоль, а она нам ещё понадобится.

Перейдите в каталог вашего виртуального окружения (my_project_env) и щёлкните ссылку Upload a file. Выберите архив проекта и дождитесь, пока он будет загружен.

Перейдите в раздел Consoles, активируйте вашу консоль, в ней выполните следующую команду.

unzip my_project.zip

Дождитесь завершения распаковки.

Перейдите в распакованный каталог проекта с помощью команды cd (в нём должен быть файл manage.py, проверить список файлов в каталоге можно командой ls).

Создание базы данных

Перейдите в раздел Databases (щёлкните логотип PythonAnywhere, затем раздел Databases). Слева выберите MySQL. Найдите на странице секцию Create a database. В поле Database name введите название вашей новой базы данных. Например, my_project. Нажмите кнопку Create. Полное название вашей базы данных будет состоять из вашего логина на PythonAnywhere и указанного вами названия, разделённых символом $. Например, если ваш логин — ivan, то созданная база данных будет называться ivan$my_project. Именно это название нужно будет указать в настройках вашего проекта.

Теперь нужно создать пароль для доступа к базе данных. В секции MySQL Password ниже введите пароль в поля New password и Confirm password, после чего щёлкните кнопку Set MySQL Password ниже. Желательно, чтобы пароль базы данных отличался от вашего пароля на PythonAnywhere. Запомните или запишите созданный пароль. Его так же надо будет указать в настройках проекта.

Удаление базы данных (если нужно)

Чтобы удалить базу данных (например, ошибочно созданную) со всеми данными, хранящимися в ней, откройте консоль MySQL и введите команду:

drop database user$dbname;

Здесь user — имя вашей учётной записи, а dbname — название базы данных, указанное при её создании. Точка с запятой в конце команды обязательна. Например, если ваш логин — ivan, а база данных, которую вы хотите удалить, назвается my_project, команда удаления будет выглядеть так:

drop database ivan$my_project;

Выйти из консоли MySQL можно командой exit.

Настройка проекта

На странице PythonAnywhere перейдите в раздел Files, и откройте там каталог my_project_env, в нём — каталог my_project, а в нём — снова каталог my_project. Вы увидите ваш файл settings.py. Щёлкните по нему. Откроется текстовый редактор с этим файлом.

Внесите в него следующие изменения.

DEBUG

Обязательно измените значение параметра DEBUG на False:

DEBUG = False

ALLOWED_HOSTS

В список ALLOWED_HOSTS добавьте полное доменное имя вашего сайта. Оно состоит из вашего логина на PythonAnywhere и строчки «pythonanywhere.com». Например, если ваш логин — ivan, то полное доменное имя вашего сайта — ivan.pythonanywhere.com. Если этого не сделать, Django не будет работать с флагом DEBUG = False. Вообще, этот список содержит список доменных имён, по которым должен быть доступен ваш сайт.

ALLOWED_HOSTS = ["ivan.pythonanywhere.com", ]

DATABASES

Укажите параметры подключения к созданной вами базе данных. Их можно посмотреть в разделе Databases сайта PythonAnywhere. Ниже — пример настроек для пользователя ivan, базы данных ivan$my_project и пароля seCrEt123.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'ivan$my_project',
        'USER': 'ivan',
        'PASSWORD': 'seCrEt123',
        'HOST': 'ivan.mysql.pythonanywhere-services.com',
    }
}

Замените везде ivan на ваш логин, my_project — на имя вашей базы, а seCrEt123 — на пароль от неё. Остальные настройки можно оставить без изменений.

Подготовка базы данных

Откройте в разделе Consoles вашу консоль Bash. Если вы вышли из неё, активируйте ваше рабочее окружение следующими командами:

cd ~/my_project_env
source bin/activate

Теперь перейдите в каталог проекта:

cd my_project

И примените миграции базы данных:

python manage.py makemigrations
python manage.py migrate

Если появятся сообщения об ошибках, убедитесь, что в файле settings.py указаны правильные параметры подключения базы данных.

Настройка веб-сервера PythonAnywhere

На сайте PythonAnywhere перейдите в раздел Web.

Важный момент: на бесплатном тарифе PythonAnywhere не позволяет иметь более одного приложения одновременно. Если у вас уже есть развёрнутое приложение, удалите его. Для этого в самом низу страницы щёлкните кнопку «Delete ваш-логин.pythonanywhere.com» и подтвердите дейставие, нажав кнопку Yes.

Слева щёлкните кнопку Add a new web app. Появится мастер добавления нового веб-приложения. Смена доменного имени доступна только на платном тарифе, поэтому щёлкаем Next. В окне «Select a Python Web framework» выбираем Manual configuration, затем выбираем последнюю доступную версию Python (Python 3.5). Щёлкаем Next. Ждём, пока приложение будет создано.

На странице «Configuration for ваш-логин.pythonanywhere.com» заполняем поля конфигурации сайта.

В секции Code для параметра Source code указываем путь до нашего проекта: /home/ваш-логин/my_project_env/my_project. После ввода значения нужно щёлкнуть небольшую кнопку с галочкой для сохранения введённого значения. Для параметра Working directory указываем тот же путь.

Ниже в секции Virtualenv указываем путь до виртуального окружения нашего проекта: /home/ваш-логин/my_project_env.

Теперь в секции Code щёлкаем параметр WSGI configuration file.

Откроется текстовый редактор. Удаляем всё содержимое файла и копируем туда содержимое WSGI-файла нашего проекта. Его можно найти в каталоге проекта рядом с файлом settigs.py. Он называется wsgi.py. Обычно что-то вроде такого должно получиться:

import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "my_project.settings")
application = get_wsgi_application()

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

import os, sys
path = '/home/ваш-логин/my_project_env/my_project'
if path not in sys.path:
    sys.path.append(path)
from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "my_project.settings")
application = get_wsgi_application()

Конечно, везде заменяем my_project на название каталога с вашим проектом, а символы «ваш-логин» на ваш логин.

Сохраним файл (кнопка Save справа вверху) и выйдем из редактора (щёлкнем по логотипу сайта PythonAnywhere слева вверху).

Вернёмся к разделу Web, щёлкнув по нему.

Теперь на странице «Configuration for ваш-логин.pythonanywhere.com» нужно нажать зелёную кнопку «Reload ваш-логин.pythonanywhere.com» и дождаться завершения перезапуска. После этого откроем новую вкладку браузера и введём адрес http://ваш-логин.pythonanywhere.com.

Если возникли ошибки, проверьте, всё ли правильно заполнено. Убедитесь, что верно указаны пути к проекту в разделе Web, что содержимое WSGI-файла верно. Если источник ошибок непонятен, попробуйте открыть файл settings.py и изменить значение параметра DEBUG на True. Возможно, отладочный вывод Django поможет вам. Помните, что после каждого изменения нужно перезапускать приложение кнопкой Reload в секции Web. Не забудьте вернуть значение DEBUG = False после устранения всех проблем.

Настройка статических файлов

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

Например, если в нашем проекте статические файлы собраны в каталог my_project/static/, и мы в шаблонах страниц обращаемся к ним по адресу /static/, нужно добавить это соответствие.

Для этого нужно щёлкнуть ссылку Enter URL, ввести туда /static, щёлкнуть кнопку с галочкой, потом щёлкнуть Enter path, ввести туда /home/ваш-логин/my_project_env/my_project/static и вновь щёлкнуть кнопку с галочкой.

Обновление проекта

Удобнее всю разработку вести на своём компьютере с использованием встроенного сервера Django (python manage.py runserver).

После того, как вы внесли изменения и проверили всё, нужно загрузить изменённые файлы на сервер PythonAnywhere (используя раздел Files), заменяя старые файлы новыми. Это ещё называют «деплой на боевой сервер». Будьте осторожны! Не заменяйте файл settings.py, ведь параметры в нём отличаются от параметров на вашем компьютере. Изменения в него лучше вносить вручную, модифицируя его в разделе Files.

Чтобы применить миграции БД, следует открыть консоль Bash, перейти в каталог вашего проекта и выполнить обычные команды.

python manage.py makemigrations
python manage.py migrate

После того, как заменены все старые файлы и применены миграции, нужно перезапустить приложение (раздел Web, кнопка Reload).

Если что-то не работает, попробуйте включить отладку (изменив в файле settings.py значение параметра DEBUG = True). После устранения проблем не забудьте отключить её (DEBUG = False). После любого изменения settings.py (как и после любого изменения любого python- файла) нужно перезапускать приложение.