, чтобы она была чуть меньше временнуй метки .
В точке
располагается элемент div с классом panel-body
, который содержит фактический текст записи. Обратите внимание: код Django для включения инфор- мации на страницу вообще не изменился; изменились только элементы, влияющие на внешний вид страницы.
Рис. 20.3. Страница темы с оформлением Bootstrap
448 Глава 20 • Оформление и развертывание приложения
На рис. 20.3 изображена страница темы с новым оформлением. Функциональность приложения Learning Log не изменилась, но приложение выглядит более привле- кательно и заманчиво для пользователя.
ПРИМЕЧАНИЕ
Если вы хотите использовать другой шаблон Bootstrap, действуйте в той же последователь- ности, которая уже использовалась в этой главе . Скопируйте шаблон в base .html и измените элементы, содержащие контент, чтобы шаблон отображал информацию вашего проекта . Затем воспользуйтесь средствами индивидуального стилевого оформления Bootstrap для оформления содержимого каждой страницы .
УПРАЖНЕНИЯ
20-1 . Другие формы: мы применили стили Bootstrap к страницам login и add_topic . Внесите аналогичные изменения в другие страницы на базе форм: new_entry, edit_entry и register .
20-2 . Стилевое оформление Blog: используйте Bootstrap для стилевого оформления проекта
Blog из главы 19 .
Развертывание Learning Log
После того как проекту был придан профессиональный вид, мы развернем его на реальном сервере, чтобы любой пользователь с подключением к Интернету мог работать с приложением. Мы воспользуемся Heroku — веб-платформой, позволя- ющей управлять развертыванием веб-приложений.
Процесс для системы Windows несколько отличается от процесса в Linux и OS X.
Если вы работаете в Windows, обращайте внимание на врезки, указывающие, какие изменения следует внести в вашей системе.
Создание учетной записи Heroku
Чтобы создать учетную запись, откройте сайт https://heroku.com/ и щелкните на одной из регистрационных ссылок. Учетные записи создаются бесплатно, и Heroku предоставляет бесплатный уровень для тестирования проектов в реаль- ных условиях.
ПРИМЕЧАНИЕ
На бесплатном уровне Heroku существуют свои ограничения (например, количество приложений, которые можно развернуть, и частоту посещения приложения пользователями) . Впрочем, эти огра- ничения достаточно либеральны, чтобы вы могли потренироваться в развертывании приложений без каких-либо затрат .
Установка инструментария Heroku Toolbelt
Чтобы развернуть проект на серверах Heroku и управлять им, вам понадобятся ин- струменты из пакета Heroku Toolbelt. Чтобы установить новейшую версию Heroku
Toolbelt, откройте сайт https://toolbelt.heroku.com/ и выполните указания для своей
Развертывание Learning Log
449операционной системы. В них содержится либо однострочная терминальная коман- да, либо программа установки, которую вы можете загрузить и запустить.
Установка необходимых пакетов
Вам также придется установить ряд пакетов, упрощающих работу проектов
Django на реальных серверах. В активной виртуальной среде введите следующие команды:
(ll_env)learning_log$
pip install dj-database-url(ll_env)learning_log$
pip install dj-static(ll_env)learning_log$
pip install static3(ll_env)learning_log$
pip install gunicornОбязательно вводите команды по одной, чтобы вы знали, если при установке како- го-либо пакета возникнет проблема. Пакет dj-database-url помогает Django взаи-
модействовать с базой данных, используемой Heroku, пакеты dj-static и static3
позволяют Django правильно управлять статическими файлами, а gunicorn
— сер- вер, способный предоставлять доступ к приложениям в реальной среде. (Статиче- ские файлы содержат стилевые правила и файлы JavaScript.)
ПРИМЕЧАНИЕНекоторые из необходимых пакетов могут не установиться в Windows, но не огорчайтесь, если при попытке установки вы получите сообщение об ошибке . Важнее добиться того, чтобы пакеты были установлены Heroku для развернутого приложения, а этим мы займемся в следующем разделе .
Создание списка пакетов с файлом requirements .txt
Heroku необходимо знать, от каких пакетов зависит наш проект, поэтому мы вос- пользуемся pip для построения файла со списком. Оставаясь в активной виртуаль- ной среде, введите следующую команду:
(ll_env)learning_log$ pip freeze >
requirements.txtКоманда freeze приказывает pip записать имена всех пакетов, в настоящее время установленных в системе, в файл requirements .txt
. Откройте файл requirements .txt и просмотрите пакеты и номера версий, установленных в вашей системе (возможно, пользователи Windows не увидят какие-то строки):
requirements.txtDjango==1.8.4 dj-database-url==0.3.0 dj-static==0.0.6 django-bootstrap3==6.2.2 gunicorn==19.3.0
static3==0.6.1
Приложение Learning Log уже зависит от шести разных пакетов с конкретными номерами версий, поэтому для его правильной работы требуется конкретная кон- фигурация среды. При развертывании Learning Log Heroku устанавливает все па-
450 Глава 20 • Оформление и развертывание приложения кеты, перечисленные в requirements .txt
, и создает среду с теми же пакетами, которые мы используем локально. По этой причине разработчик может быть уверен в том, что развернутый проект будет работать точно так же, как в его локальной системе.
Вы поймете, насколько это полезно, когда начнете строить и вести в своей системе несколько разных проектов.
Затем необходимо добавить в список пакет psycopg2
, который помогает Heroku управлять базой данных. Откройте файл requirements .txt и добавьте строку psycopg2>=2.6.1
. Эта строка устанавливает версию 2.6.1 пакета psycopg2
(или более новую версию, если она доступна):
requirements.txt
Django==1.8.4
dj-database-url==0.3.0
dj-static==0.0.6
django-bootstrap3==6.2.2
gunicorn==19.3.0
static3==0.6.1
psycopg2>=2.6.1
Если какие-либо пакеты не установлены в вашей системе, добавьте их. В итоге ваш файл requirements .txt должен включать каждый из приведенных выше пакетов. Если пакет входит в список вашей системы, но номер версии отличается от приведенной, оставьте версию вашей системы.
ПРИМЕЧАНИЕ
Если вы работаете в системе Windows, убедитесь в том, что ваша версия requirements .txt соответ- ствует приведенному списку, — независимо от того, какие пакеты вам удалось установить в вашей системе .
Назначение исполнительной среды Python
Если вы не укажете версию Python, то Heroku будет использовать собственную версию Python по умолчанию. Убедитесь в том, что Heroku использует ту же вер- сию Python, которая используется у вас. В активной виртуальной среде введите команду python
--version
:
(ll_env)learning_log$ python --version
Python 3.5.0
В этом примере я использую Python 3.5.0. Создайте новый файл с именем runtime .
txt в одном каталоге с файлом manage .py и введите следующую команду:
runtime.txt
python-3.5.0
Этот файл должен содержать одну строку с версией Python, заданной точно в по- казанном формате: python в нижнем регистре, затем дефис и номер версии из трех частей.
Развертывание Learning Log
451ПРИМЕЧАНИЕЕсли вы получите сообщение об ошибке, в котором сказано, что запрашиваемая исполнительная среда Python недоступна, откройте страницу https://devcenter .heroku .com/ и щелкните на ссылке
Python, затем найдите ссылку Specifying a Python Runtime .
Просмотрите текст статьи, найдите до- ступные варианты исполнительной среды и выберите тот вариант, который ближе всего к вашей версии Python .
Изменение файла settings .py для Heroku
Затем в конец файла settings .py необходимо добавить раздел для определения на- строек, предназначенных конкретно для среды Heroku:
settings.py# Настройки для django-bootstrap3
BOOTSTRAP3 = {
'include_jquery': True,
}
# Настройки Heroku
if os.getcwd() == '/app':
import dj_database_url
DATABASES = {
'default': dj_database_url.config(default='postgres://localhost')
}
# Поддержка заголовка 'X-Forwarded-Proto' для request.is_secure().
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
# Разрешены все заголовки хостов.
ALLOWED_HOSTS = ['*']
# Конфигурация статических ресурсов
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
STATIC_ROOT = 'staticfiles'
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)
В точке используется функция getcwd()
, которая возвращает текущий рабочий каталог, из которого был запущен файл. В схеме развертывания Heroku таким каталогом всегда является
/app
. При локальном развертывании каталог обычно совпадает с именем папки проекта (
learning_log в нашем случае). Проверка if гарантирует, что настройки в этом блоке будут применяться только при разверты- вании проекта в Heroku. Такая структура позволяет создать один файл настроек, который подойдет как для локальной среды разработки, так и для развертывания на сервере.
В точке импортируется модуль dj_database_url
, упрощающий настройку базы данных в Heroku. Heroku использует PostgreSQL (или Postgres) — более мощ- ную базу данных, чем SQLite; эти параметры настраивают проект для работы с Postgres в среде Heroku. Остальные настройки обеспечивают поддержку запросов
452 Глава 20 • Оформление и развертывание приложения
HTTPS , правильный доступ к проекту с URL Heroku и правильное размеще- ние статических файлов на Heroku .
Создание файла Procfile для запуска процессов
Файл
Procfile сообщает Heroku, какие процессы должны запускаться для правиль- ной работы проекта. Это однострочный файл, который должен быть сохранен под именем
Procfile
(символ
P
верхнего регистра, без расширения) в одном каталоге с файлом manage .py
. Содержимое Procfile выглядит так:
Procfile
web: gunicorn learning_log.wsgi --log-file -
Эта строка приказывает Heroku использовать для приложения сервер gunicorn
, а при запуске приложения загрузить настройки из файла learning_log/wsgi .py
Флаг log-file сообщает Heroku, какие события должны регистрироваться в жур- нале.
Изменение файла wsgi .py для Heroku
Также необходимо внести изменения в файл wsgi .py для Heroku, потому что конфигурация для Heroku несколько отличается от той, которая использовалась ранее:
wsgi.py
import os from django.core.wsgi import get_wsgi_application from dj_static import Cling os.environ.setdefault("DJANGO_SETTINGS_MODULE", "learning_log.settings")
application = Cling(get_wsgi_application())
Мы импортируем приложение Cling, упрощающее организацию доступа к стати- ческим файлам, и используем его для запуска приложения. Этот код также будет работать локально, так что помещать его в блок if не нужно.
Создание каталога для статических файлов
В среде Heroku Django собирает все статические файлы и размещает их в одном месте для эффективного управления. Для этих статических файлов мы создадим специальный каталог. В каталоге learning_log
, с которыми работали ранее, находится другой каталог с именем learning_log
. В этом вложенном каталоге создайте новый подкаталог с именем static
; таким образом, полный путь имеет вид learning_log/
learning_log/static/
. Также необходимо создать временный файл-«заполнитель» в этом каталоге, потому что при загрузке на Heroku пустые каталоги не включаются в проект. Создайте в каталоге static/
файл с именем placeholder .txt
:
Развертывание Learning Log
453placeholder.txtЭтот файл необходим для включения в проект каталога learning_log/static/.
Django собирает статические файлы и помещает их в каталог learning_log/static/.
В этом тексте нет ничего особенного; он просто напоминает, почему этот файл был включен в проект.
Локальное использование сервера gunicorn
Если вы используете Linux или OS X, вы можете попробовать использовать сервер gunicorn локально, прежде чем развертывать его на сервере Heroku. В активной виртуальной среде выполните команду heroku local
, чтобы запустить процессы, определенные в
Procfile
:
(ll_env)learning_log$
heroku localInstalling Heroku Toolbelt v4... done forego | starting web.1 on port 5000
web.1 | [2015-08-13 22:00:45 -0800] [12875] [INFO] Starting gunicorn 19.3.0
web.1 | [2015-08-13 22:00:45 -0800] [12875] [INFO] Listening at:
http://0.0.0.0:5000 (12875)
web.1 | [2015-08-13 22:00:45 -0800] [12878] [INFO] Booting worker with pid:
12878
При первом выполнении heroku local будет установлен набор пакетов из Heroku
Toolbelt. Из
выходных данных видно, что в приведенном примере сервер gunicorn был запущен с идентификатором процесса 12875 . В точке gunicorn прослу- шивает запросы на порте 5000. Кроме того, gunicorn запускает рабочий процесс
(12878), который будет помогать в обслуживании запросов .
Откройте адрес
http://localhost:5000/ и убедитесь в том, что все работает; домашняя страница Learning Log должна выглядеть так же, как она выглядит при использо- вании сервера Django (
runserver
). Нажмите Ctrl+C, чтобы остановить процессы, запущенные командой heroku local
. При локальной разработке продолжайте ис- пользовать runserver
ПРИМЕЧАНИЕВ системе Windows gunicorn работать не будет; пропустите этот шаг, если вы используете Windows .
Это не повлияет на возможность развертывания проекта в Heroku .
Использование Git для управления файлами проекта
Если вы дочитали главу 17, то вы уже знаете, что Git — программа контроля версий, которая позволяет создать «мгновенный снимок» состояния кода про- екта при реализации каждой новой функции. Это позволяет легко вернуться к последнему работоспособному состоянию проекта при возникновении каких- либо проблем (например, если в ходе работы над новой функцией была случайно внесена ошибка).
454 Глава 20 • Оформление и развертывание приложения
Если в вашем проекте используется Git, это означает, что вы можете работать над новой функциональностью, не беспокоясь о том, чтобы ничего не нарушить. Раз- вертывая проект на сервере, вы должны убедиться в том, что вы развертываете работоспособную версию проекта. Если вы захотите больше узнать о Git и контроле версий, обращайтесь к приложению Г.
Установка Git
Git входит в инструментарий Heroku Toolbelt, так что пакет Git уже должен быть установлен в вашей системе. Однако система Git будет недоступна в терминальных окнах, которые были открыты перед установкой Heroku Toolbelt, поэтому откройте новое терминальное окно и введите команду git
--version
:
(ll_env)learning_log$
git --versiongit version 2.5.0
Если вы получите сообщение об ошибке, обращайтесь к инструкциям по установке
Git в приложении Г.
Настройка Git
Git следит за тем, кто внес изменения в проект, даже в том случае, если над про- ектом работает только один человек. Для этого Git необходимо знать ваше имя пользователя и адрес электронной почты. Имя пользователя ввести обязательно, но ничто не мешает вам ввести вымышленный адрес электронной почты для учеб- ных проектов:
(ll_env)learning_log$
git config --global user.name "ehmatthes"(ll_env)learning_log$
git config --global user.email "eric@example.com"Если вы забудете об этом шаге, Git запросит у вас эту информацию при первом закреплении.
Игнорирование файлов
Нам не нужно, чтобы система Git отслеживала все файлы в проекте, поэтому мы прикажем Git игнорировать некоторые файлы. Создайте файл с именем
.gitignore в папке с файлом manage .py
. Обратите внимание: имя файла начинается с точки, а файл не имеет расширения. Содержимое
.gitignore выглядит так:
.gitignorell_env/
__pycache__/
*.sqlite3
Мы приказываем Git игнорировать весь каталог ll_env
, потому что мы можем ав- томатически воссоздать его в любой момент. Также в системе контроля не отсле- живается каталог
__pycache__
с файлами
.pyc
, которые создаются автоматически, когда Django выполняет файлы
.py
. Мы не
отслеживаем изменения в локальной базе данных, потому что так поступать вообще нежелательно: если на сервере бу-
Развертывание Learning Log 455
дет использоваться SQLite, вы можете случайно переписать «живую» базу данных локальной тестовой базой данных при отправке проекта на сервер.
ПРИМЕЧАНИЕ
Если вы используете Python 2 .7, замените __pycache__ на * .pyc, потому что Python 2 .7 не создает каталог __pycache__ .
Закрепление состояния проекта
Чтобы инициализировать репозиторий Git для Learning Log, добавьте все необ- ходимые файлы в репозиторий и закрепите исходное состояние проекта. Вот как это делается:
(ll_env)learning_log$ git init
Initialized empty Git repository in /home/ehmatthes/pcc/learning_log/.git/
(ll_env)learning_log$ git add .
(ll_env)learning_log$ git commit -am "Ready for deployment to heroku."
[master (root-commit) dbc1d99] Ready for deployment to heroku.
43 files changed, 746 insertions(+) create mode 100644 .gitignore create mode 100644 Procfile
--snip-- create mode 100644 users/views.py
(ll_env)learning_log$ git status
# On branch master nothing to commit, working directory clean
(ll_env)learning_log$
В точке вводится команда git init
, которая инициализирует пустой репозито- рий в каталоге, содержащем Learning Log. В точке команда git add.
добавляет все файлы (кроме игнорируемых) в репозиторий (не забудьте точку). В точке вводится команда git commit
-am
сообщение: флаг
-a приказывает Git включить все измененные файлы в закрепленное состояние, а флаг
-m приказывает Git сохранить сообщение в журнале.
Вывод команды git status
сообщает, что текущей является главная ветвь, а рабо- чий каталог пуст. Этот статус должен выводиться каждый раз, когда вы отправляете свой проект на Heroku.
Отправка проекта
Наконец-то все готово для отправки проекта на сервер Heroku. В активном терми- нальном сеансе введите следующие команды:
(ll_env)learning_log$ heroku login
Enter your Heroku credentials.
Email: eric@example.com
Password (typing will be hidden):
Logged in as eric@example.com
(ll_env)learning_log$ heroku create
Creating afternoon-meadow-2775... done, stack is cedar-14 https://afternoon-meadow-2775.herokuapp.com/ |
456 Глава 20 • Оформление и развертывание приложения https://git.heroku.com/afternoon-meadow-2775.git
Git remote heroku added
(ll_env)learning_log$ git push heroku master
remote: -----> Launching... done, v6
remote: https://afternoon-meadow-2775.herokuapp.com/ deployed to Heroku remote: Verifying deploy.... done.
To https://git.heroku.com/afternoon-meadow-2775.git bdb2a35..62d711d master -> master
(ll_env)learning_log$
Сначала войдите на сервер Heroku в терминальном сеансе с именем пользователя и паролем, использованными при создании учетной записи на https://heroku.com/ .
Затем прикажите Heroku построить пустой проект . Heroku генерирует имя, со- стоящее из двух слов и числа; позднее вы сможете его изменить. Затем вводится команда git push heroku master
, которая приказывает Git отправить главную ветвь проекта в репозиторий, только что созданный Heroku. После этого Heroku строит проект на своих серверах с использованием этих файлов. В точке указы- вается URL, который будет использоваться для обращения к развернутому проекту.
После ввода этих команд проект развернут, но еще не настроен полностью. Чтобы проверить, что серверный процесс был запущен правильно, введите команду heroku ps
:
(ll_env)learning_log$ heroku ps
Free quota left: 17h 40m
=== web (Free): `gunicorn learning_log.wsgi __log-file -`
web.1: up 2015/08/14 07:08:51 ( 10m ago)
(ll_env)learning_log$
В выходных данных указано, сколько еще времени проект может оставаться актив- ным на протяжении следующих 24 часов . На момент написания книги Heroku позволяет бесплатно развернутым проектам оставаться активными до 18 часов за 24-часовой период. При нарушении этого лимита отображается стандартная серверная страница ошибки; вскоре мы изменим ее. В точке запускается процесс, определенный в
Procfile
Теперь мы можем открыть приложение в браузере командой heroku open
:
(ll_env)learning_log$ heroku open
Opening afternoon-meadow-2775... done
Команда избавляет вас от необходимости открывать браузер и вводить URL, который вы получили от Heroku, но при желании сайт можно открыть и так. Вы увидите домашнюю страницу Learning Log с правильным оформлением. Впрочем, с приложением еще работать нельзя, потому что база данных не подготовлена.
ПРИМЕЧАНИЕ
Процесс развертывания приложений на серверах Heroku время от времени изменяется . Если у вас возникнут неразрешимые проблемы, обращайтесь к документации Heroku за помощью . Откройте страницу https://devcenter .heroku .com/ и щелкните на ссылке Python, затем найдите ссылку Getting
Started with Django . Если вы не понимаете то, что там написано, обратитесь к рекомендациям в приложении В .
Развертывание Learning Log
457Подготовка базы данных в Heroku
Вы должны выполнить команду migrate
, чтобы подготовить базу данных и приме- нить все миграции, сгенерированные в ходе разработки. Для выполнения команд
Django и Python в проектах Heroku используется команда heroku run
. Пример вы- полнения команды migrate в среде разработки Heroku:
(ll_env)learning_log$
heroku run python manage.py migrate
Running `python manage.py migrate` on afternoon-meadow-2775... up, run.2435
Running migrations:
Applying learning_logs.0001_initial...
OK
Applying learning_logs.0002_entry...
OK
Applying learning_logs.0003_topic_user...
OK
Applying sessions.0001_initial...
OK
(ll_env)learning_log$
Сначала мы вводим команду heroku run python manage.py migrate
. Heroku соз- дает терминальный сеанс для выполнения команды migrate
. В точке Django применяет миграции по умолчанию, а также миграции, сгенерированные в ходе разработки Learning Log.
Теперь при обращении к развернутому приложению вы сможете использовать его так же, как это делалось в локальной системе. Однако при этом вы не увидите ни- какие данные, введенные при локальном развертывании, потому что мы не скопи- ровали данные на сервер. Это обычная практика: локальные данные почти никогда не копируются на сервер, потому что они чаще всего являются тестовыми.
Если вы перешлете ссылку на Heroku, получатель сможет работать с вашей верси- ей приложения Learning Log. В следующем разделе мы выполним еще несколько операций, чтобы завершить процесс развертывания и подготовиться к дальнейшей разработке Learning Log.
Доработка
развернутого приложенияВ этом разделе мы доработаем развернутое приложение и создадим суперпользова- теля (так же, как это было сделано в локальной версии). Заодно мы повысим уро- вень защиты проекта, переведя настройку отладочного режима
DEBUG
в состояние
False
, чтобы пользователи не получали в сообщениях об ошибке дополнительной информации, которая может использоваться для проведения атак на сервер.
Создание суперпользователя в Heroku
Вы уже видели, что для выполнения одиночных команд может использоваться команда heroku run
. Однако команды также можно выполнять, открыв терми- нальный сеанс Bash при подключении к серверу Heroku командой heroku run bash
Bash — язык, который работает во многих терминалах Linux. Мы используем тер- минальный сеанс Bash для создания суперпользователя, чтобы иметь возможность обратиться к административному сайту в развернутом приложении:
458 Глава 20 • Оформление и развертывание приложения
(ll_env)learning_log$ heroku run bash
Running `bash` on afternoon-meadow-2775... up, run.6244
$ ls
learning_log learning_logs manage.py Procfile requirements.txt runtime.txt users staticfiles
$ python manage.py createsuperuser
Username (leave blank to use 'u41907'): ll_admin
Email address:
Password:
Password (again):
Superuser created successfully.
$ exit
exit
(ll_env)learning_log$
В точке команда ls выводит информацию о файлах и каталогах, существующих на сервере; это те же файлы, которые присутствуют в нашей локальной системе.
В этой файловой системе можно перемещаться так же, как и в любой другой.
ПРИМЕЧАНИЕ
Пользователи Windows должны использовать те же команды (например, ls вместо dir), потому что они работают с терминалом Linux через удаленное подключение .
В точке выполняется команда создания суперпользователя. Она выдает тот же вывод, который был получен в локальной системе при создании суперпользовате- ля в главе 18. После того как создание суперпользователя в терминальном сеансе будет завершено, введите команду exit для возвращения к терминальному сеансу локальной системы .
Теперь вы можете добавить /admin/ в конец URL-адреса развернутого приложения, чтобы войти на административный сайт. У меня этот URL-адрес имеет вид https://
afternoon-meadow-2775.herokuapp.com/admin/.
Если другие пользователи уже начали работать с вашим проектом, учтите, что вам будут доступны все их данные! Относитесь к конфиденциальности серьезно, и пользователи начнут доверять вам свои данные.
Создание удобного URL-адреса на Heroku
Вероятно, вы бы предпочли использовать более удобные и запоминающиеся URL- адреса, чем https://afternoon-meadow-2775.herokuapp.com/. Чтобы переименовать приложение, достаточно одной команды:
(ll_env)learning_log$ heroku apps:rename learning-log
Renaming afternoon-meadow-2775 to learning-log... done https://learning-log.herokuapp.com/ | https://git.heroku.com/learning-log.git
Git remote heroku updated
(ll_env)learning_log$
Имя может содержать буквы, цифры и дефисы и выбирается произвольно (при условии, что никто другой еще не занял это имя). Развернутая версия теперь доступна по адресу
https://learning-log.herokuapp.com/. По предыдущему URL-адресу проект теперь не- доступен; команда apps:rename полностью перемещает проект на новый URL-адрес.
Развертывание Learning Log
459ПРИМЕЧАНИЕПри развертывании проекта на бесплатном сервисе Heroku переводит развернутое приложение в спящий режим, если оно не получало запросов в течение определенного периода времени или было слишком активным для бесплатного уровня . При первом обращении к сайту после перехода в спящий режим загрузка займет больше времени, но последующие запросы будут обрабатываться быстрее . Такой подход позволяет Heroku предоставлять бесплатное развертывание .
Безопасность проекта
В текущем варианте развертывания проекта существует одна очевидная про- блема: настройка
DEBUG=True в файле settings .py
, включающая вывод отладочных сообщений при возникновении ошибок. Страницы ошибок Django предоставляют критическую отладочную информацию при разработке проекта, но они
также дают слишком много информации хакерам, если оставить их включенными на рабочем сервере. Также необходимо проследить за тем, чтобы никто не мог получать ин- формацию или перенаправлять запросы, выдавая себя за хост проекта.
Изменим файл settings .py
, чтобы сообщения об ошибках выводились локально, но не в развернутой версии:
settings.py# Настройки Heroku if os.getcwd() == '/app':
# Поддержка заголовка 'X-Forwarded-Proto' для request.is_secure().
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
# Хостом проекта может быть только Heroku.
ALLOWED_HOSTS = ['learning-log.herokuapp.com']
DEBUG = False
# Конфигурация статических ресурсов.
Необходимо внести только два изменения: в точке изменяется настройка
ALLOWED_HOSTS
, чтобы хостом проекта мог быть только сервер Heroku. Используйте имя своего приложения — сгенерированное Heroku (как
afternoon-meadow-2775.herokuapp.com в нашем примере) или выбранное вами. В точке переменной
DEBUG
присваивается значение
False
, чтобы при возникновении ошибок не раскрывалась конфиденциальная информация.
Закрепление и отправка изменений
Теперь изменения, внесенные в settings .py
, необходимо закрепить в репозитории
Git, а затем отправить их на Heroku. Следующий терминальный сеанс показывает, как это делается:
(ll_env)learning_log$
git commit -am "Set DEBUG=False for Heroku." [master 081f635] Set DEBUG=False for Heroku.
460 Глава 20 • Оформление и развертывание приложения
1 file changed, 4 insertions(+), 2 deletions(-)
(ll_env)learning_log$ git status
# On branch master nothing to commit, working directory clean
(ll_env)learning_log$
Мы вводим команду git commit с коротким, но содержательным сообщением .
Напомню, что флаг
-am обеспечивает закрепление всех изменившихся файлов и регистрацию сообщения в журнале. Git видит, что изменился один файл, и за- крепляет изменение в репозитории.
В точке из статусной информации видно, что мы работаем с главной ветвью репозитория, а новые изменения для закрепления отсутствуют. Очень важно про- верять статусную информацию перед отправкой на Heroku. Если вы не видите сообщение, значит, некоторые изменения не были закреплены, и они не будут от- правлены на сервер. Попробуйте снова ввести команду commit
, а если вы не уверены в том, как решить проблему, — прочитайте приложение Г, чтобы лучше понять, как работать с Git.
Теперь отправим обновленный репозиторий на Heroku:
(ll_env)learning_log$ git push heroku master
remote: -----> Python app detected remote: -----> Installing dependencies with pip remote: -----> Launching... done, v8 remote: https://learning-log.herokuapp.com/ deployed to Heroku remote: Verifying deploy.... done.
To https://git.heroku.com/learning-log.git
4c9d111..ef65d2b master -> master
(ll_env)learning_log$
Heroku видит, что репозиторий обновился, и заново строит проект, чтобы все из- менения были учтены. База данных при этом не воссоздается, поэтому выполнять migrate для этого обновления не придется.
Чтобы убедиться в том, что развертывание стало более безопасным, введите URL проекта с расширением, которое не было определено. Например, попробуйте открыть страницу http://learning-log.herokuapp.com/letmein/. Должна появиться обобщенная страница, которая не сообщает никакой конкретной информации о проекте. Если же вы попробуете применить тот же запрос с локальной версией
Learning Log по адресу http://localhost:8000/letmein/, должна появиться стандартная страница ошибки Django. Получается именно то, что нужно: вы будете получать содержательные сообщения об ошибках в процессе разработки проекта, но оградите пользователей от критической информации о коде проекта.
Создание специализированных страниц ошибок
В главе 19 мы настроили приложение Learning Log так, чтобы при запросе темы или записи, которая ему не принадлежит, пользователь получал ошибку 404. Ве-
Развертывание Learning Log
461роятно, вы также сталкивались с примерами ошибок 500 (внутренние ошибки).
Ошибка 404 обычно означает, что код Django правилен, но запрашиваемый объект не существует; ошибка 500 обычно означает, что в написанном вами коде суще- ствует ошибка (например, ошибка в функции из views .py
). В настоящее время
Django возвращает одну обобщенную страницу ошибки в обеих ситуациях, но мы можем написать собственные шаблоны страниц ошибок 404 и 500, которые соот- ветствуют общему оформлению Learning Log. Эти шаблоны должны находиться в корневом каталоге шаблонов.
Создание пользовательских шаблонов
В папке learning_log/learning_log создайте новую папку с именем templates
. Затем создайте новый файл с именем
404 .html
:
404.html{% extends "learning_logs/base.html" %}
{% block header %}