Книга Изучаем Python
Скачать 4.68 Mb.
|
УПРАЖНЕНИЯ 17-1 . Другие языки: измените вызов API в программе python_repos .py так, чтобы на диа- грамме отображались самые популярные проекты на других языках . Попробуйте такие язы- ки, как JavaScript, Ruby, C, Java, Perl, Haskell и Go . 17-2 . Активные обсуждения: на основании данных из hn_submissions .py постройте столбцо- вую диаграмму самых активных обсуждений, проходящих на Hacker News . Высота каждого столбца должна соответствовать количеству комментариев к каждой статье . Метка столбца должна включать заголовок статьи, а сам столбец должен служить ссылкой на страницу обсуждения этой публикации . 17-3 . Тестирование python_repos .py: в python_repos .py для проверки успешности вызова API выводится значение status_code . Напишите программу test_python_repos .py, которая использует модуль unittest для проверки того, что значение status_code равно 200 . При- думайте другие условия, которые могут проверяться при тестировании, — например, что количество возвращаемых элементов совпадает с ожидаемым, а общее количество репози- ториев превышает некоторый порог . 378 Глава 17 • Работа с API Итоги В этой главе вы узнали, как использовать API для написания программ, авто- матически собирающих необходимые данные и использующих полученную информацию для создания визуализации. Мы использовали GitHub API для получения информации о самых популярных проектах Python на GitHub, а также в общих чертах рассмотрели API Hacker News. Вы узнали, как с помощью пакета requests автоматически выдать вызов API к GitHub и как обработать результаты этого вызова. Также были описаны некоторые средства конфигурации Pygal, по- зволяющие выполнить дополнительную настройку внешнего вида создаваемых диаграмм. В последнем проекте мы используем Django для построения веб-приложения. Проект 3 Веб-приложения 18 Знакомство с Django Современные веб-сайты в действительности представляют собой многофункцио- нальные приложения, достаточно близкие к полноценным приложениям для настольных систем. Python содержит богатый набор инструментов для постро- ения веб-приложений. В этой главе вы научитесь использовать Django (http:// djangoproject.com/) для построения проекта Learning Log — сетевой журнальной системы для отслеживания информации, полученной вами по определенной теме. Мы напишем спецификацию для этого проекта, а затем определим модели для данных, с которыми будет работать приложение. Мы воспользуемся администра- тивной системой Django для ввода некоторых начальных данных, а затем научимся писать представления и шаблоны, на базе которых Django будет строить страницы нашего сайта. Django представляет собой веб-инфраструктуру — набор инструментов для постро- ения интерактивных веб-сайтов. Django может реагировать на запросы страниц, упрощает чтение и запись информации в базы данных, управление пользователями и многие другие операции. В главах 19 и 20 мы доработаем проект Learning Log, а затем развернем его на сервере, чтобы вы (и ваши друзья) могли использовать их. Подготовка к созданию проекта В начале работы над проектом необходимо описать проект в спецификации. Затем вы создадите виртуальную среду для построения проекта. Написание спецификации В полной спецификации описываются цели проекта, его функциональность, а также внешний вид и интерфейс пользователя. Как и любой хороший проект или бизнес-план, спецификация должна сосредоточиться на самых важных аспек- тах и обеспечивать планомерную разработку проекта. Здесь мы не будем писать полную спецификацию, а сформулируем несколько четких целей, которые будут задавать направление процесса разработки. Вот как выглядит спецификация: Мы напишем веб-приложение с именем Learning Log, при помощи которого пользователь сможет вести журнал интересующих его тем и создавать записи в журнале во время изучения каждой темы . Домашняя страница Learning Log содержит описание сайта и приглашает пользователя заре- гистрироваться либо ввести свои учетные данные . После успешного входа пользователь получает Подготовка к созданию проекта 381 возможность создавать новые темы, добавлять новые записи, читать и редактировать существу- ющие записи . Во время изучения нового материала бывает полезно вести журнал того, что вы узнали, — записи пригодятся для контроля и возвращения к необходимой инфор- мации. Хорошее приложение повышает эффективность этого процесса. Создание виртуальной среды Для работы с Django необходимо сначала создать виртуальную среду для работы. Виртуальная среда представляет собой подраздел системы, в котором вы можете устанавливать пакеты в изоляции от всех остальных пакетов Python. Отделение библиотек одного проекта от других проектов принесет пользу при развертывании Learning Log на сервере в главе 20. Создайте для проекта новый каталог с именем learning_log , перейдите в этот каталог в терминальном режиме и создайте виртуальную среду. Если вы работаете в Python 3, то сможете создать виртуальную среду следующей командой: learning_log$ python -m venv ll_env learning_log$ Команда запускает модуль venv и использует его для создания виртуальной среды с именем ll_env . Если этот способ сработал, переходите к разделу «Активизация виртуальной среды» на с. 382. Если что-то не получилось, прочитайте следующий раздел — «Установка virtualenv». Установка virtualenv Если вы используете более раннюю версию Python или ваша система не настроена для правильного использования модуля venv , установите пакет virtualenv . Уста- новка virtualenv выполняется следующей командой: $ pip install --user virtualenv Возможно, вам придется использовать слегка измененную версию этой команды. (Если вы еще не использовали pip , обратитесь к разделу «Установка пакетов Python с использованием pip» на с. 227.) ПРИМЕЧАНИЕ Если вы используете Linux, но и этот способ не сработал, установите virtualenv при помощи менед- жера пакетов своей системы . Например, в Ubuntu для установки virtualenv используется команда sudo apt-get install python-virtualenv . Перейдите в каталог learning_log в терминальном окне и создайте виртуальную среду следующей командой: learning_log$ virtualenv ll_env New python executable in ll_env/bin/python Installing setuptools, pip...done. learning_log$ 382 Глава 18 • Знакомство с Django ПРИМЕЧАНИЕ Если в вашей системе установлено несколько версий Python, укажите версию, которая должна ис- пользоваться virtualenv . Например, команда virtualenv ll_env --python=python3 создаст виртуальную среду, которая использует Python 3 . Активизация виртуальной среды После того как виртуальная среда будет создана, ее необходимо активизировать следующей командой: learning_log$ source ll_env/bin/activate (ll_env)learning_log$ Команда запускает сценарий activate из каталога ll_env/bin . Когда среда активизирует- ся, ее имя выводится в круглых скобках ; теперь вы можете устанавливать пакеты в среде и использовать те пакеты, что были установлены ранее. Пакеты, установлен- ные в ll_env , будут доступны только в то время, пока среда остается активной. ПРИМЕЧАНИЕ Если вы работаете в системе Windows, используйте команду ll_env\Scripts\activate (без слова source) для активизации виртуальной среды . Чтобы завершить использование виртуальной среды, введите команду deactivate : (ll_env)learning_log$ deactivate learning_log$ Среда также становится неактивной при закрытии терминального окна, в котором она работает. Установка Django После того как вы создали свою виртуальную среду и активизировали ее, устано- вите Django: (ll_env)learning_log$ pip install Django Installing collected packages: Django Successfully installed Django Cleaning up... (ll_env)learning_log$ Так как вы работаете в виртуальной среде, эта команда выглядит одинаково во всех системах. Использовать флаг --user не нужно, как и использовать более длинные команды вида python -m pip install имя_пакета. Помните, что с Django можно работать только в то время, пока среда остается активной. Создание проекта в Django Не выходя из активной виртуальной среды (пока ll_env выводится в круглых скобках), введите следующие команды для создания нового проекта: Подготовка к созданию проекта 383 (ll_env)learning_log$ django-admin.py startproject learning_log . (ll_env)learning_log$ ls learning_log ll_env manage.py (ll_env)learning_log$ ls learning_log __init__.py settings.py urls.py wsgi.py Команда приказывает Django создать новый проект с именем learning_log Точка в конце команды создает новый проект со структурой каталогов, которая упрощает развертывание приложения на сервере после завершения разработки. ПРИМЕЧАНИЕ Не забывайте про точку, иначе у вас могут возникнуть проблемы с конфигурацией при разверты- вании приложения . А если вы все же забыли, удалите созданные файлы и папки (кроме ll_env) и снова выполните команду . Команда ls ( dir в Windows) показывает, что Django создает новый каталог с име- нем learning_log . Также создается файл manage .py — короткая программа, которая получает команды и передает их соответствующей части Django для выполнения. Мы используем эти команды для управления такими задачами, как работа с базами данных и запуск серверов. В каталоге learning_log находятся четыре файла , важнейшими из которых явля- ются файлы settings .py , urls .py и wsgi .py . Файл settings .py определяет то, как Django взаимодействует с вашей системой и управляет вашим проектом. Мы изменим некоторые из существующих настроек и добавим несколько новых настроек в ходе разработки проекта. Файл urls .py сообщает Django, какие страницы следует строить в ответ на запросы браузера. Файл wsgi .py помогает Django предоставлять создан- ные файлы (имя файла является сокращением от «Web Server Gateway Interface»). Создание базы данных Так как Django хранит бульшую часть информации, относящейся к проекту, в базе данных, необходимо создать базу данных, с которой Django сможет работать. Чтобы создать базу данных для проекта Learning Log, введите следующую команду (все еще не покидая активной среды): (ll_env)learning_log$ python manage.py migrate Operations to perform: Synchronize unmigrated apps: messages, staticfiles Apply all migrations: contenttypes, sessions, auth, admin Applying sessions.0001_initial... OK (ll_env)learning_log$ ls db.sqlite3 learning_log ll_env manage.py Каждое изменение базы данных называется миграцией. Первое выполнение коман- ды migrate приказывает Django проверить, что база данных соответствует текуще- му состоянию проекта. Когда мы впервые выполняем эту команду в новом проекте с использованием SQLite (вскоре мы расскажем о SQLite более подробно), Django создает новую базу данных за нас. В точке Django сообщает о создании таблиц базы данных, необходимых для хранения информации, используемой в проекте 384 Глава 18 • Знакомство с Django ( Synchronize unmigrated apps ), а затем проверяет, что структура базы данных со- ответствует текущему коду ( Apply all migrations ). Выполнение команды ls показывает, что Django создает другой файл с именем db .sqlite3 . SQLite — база данных, работающая с одним файлом; она идеально подходит для написания простых приложений, потому что вам не нужно особенно следить за управлением базой данных. Просмотр проекта Убедимся в том, что проект был создан правильно. Введите команду runserver : (ll_env)learning_log$ python manage.py runserver Performing system checks... System check identified no issues (0 silenced). July 15, 2015 - 06:23:51 Django version 1.8.4, using settings 'learning_log.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C. Django запускает сервер, чтобы вы могли просмотреть проект в своей системе и проверить, как он работает. Когда вы запрашиваете страницу, вводя URL в бра- узере, сервер Django отвечает на запрос; для этого он строит соответствующую страницу и отправляет страницу браузеру. В точке Django проверяет правильность созданного проекта; в точке выво- дится версия Django и имя используемого файла настроек; в точке возвращается URL-адрес, по которому доступен проект. URL http://127.0.0.1:8000/ означает, что проект ведет прослушивание запросов на порте 8000 локального хоста (localhost), то есть вашего компьютера. Термином «локальный хост» обозначается сервер, который обрабатывает только запросы вашей системы; он не позволяет никому другому просмотреть разрабатываемые страницы. Теперь откройте браузер и введите URL http://localhost:8000/ — или http://127.0.0.1:8000/, если первый адрес не работает. Вы увидите нечто похожее на рис. 18.1 — страницу, которую создает Django, чтобы сообщить вам, что все пока работает правильно. Пока не завершайте работу сервера (но, когда вы захотите прервать ее, это можно сделать нажатием клавиш Ctrl+C). ПРИМЕЧАНИЕ Если вы получаете сообщение об ошибке «Порт уже используется», прикажите Django исполь- зовать другой порт; для этого введите команду python manage .py runserver 8001 и продолжайте перебирать номера портов по возрастанию, пока не найдете открытый порт . УПРАЖНЕНИЯ 18-1 . Новые проекты: чтобы лучше понять, что делает Django, постройте пару пустых проектов и посмотрите, что будет создано . Создайте новый каталог с простым именем типа InstaBook или FaceGram (за пределами каталога learning_log), перейдите в этот ка- талог в терминальном окне и создайте виртуальную среду . Установите Django и выпол- ните команду django-admin .py startproject instabook . (обратите внимание на точку в конце команды) . Начало работы над приложением 385 Просмотрите файлы и каталоги, созданные командой, и сравните их с файлами и ката- логами Learning Log . Проделайте это несколько раз, пока не начнете хорошо понимать, что именно создает Django при создании нового проекта, а затем удалите каталоги про- ектов . Рис. 18.1. Пока все работает правильно Начало работы над приложением Проект Django представляет собой группу отдельных приложений, совместная работа которых обеспечивает работу проекта в целом. Пока мы создадим одно приложение, которое будет выполнять бульшую часть работы в нашем проекте. Другое приложение для управления учетными записями пользователей будет до- бавлено в главе 19. К этому моменту команда runserver должна продолжать работу в терминальном окне, которое вы открыли ранее. Откройте новое терминальное окно (или вкладку) и перейдите в каталог, содержащий manage .py . Активизируйте виртуальную среду и выполните команду startapp : learning_log$ source ll_env/bin/activate (ll_env)learning_log$ python manage.py startapp learning_logs (ll_env)learning_log$ ls db.sqlite3 learning_log learning_logs ll_env manage.py (ll_env)learning_log$ ls learning_logs/ admin.py __init__.py migrations models.py tests.py views.py Команда startapp имя_приложения приказывает Django создать инфраструктуру, необходимую для построения приложения. Заглянув сейчас в каталог проекта, вы найдете в нем новый подкаталог с именем learning_logs . Откройте этот каталог, чтобы увидеть, какие файлы были созданы Django . Самые важные файлы в этом каталоге — models .py , admin .py и views .py Мы воспользуемся файлом models .py для определения данных, которыми нуж- но управлять в нашем приложении. К файлам admin .py и views .py мы вернемся позднее. 386 Глава 18 • Знакомство с Django Определение моделей Ненадолго задумаемся, какие данные нам понадобятся. Каждый пользователь создает набор тем в своем журнале. Каждая запись, которую он сделает, будет при- вязана к определенной теме, а записи будут выводиться в текстовом виде. Также необходимо хранить временну́ю метку каждой записи, чтобы пользователь знал, когда эта запись была создана. Откройте файл models .py и просмотрите его текущее содержимое: models.py from django.db import models # Создайте здесь свои модели. Модуль с именем models импортируется автоматически, и нам предлагается создать свои модели. Модель сообщает Django, как работать с данными, которые будут хра- ниться в приложении. С точки зрения кода модель представляет собой обычный класс; она содержит атрибуты и методы, как и все остальные классы, рассматри- вавшиеся нами ранее. Вот как выглядит модель тем обсуждения, которые будут сохраняться пользователями: from django.db import models class Topic(models.Model): """Тема, которую изучает пользователь""" text = models.CharField(max_length=200) date_added = models.DateTimeField(auto_now_add=True) def __str__(self): """Возвращает строковое представление модели.""" return self.text Мы создали класс с именем Topic , наследующий от Model — родительского класса, включенного в Django и определяющего базовую функциональность модели. Класс Topic содержит всего два атрибута: text и date_added Атрибут text содержит данные CharField — блок данных, состоящий из символов, то есть текст . Атрибуты CharField могут использоваться для хранения неболь- ших объемов текста: имен, заголовков, названий городов и т. д. При определении атрибута CharField необходимо сообщить Django, сколько места нужно зарезер- вировать для него в базе данных. В данном случае задается максимальная длина max_length , равная 200 символам; этого должно быть достаточно для хранения большинства имен тем. Атрибут date_added содержит данные DateTimeField — блок данных для хранения даты и времени . Аргумент auto_add_now=True приказывает Django автоматически присвоить этому атрибуту текущую дату и время каждый раз, когда пользователь создает новую тему. ПРИМЕЧАНИЕ Полный список всех полей, которые могут использоваться в модели, приведены в документе Django Model Field Reference по адресу https://docs .djangoproject .com/en/1 .8/ref/models/fields/ . Возможно, |