Книга Изучаем Python
Скачать 4.68 Mb.
|
The item you requested is not available. (404){% endblock header %} Этот простой шаблон предоставляет ту же информацию, что и обобщенная стра- ница ошибки 404, но его оформление соответствует остальным страницам сайта. Создайте другой файл с именем 500 .html : 500.html {% extends "learning_logs/base.html" %} {% block header %} There has been an internal error. (500){% endblock header %} Новые файлы потребуют небольших изменений в settings .py settings.py TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'learning_log/templates')], 'APP_DIRS': True, }, ] Это изменение приказывает Django искать шаблоны страниц ошибок в корневом каталоге шаблонов. Локальный просмотр страниц ошибок Если вы хотите посмотреть, как будут выглядеть страницы ошибок, в своей системе перед отправкой на сервер Heroku, вам сначала придется установить в локальных 462 Глава 20 • Оформление и развертывание приложения настройках режим Debug=False , чтобы подавить выдачу отладочных страниц Django по умолчанию. Для этого внесите следующие изменения в settings .py (убедитесь в том, что вы работаете в части settings .py , относящейся к локальной среде, — а не той, которая относится к Heroku): settings.py # SECURITY WARNING: don't run with debug turned on in production! DEBUG = False ALLOWED_HOSTS = ['localhost'] Если DEBUG присвоено значение False , в ALLOWED_HOSTS должен быть указан хотя бы один хост. Теперь запросите тему или запись, которая вам не принадлежит, чтобы увидеть страницу ошибки 404. Затем запросите несуществующий URL-адрес (на- пример, localhost:8000/letmein/), чтобы увидеть страницу ошибки 500. Завершив проверку, верните DEBUG значение True , чтобы продолжить разработку Learning Log. (Проследите за тем, чтобы настройка DEBUG содержала False в разделе settings .py , относящемся к развертыванию в среде Heroku.) ПРИМЕЧАНИЕ Страница ошибки 500 не содержит никакой информации о текущем пользователе, потому что Django не включает контекстную информацию в ответ при возникновении ошибки сервера . Отправка изменений на Heroku Теперь необходимо закрепить изменения в шаблоне и отправить их на Heroku: (ll_env)learning_log$ git add . (ll_env)learning_log$ git commit -am "Added custom 404 and 500 error pages." 3 files changed, 15 insertions(+), 10 deletions(-) create mode 100644 learning_log/templates/404.html create mode 100644 learning_log/templates/500.html (ll_env)learning_log$ git push heroku master remote: Verifying deploy.... done. To https://git.heroku.com/learning-log.git 2b34ca1..a64d8d3 master -> master (ll_env)learning_log$ В точке выдается команда git add , потому что в проекте были созданы новые файлы, и теперь нужно приказать Git начать отслеживание этих файлов. Затем мы закрепляем изменения и отправляем обновленный проект на Heroku . Теперь страницы ошибок имеют такое же оформление, как остальные страницы сайта, а приложение выглядит более профессионально при возникновении ошибок. Использование метода get_object_or_404() На данный момент, если пользователь вручную запрашивает несуществующую тему или запись, он получает ошибку сервера 500. Django пытается отобразить Развертывание Learning Log 463 страницу, но не располагает достаточной информацией для этого, что приводит к ошибке 500. Такая ситуация более точно обрабатывается как ошибка 404, и это поведение можно реализовать при помощи вспомогательной функции Django get_object_or_404() . Эта функция пытается получить запрошенный объект из базы данных, а если этот объект не существует — инициирует исключение 404. Мы им- портируем эту функцию в views .py и используем ее вместо get() : views.py from django.shortcuts import render, get_object_or_404 from django.http import HttpResponseRedirect, Http404 @login_required def topic(request, topic_id): """Выводит одну тему и все ее записи.""" topic = get_object_or_404(Topic, id=topic_id) # Проверка того, что тема принадлежит текущему пользователю. Теперь при запросе несуществующей темы (например, http://localhost:8000/ topics/999999/) появляется страница ошибки 404. Чтобы развернуть это измене- ние, выполните закрепление и отправьте проект на Heroku. Текущая разработка Возможно, вы захотите продолжить разработку Learning Log после исходной от- правки данных на сервер или создать и развернуть собственные проекты. Суще- ствует достаточно четко определенный процесс обновления проектов. Сначала все необходимые изменения вносятся в локальный проект. Если измене- ния приводят к появлению новых файлов, добавьте эти файлы в репозиторий Git командой git add (не забудьте точку в конце команды). Эта команда необходима для любого изменения, требующего миграции базы данных, потому что для каждой миграции генерируется новый файл миграции. Затем закрепите изменения в репозитории командой git commit -am " сообщение " Отправьте изменения на Heroku командой git push heroku master . Если вы провели локальную миграцию базы данных, также необходимо провести миграцию и для базы данных развернутого приложения. Либо используйте одноразовую команду heroku run python manage.py migrate , либо откройте удаленный терминальный сеанс командой heroku run bash и выполните команду python manage.py migrate . Затем посетите свой проект и убедитесь в том, что предполагаемые изменения вступили в силу. В этом процессе легко допустить ошибку, так что не удивляйтесь, если что-то пойдет не так. Если код не работает, проанализируйте то, что было сделано, и по- пробуйте найти ошибку. Если найти ошибку не удается или вы не можете понять, как ее отменить, обращайтесь к рекомендациям в приложении В. Не стесняйтесь обращаться за помощью: все остальные учились строить проекты и задавали те же вопросы, которые возникнут и у вас, так что вы наверняка найдете кого-нибудь, 464 Глава 20 • Оформление и развертывание приложения кто согласится помочь. Решение всех возникающих проблем поможет развивать ваши навыки до того момента, когда вы начнете строить содержательные, надежные проекты и отвечать на вопросы других людей. Параметр SECRET_KEY Django использует значение настройки SECRET_KEY из файла settings .py для реали- зации некоторых протоколов безопасности. В нашем проекте файл настроек был закреплен с включением настройки SECRET_KEY . Для учебного проекта этого до- статочно, но на реальном сайте с настройкой SECRET_KEY следует действовать более осторожно. Если вы строите проект, предназначенный для реальной эксплуатации, обязательно изучите вопрос, как повысить безопасность настройки SECRET_KEY Удаление проекта с Heroku Очень полезно многократно отработать процесс развертывания на одном про- екте или серии малых проектов, чтобы получить представление о развертывании. Однако вы должны знать, как удалить проект после развертывания. Heroku также может ограничивать количество бесплатно развернутых проектов, и загромождать учетную запись учебными проектами нежелательно. Войдите на веб-сайт Heroku (https://heroku.com/), и вы будете перенаправлены на страницу со списком проек- тов. Щелкните на проекте, который нужно удалить; открывается новая страница с информацией о проекте. Щелкните на ссылке Settings , прокрутите список и най- дите ссылку для удаления проекта. Отменить удаление не удастся, поэтому Heroku предложит подтвердить удаление, для чего вам нужно будет вручную ввести имя проекта. Если вы предпочитаете работать в терминальном режиме, проект также можно удалить командой destroy : (ll_env)learning_log$ heroku apps:destroy --app имя_приложения Здесь имя_приложения — имя вашего проекта (например, afternoon-meadow-2775 или learning-log , если проект был переименован). Вам также будет предложено снова ввести имя проекта, чтобы подтвердить удаление. ПРИМЕЧАНИЕ При удалении проекта на Heroku с локальной версией проекта ничего не происходит . Если никто не использовал ваш развернутый проект и вы просто отрабатываете процесс развертывания, ничто не мешает вам удалить свой проект на Heroku и развернуть его заново . УПРАЖНЕНИЯ 20-3 . Блог в Интернете: разверните проект Blog, над которым вы работали ранее, на сер- вере Heroku . Проследите за тем, чтобы настройка DEBUG имела значение False, и измените настройку ALLOWED_HOSTS, чтобы развернутая копия была абсолютно безопасной . 20-4 . Больше 404: функцию get_object_or_404() также следует применять в представ- лениях new_entry() и edit_entry() . Внесите изменения, протестируйте их на URL-адресе вида http://localhost:8000/new_entry/99999/ и убедитесь в том, что при этом выводится ошибка 404 . Итоги 465 20-5 . Расширенное приложение Learning Log: добавьте простую функцию в Learning Log (например, вывод расширенной информации о проекте на домашней странице) и отправьте изменение в развернутую копию . Затем попробуйте внести более сложное изменение — например, чтобы пользователь мог назначить тему общедоступной . Для этого в модель Topic добавляется атрибут с именем public (по умолчанию он должен быть равен False), а на страницу new_topic — элемент формы, позволяющий превратить личную тему в обще- доступную . После этого проведите миграцию проекта и переработайте файл views .py, что- бы любая общедоступная тема также была видимой и для пользователей, не прошедших аутентификацию . Не забудьте провести миграцию базы данных после отправки изменений на Heroku . Итоги В этой главе вы узнали, как придать вашему проекту простой, но профессио- нальный внешний вид при помощи библиотеки Bootstrap и приложения django- bootstrap3 . При использовании Bootstrap выбранные вами стили будут работать одинаково практически на всех устройствах, используемых для работы с вашим проектом. Вы узнали о шаблонах Bootstrap и использовали шаблон Static top navbar для соз- дания простого оформления Learning Log. Вы научились использовать элемент jumbotron для визуального выделения сообщений домашней страницы и узнали, как организовать единое стилевое оформление всех страниц на сайте. В последней части проекта вы узнали, как развернуть проект на серверах Heroku, чтобы с ним мог работать любой желающий. Вы создали учетную запись Heroku и установили инструменты, упрощающие процесс развертывания. Вы использовали Git для закрепления рабочего проекта в репозитории и отправили репозиторий на серверы Heroku. Наконец, вы узнали, как защитить приложение, включив режим DEBUG=False на работающем сервере. Итак, работа над Learning Log закончена, и вы можете взяться за построение соб- ственных проектов. Начните с простых приложений и убедитесь в том, что прило- жение заработало, прежде чем наращивать сложность. Пусть ваше обучение будет интересным — и удачи с вашими собственными проектами! Приложение А . Установка Python Python существует в нескольких разных версиях, с разными вариантами конфи- гурации в каждой операционной системе. Это приложение пригодится вам в том случае, если описание из главы 1 не сработало или вы захотите установить другую версию Python вместо той, которая поставлялась с вашей системой. Python в системе Linux Python включается по умолчанию почти в каждую систему Linux, но возможно, вы захотите использовать другую версию. В таком случае сначала определите, какая версия Python уже установлена у вас. Определение установленной версии Откройте терминальное окно и введите следующую команду: $ python --version Python 2.7.6 Результат показывает, что по умолчанию используется версия 2.7.6. С другой стороны, в системе также может быть установлена версия Python 3. Для проверки введите следующую команду: $ python3 --version Python 3.5.0 Оказывается, версия Python 3.5.0 тоже установлена. Желательно выполнить обе команды, прежде чем пытаться установить новую версию. Установка Python 3 в Linux Если у вас не установлена версия Python 3 или вы решили установить более новую версию Python 3, это делается буквально в нескольких строках. Мы воспользуемся пакетом deadsnakes , упрощающим установку нескольких версий Python: $ sudo add-apt-repository ppa:fkrull/deadsnakes $ sudo apt-get update $ sudo apt-get install python3.5 Эти команды устанавливают Python 3.5 в вашей системе. Следующий код запускает терминальный сеанс с Python 3.5: Python в os x 467 $ python3.5 >>> Эта команда также часто используется при настройке текстового редактора для написания кода Python 3 и при запуске программ из терминального окна. Python в OS X Язык Python уже установлен в большинстве систем OS X, но возможно, вы захоти- те использовать другую версию. В таком случае сначала определите, какая версия Python уже установлена у вас. Определение установленной версии Откройте терминальное окно и введите следующую команду: $ python --version Python 2.7.6 Также стоит попробовать выполнить команду python3 --version . Скорее всего, вы получите сообщение об ошибке, и все же стоит проверить — возможно, нужная версия уже установлена. Использование Homebrew для установки Python 3 Если у вас установлена только версия Python 2 или старая версия Python 3, для уста- новки последней версии Python 3 можно воспользоваться пакетом Homebrew. Установка Homebrew Так как Homebrew зависит от пакета Apple Xcode, откройте терминальное окно и введите следующую команду: $ xcode-select --install Введите подтверждения в открывающихся диалоговых окнах (это может занять некоторое время в зависимости от скорости подключения). Затем установите Homebrew: $ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/ master/install)" Эту команду можно найти на основной странице сайта Homebrew по адресу http://brew.sh/. Обратите внимание на пробел между curl -fsSL и URL-адресом. ПРИМЕЧАНИЕ Ключ -e в этой команде приказывает Ruby (язык программирования, на котором написана про- грамма Homebrew) выполнить загружаемый код . Такие команды должны использоваться только с доверенными источниками . Чтобы убедиться в том, что установка Homebrew прошла успешно, выполните следующую команду: 468 Приложение А . Установка Python $ brew doctor Your system is ready to brew. Этот результат означает, что все готово для установки пакетов Python через Homebrew. Установка Python 3 Чтобы установить новейшую версию Python 3, введите следующую команду: $ brew install python3 Для проверки установленной версии используется следующая команда: $ python3 --version Python 3.5.0 $ Теперь вы cможете запустить терминальный сеанс Python 3 командой python3 , а также воспользоваться командой python3 для настройки текстового редактора, чтобы программы Python запускались в Python 3 вместо Python 2. Python в Windows Python обычно не включается в установку Windows по умолчанию, и все же вам стоит проверить, присутствует ли Python в вашей системе. Откройте терминальный сеанс — щелкните правой кнопкой мыши на рабочем столе, удерживая клавишу Shift, и выберите команду Open Command Window Here . Также можно открыть окно командой меню Пуск ( Start ). В открывшемся терминальном окне введите следующую команду: > python --version Python 3.5.0 Если вы получили такой результат, значит, язык Python уже установлен в вашей системе (хотя вы, возможно, захотите установить более новую версию). Если вы получите сообщение об ошибке, то вы должны загрузить и установить Python. Установка Python 3 в Windows Откройте страницу http://python.org/downloads/ и щелкните на нужной версии Python. Загрузите программу установки, а после запуска непременно установите флажок Add Python to PATH . Это делается для того, чтобы вы могли использовать команду python вместо ввода полного пути к программе python , и вам не придется изменять переменные окружения вашей системы вручную. Завершив установку Python, введите команду python --version в новом терминальном окне. Если ко- манда работает, значит, все сделано верно. Поиск интерпретатора Python Если простая команда python не работает, вы должны сообщить Windows, где сле- дует искать интерпретатор Python. Чтобы найти его, откройте содержимое диска C и найдите папку, имя которой начинается с Python (попробуйте ввести слово python на панели поиска Проводника Windows). Откройте папку и найдите файл с име- Ключевые слова и встроенные функции Python 469 нем python в нижнем регистре. Щелкните правой кнопкой мыши на этом файле и выберите команду Свойства ( Properties ); путь к этому файлу будет отображаться под заголовком Размещение ( Location ). В терминальном окне используйте путь для подтверждения установленной версии: $ C:\\Python35\python --version Python 3.5.0 Включение Python в переменную PATH Вводить полный путь каждый раз, когда вы захотите открыть терминал Python, довольно утомительно, поэтому мы добавим этот путь в системное окружение, чтобы вы могли использовать команду python . Если вы щелкнули на флажке Add Python to PATH во время установки, этот шаг можно пропустить. Откройте Панель управления своей системы, выберите категорию Система и безопасность ( System and Security ), затем выберите Система ( System ). Щелкните на ссылке Дополнительные параметры ( Advanced System Settings ). В открывшемся окне щелкните на кнопке Переменные среды ( Environment Variables ). В поле Системные переменные ( System variables ) найдите переменную с именем Path Щелкните на кнопке Edit . В открывшемся окне щелкните на поле Variable value и прокрутите его до правого края клавишей →. Будьте внимательны — вы не долж- ны заменить существующее значение; если это произойдет, щелкните на кнопке Cancel и повторите попытку. Добавьте точку с запятой и путь к файлу python .exe в существующую переменную: %SystemRoot%\system32\...\System32\WindowsPowerShell\v1.0\;C:\Python34 Закройте терминальное окно и откройте новое. Новое содержимое переменной Path будет загружено в терминальном сеансе. Теперь при вводе команды python --version запускается версия Python, которая только что была задана в перемен- ной Path . Теперь вы можете запустить терминальный сеанс Python, просто введя команду python в командной строке. Ключевые слова и встроенные функции Python Python содержит целый набор ключевых слов и встроенных функций. Помните о них, выбирая имена переменных. Одна из типичных проблем программирования — выбор хороших имен переменных, которые должны быть достаточно короткими и содержа- тельными. Однако в качестве имен нельзя использовать ключевые слова Python, а также имена встроенных функций Python, потому что это приведет к замещению функций. В этом разделе перечислены ключевые слова Python и имена встроенных функций, чтобы вы знали, каких имен следует избегать. Ключевые слова Python Каждое ключевое слово из следующего списка имеет конкретный смысл в про- граммах Python. При попытке использовать эти слова в качестве имен переменных произойдет ошибка. |