Примечание: Эта глава может показаться сложной. Будь упорна, развертывание сайта на сервере является важной частью веб-разработки. Данная глава намеренно расположена в середине учебника для того, чтобы твой наставник смог помочь с таким мудреным процессом, как публикация сайта. Так ты сможешь самостоятельно закончить все главы, даже если время будет поджимать.
До настоящего момента твой сайт был доступен только для локального просмотра, теперь же ты узнаешь, как развернуть его на удалённом сервере! Развертывание (deploy) — это процесс публикации приложения в интернете, чтобы люди могли наконец увидеть твое творение :)
Как ты уже знаешь, веб-сайт должен располагаться на сервере. Есть много компаний, предоставляющих сервера в интернете. Мы воспользуемся услугами одной из них, с довольно простым процессом публикации: PythonAnywhere. PythonAnywhere бесплатен для маленьких приложений с небольшим числом посетителей, и этого будет для нас более чем достаточно.
Другим внешним сервисом, которым мы воспользуемся, будет GitHub — сервис хостинга кода. Существуют и другие похожие сервисы, но практически у каждого программиста есть GitHub аккаунт, теперь будет и у тебя!
В итоге твой код будет в трёх местах. На локальном компьютере ты будешь заниматься разработкой и тестированием. Когда результат тебя устроит, ты загрузишь свою программу на GitHub. А твой сайт будет на PythonAnywhere, и ты сможешь обновлять его, просто загружая новую версию кода с GitHub.
Примечание: если ты уже выполнила установку, незачем повторять её вновь — можешь сразу переходить к следующему разделу и начать создание собственного Git-репозитория.
{% include "/deploy/install_git.md" %}
Git отслеживает изменения определенного набора файлов, который называется репозиторием (сокращенно "репо"). Давайте создадим такой для нашего проекта. Открой консоль и запусти эти команды в папке djangogirls
:
Примечание: проверь текущий рабочий каталог с помощью команд
pwd
(OSX/Linux) илиcd
(Windows) перед инициализацией нового репозитория. Ты должна находиться в директорииdjangogirls
.
{% filename %}command-line{% endfilename %}
$ git init
Initialized empty Git repository in ~/djangogirls/.git/
$ git config --global user.name "Your Name"
$ git config --global user.email [email protected]
Инициализировать git-репозиторий придется только один раз за проект (и тебе больше не придется вводить имя пользователя и адрес электронной почты).
Git будет отслеживать изменения всех файлов и каталогов в заданной директории, однако некоторые из них мы предпочли бы игнорировать. Для этого нам нужно создать файл .gitignore
в корневом каталоге репозитория. Открой редактор и создай новый файл со следующим содержанием:
{% filename %}.gitignore{% endfilename %}
*.pyc
*~
__pycache__
myvenv
db.sqlite3
/static
.DS_Store
И сохрани его как .gitignore
в корневом каталоге "djangogirls".
Примечание: точка в начале имени файла имеет важное значение! Если у тебя есть проблемы с созданием таких файлов (Mac не позволит создать файл с названием, начинающимся с точки, через Finder, например), тогда используй кнопку «Сохранить как» в меню своего редактора кода, это точно поможет.
Примечание: среди файлов, которые мы перечислили в
.gitignore
, естьdb.sqlite3
. Этот файл содержит твою локальную базу данных, где будут храниться твои посты. Мы не добавляем его в репозиторий, поскольку твой сайт на PythonAnywhere будет использовать другую базу данных. Эта база данных тоже может быть SQLite, как на твоём рабочем компьютере, но обычно используется MySQL, которая может справиться с большим количеством посетителей, чем SQLite. В любом случае, поскольку мы не копируем базу данных SQLite на Github, все посты, которые ты уже создала, будут доступны только на твоём локальном компьютере, и тебе придётся заново создать их на опубликованном сайте. Рассматривай свою локальную базу данных как удобную игровую площадку, где ты можешь тестировать различные идеи и не бояться удалить настоящий пост из своего блога.
Используй команду git status
перед git add
или в любой другой момент, когда ты не уверена, что изменения — хорошая идея. Это убережёт тебя от таких неприятных сюрпризов, как добавление неправильных файлов. Команда git status
возвращает информацию обо всех ранее неотслеживаемых/изменённых/добавленных в git файлах, а также статус ветки и многое другое. Результат должен быть похож на:
{% filename %}command-line{% endfilename %}
$ git status
On branch master
Initial commit
Untracked files:
(use "git add <file>..." to include in what will be committed)
.gitignore
blog/
manage.py
mysite/
nothing added to commit but untracked files present (use "git add" to track)
И, наконец, мы сохраним наши изменения. Переключись на консоль и набери:
{% filename %}command-line{% endfilename %}
$ git add --all .
$ git commit -m "My Django Girls app, first commit"
[...]
13 files changed, 200 insertions(+)
create mode 100644 .gitignore
[...]
create mode 100644 mysite/wsgi.py
Зайди на GitHub.com и создай новую бесплатную учётную запись (если это уже сделано во время подготовки к воркшопу — здорово!).
Затем создай новый репозиторий и назови его "my-first-blog". Не выбирай опцию "initialise with a README", не создавай файл .gitignore (мы сделаем это локально сами) и оставь лицензию None.
Примечание: имя репозитория
my-first-blog
для нас очень важно — ты можешь, конечно, придумать другое название, но оно будет встречаться множество раз в руководстве, и тебе придется заменять его каждый раз на своё. Будет проще для начала остановиться на нашем варианте:my-first-blog
.
На следующем экране ты найдёшь URL для клонирования репозитория. Выбери вариант "HTTPS" и скопируй ссылку:
Теперь нужно связать локальный репозиторий с репозиторием на GitHub.
Напечатай у себя в консоли следующую команду (замени <your-github-username>
на имя, указанное при создании аккаунта на GitHub, но без угловых скобок):
{% filename %}command-line{% endfilename %}
$ git remote add origin https://github.com/<your-github-username>/my-first-blog.git
$ git push -u origin master
Введи свое имя пользователя и пароль от аккаунта GitHub; ты должна увидеть что-то такое:
{% filename %}command-line{% endfilename %}
Username for 'https://github.com': hjwp
Password for 'https://[email protected]':
Counting objects: 6, done.
Writing objects: 100% (6/6), 200 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/hjwp/my-first-blog.git
* [new branch] master -> master
Branch master set up to track remote branch master from origin.
Твой код теперь на GitHub. Зайди на сайт и проверь! Ты найдешь его в хорошей компании: фреймворк Django, этот учебник, а также многие другие великолепные проекты с исходным кодом размещены на GitHub :)
Примечание: возможно, ты уже завела учётную запись на PythonAnywhere ранее — если так, нет нужды повторять это вновь.
{% include "/deploy/signup_pythonanywhere.md" %}
После регистрации на PythonAnywhere ты будешь перемещена на страницу «Consoles». Выбери опцию старта консоли «Bash» — это версия консоли PythonAnywhere, аналогичная твоему локальному терминалу.
Примечание: PythonAnywhere использует Linux, так что если ты используешь Windows, то терминал и команды могут немного отличаться от того, к чему ты привыкла на своём компьютере.
Давай загрузим наш код из GitHub на PythonAnywhere, создав «клон» репозитория. Введи следующую команду в консоли на PythonAnywhere (не забудь заменить <your-github-username>
на свою учётку GitHub):
{% filename %}PythonAnywhere command-line{% endfilename %}
$ git clone https://github.com/<your-github-username>/my-first-blog.git
Эта команда загрузит копию твоего кода на PythonAnywhere. Проверь это, набрав tree my-first-blog
:
{% filename %}PythonAnywhere command-line{% endfilename %}
$ tree my-first-blog
my-first-blog/
├── blog
│ ├── __init__.py
│ ├── admin.py
│ ├── migrations
│ │ ├── 0001_initial.py
│ │ └── __init__.py
│ ├── models.py
│ ├── tests.py
│ └── views.py
├── manage.py
└── mysite
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
Так же как ты делала на своем компьютере, ты можешь создать виртуальное окружение на PythonAnywhere. В консоли Bash введи следующую команду:
{% filename %}PythonAnywhere command-line{% endfilename %}
$ cd my-first-blog
$ virtualenv --python=python3.6 myvenv
Running virtualenv with interpreter /usr/bin/python3.6
[...]
Installing setuptools, pip...done.
$ source myvenv/bin/activate
(myvenv) $ pip install django~=1.11.0
Collecting django
[...]
Successfully installed django-1.11.3
Примечание: выполнение команды
pip install
может занять несколько минут. Терпение, терпение! Однако если это заняло больше 5 минут, что-то не так. Спроси своего инструктора.
Есть ещё одно отличие твоего локального компьютера и сервера — они используют разные базы данных. Таким образом, пользовательские аккаунты и записи в блоге на сервере и локальном компьютере могут отличаться друг от друга.
Нам нужно инициализировать базу данных на сервере так же, как мы это сделали на твоем компьютере, — с помощью команд migrate
и createsuperuser
:
{% filename %}PythonAnywhere command-line{% endfilename %}
(mvenv) $ python manage.py migrate
Operations to perform:
[...]
Applying sessions.0001_initial... OK
(mvenv) $ python manage.py createsuperuser
Теперь наш код загружен на PythonAnywhere, виртуальное окружение готово и база данных инициализирована — мы готовы опубликовать блог как веб-приложение!
Вернись в панель управления PythonAnywhere, нажав на лого в верхнем левом углу, затем переключись на вкладку Web и нажми кнопку Add a new web app.
После подтверждения доменного имени выбери Manual configuration (NB: не «Django»!) в диалоговом окне. Затем выбери Python 3.6 и заверши работу мастера.
Примечание: убедись, что ты выбрала опцию "Manual configuration", а не "Django". Мы слишком круты для стандартного настройщика PythonAnywhere для Django ;-)
Ты будешь перенесена на страницу настройки веб-приложения PythonAnywhere, куда тебе будет нужно заходить каждый раз, когда потребуется внести изменения в приложении на сервере.
В секции "Virtualenv" кликни по красному тексту "Enter the path to a virtualenv" и набери /home/<your-username>/my-first-blog/myvenv/
. Нажми на синий прямоугольник с галочкой, чтобы сохранить изменения, прежде чем двигаться дальше.
Примечание: замени имя пользователя на своё. Если ты допустишь ошибку, PythonAnywhere выдаст предупреждение.
Django использует протокол WSGI, стандартный протокол для обслуживания веб-сайтов, использующих Python, который поддерживается PythonAnywhere. Используя файл настроек WSGI, мы позволим PythonAnywhere распознать наш Django блог.
Кликни по ссылке "WSGI configuration file" (в секции «Code» наверху страницы — она будет выглядеть следующим образом: /var/www/<your-username>_pythonanywhere_com_wsgi.py
), и ты переключишься на редактор.
Удали все содержимое и замени его чем-то вроде этого:
{% filename %}<your-username>_pythonanywhere_com_wsgi.py{% endfilename %}
import os
import sys
path = os.path.expanduser('~/my-first-blog')
if path not in sys.path:
sys.path.append(path)
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
from django.core.wsgi import get_wsgi_application
from django.contrib.staticfiles.handlers import StaticFilesHandler
application = StaticFilesHandler(get_wsgi_application())
Задача данного файла — сказать PythonAnywhere, где находится наше веб-приложение и как называется файл настроек Django.
StaticFilesHandler
нужен для обработки наших CSS. Она происходит автоматически во время разработки при запуске runserver
. Мы чуть больше узнаем о статических файлах чуть позже, когда будем изменять стили нашего сайта.
Нажми Save и переключись на вкладку Web.
Мы всё сделали! Нажми на большую зеленую кнопку Reload, и можешь проверить своё приложение. Ссылку можно найти в верхней части страницы.
Если видишь ошибку при попытке посетить свой сайт, для получения отладочной информации первым делом просмотри журнал ошибок. Ссылку на него ты найдёшь на вкладке Web на PythonAnywhere. Посмотри, нет ли там сообщений о каких-нибудь ошибках; самые последние из них приведены ниже. Они включают:
-
Пропуск одного из шагов в консоли: создание virtualenv, её активация, установка Django в виртуальное окружение, инициализация базы данных.
-
Ошибка в пути к virtualenv — рядом должно появиться небольшое предупреждение, если PythonAnywhere не может найти виртуальное окружение по указанному адресу.
-
Ошибка в файле настроек WSGI — ты правильно указала путь к директории my-first-blog?
-
Ты выбрала одну и ту же версию Python для virtualenv и для веб-приложения? Обе должны быть 3.6.
- Также можешь посмотреть общие советы по отладке на вики PythonAnywhere.
И помни: твой инструктор здесь, чтобы помогать тебе!
Стандартная страница твоего сайта должна включать приветствие "Welcome to Django", точно так же как было на локальном компьютере. Попробуй добавить /admin/
к концу адреса сайта, и перейдёшь к панели администратора сайта. Войди под своим именем и паролем и увидишь форму для добавления новых записей в блог.
После того, как создашь несколько записей, ты можешь вернуться к своей локальной версии приложения (а не на PythonAnywhere). С этого момента для внесения изменений тебе нужно работать в своей локальной версии. Это обычный подход в веб-программировании: изменять код локально, загружать изменения на GitHub, а затем подтягивать изменения на сервер с сайтом. Такой подход позволяет тебе работать и экспериментировать, не рискуя сломать свой сайт. Круто, правда?
Ты заслужила огромную похвалу! Развёртывание сервера — одна из самых каверзных частей веб-разработки, и нередко уходит несколько дней, прежде чем заставишь всё работать. А у нас уже есть работающий в сети веб-сайт, вот так вот!