LXF165-166: Web-разработка: Django
|
|
|
Каркас для web-приложений Высвободите всю мощь этого фреймворка на Python
Содержание |
Django: Первый ваш web-опыт
Джоно Бэкон объясняет, как начать работу, и приглашает нас проехаться на Ferrari фреймворков для web-приложений... Django.
Интернет в самых разных формах существует уже давно. На заре его развития содержимое было в основном статическим и текстовым, а с годами на наших глазах становилось все более динамичным и интерактивным и наполнялось видеороликами, звуком, анимацией – все это благодаря надежным браузерам.
Известных социальных сетей, сайтов для загрузки аудио- и видеоконтента и других отвлекающих от праведных трудов источников ныне хватает, но иной раз хочется создать собственный полноценный сайт с нуля и разместить его в сети. Это может быть ваша домашняя страница, система управления библиотекой, база данных музыки, система управления записями компании или любая из миллионов других разновидностей сайтов. Разумеется, при желании можно создать почти любой сайт, но с чего начать?
К счастью, существует масса web-фреймворков, позволяющих легко настроить и запустить сайт. Часть из них – готовые системы управления контентом, настраиваемых в соответствии с вашими потребностями, например, WordPress; но есть и более сложные платформы для развертывания сайтов. Эти обладают гораздо большей гибкостью, и одна из лучших среди них – Django.
Django – фреймворк с впечатляющим набором возможностей, который позволяет создавать web-приложения легко и быстро. Одна из главных причин популярности Django в том, что он основан на Python и обильно использует его. Тем из вас, на кого еще не снизошло просветление могущества и известности Python, скажем, что это язык программирования высокого уровня, который делает программирование простым, гибким и мощным. Сам Python – на удивление приятная и веселая штука, а в сочетании с Django – это средство, с помощью которого можно быстро создавать web-приложения и пользоваться изобилием встроенных функций Python. На нашем уроке мы пройдемся по созданию первого приложения с Django. Предполагается, что у вас есть некоторые познания в Python, но лишь самые базовые. К концу урока у вас должны появиться солидная основа, на которой можно будет наращивать и расширять ваши умения в Django.
Начинаем
Установку Django я подробно описывать не буду; в вашем дистрибутиве должны быть соответствующие пакеты (например, в Ubuntu можно установить python-django). Если у вас его нет и вы не хотите возиться с довольно витиеватым набором зависимостей, загрузите отличный стек Bitnami, с уже настроенным Django, с сайта http://bitnami.org/stack/djangostack.
Первым делом нужно открыть терминал. В нем мы будем выполнять команды для создания проектов и приложений, обновления базы данных и запуска временного web-сервера. Начнем, впрочем, с создания нового проекта. Для этого выполните команду
django-admin.py startproject pawnstore
Сознаюсь честно: мне безумно нравится реалити-шоу “Pawn Stars [Звезды заклада]” (оно рассказывает о трудностях и испытаниях одного ломбарда в Лас-Вегасе). Вот мы и напишем web-приложение для управления ломбардом. Здесь командой django-admin мы создали новый проект ‘pawnstore’ [ломбард].
В Django внутри одного проекта можно создать несколько приложений. Например, у вас может быть одно приложение для описания содержимого ломбарда, одно для управления продажами и одно для управления сменами. Все они могут быть в одном проекте.
Прежде чем создавать наше первое приложение, следует немного настроить проект. Внутри созданного проекта ‘pawnstore’ вы видите подкаталог pawnstore. В нем есть файл settings.py с параметрами всего проекта. Откройте его, и давайте сначала выберем базу данных, которой мы хотим пользоваться.
- Метамодернизм в позднем творчестве В.Г. Сорокина
- ЛитРПГ - последняя отрыжка постмодерна
- "Ричард III и семиотика"
- 3D-визуализация обложки Ridero создаем обложку книги при работе над самиздатом.
- Архитектура метамодерна - говоря о современном искусстве, невозможно не поговорить об архитектуре. В данной статье будет отмечено несколько интересных принципов, характерных для построек "новой волны", столь притягательных и скандальных.
- Литература
- Метамодерн
- Рокер-Прометей против изначального зла в «Песне про советскую милицию» Вени Дркина, Автор: Нина Ищенко, к.ф.н, член Союза Писателей ЛНР - перепубликация из журнала "Топос".
- Как избавиться от комаров? Лучшие типы ловушек.
- Что делать если роблокс вылетает на windows
- Что делать, если ребенок смотрит порно?
- Почему собака прыгает на людей при встрече?
- Какое масло лить в Задний дифференциал (мост) Visco diff 38434AA050
- О чем может рассказать хвост вашей кошки?
- Верветки
- Отчетность бюджетных учреждений при закупках по Закону № 223-ФЗ
- Срок исковой давности как правильно рассчитать
- Дмитрий Патрушев минсельхоз будет ли преемником Путина
- Кто такой Владислав Поздняков? Что такое "Мужское Государство" и почему его признали экстремистским в России?
- Как правильно выбрать машинное масло в Димитровграде?
- Как стать богатым и знаменитым в России?
- Почему фильм "Пипец" (Kick-Ass) стал популярен по всему миру?
- Как стать мудрецом?
- Как правильно установить FreeBSD
- Как стать таким как Путин?
- Где лучше жить - в Димитровграде или в Ульяновске?
- Почему город Димитровград так называется?
- Что такое метамодерн?
- ВАЖНО! Временное ограничение движения автотранспортных средств в Димитровграде
- Тарифы на электроэнергию для майнеров предложено повысить
Django поддерживает множество различных СУБД (в том числе SQLite, MySQL, PostgreSQL и Oracle). Простоты ради, воспользуемся SQLite; эта простая база данных хранится в файле на вашем компьютере. Для этого найдите строку ‘ENGINE’ и добавьте в нее sqlite3. Она должна выглядеть так:
‘ENGINE’: ‘django.db.backends.sqlite3’,
Также нужно задать имя базы данных. Добавьте следующую строку:
‘NAME’: ‘pawnstore.db’,
Введя все настройки, можно создать первое приложение в проекте. Мы создадим приложение Django для управления списком товаров ломбарда и назовем его ‘inventory’. Для создания приложения мы сперва воспользуемся скриптом manage.py (в каталоге верхнего уровня pawnstore). Этот скрипт – наш швейцарский армейский нож в управлении проектом. В дальнейшем мы будем пользоваться им все чаще и чаще.
Чтобы создать приложение, выполните команду
python manage.py startapp inventory
Она создаст новый каталог inventory. Теперь приступим к созданию приложения.
Создаем базу данных
Как и другие базы данных, Django хранит данные в таблицах и в полях этих таблиц. Нам будет нужно создать таблицы и поля и затем добавить данные, которые можно будет запрашивать и отображать разными способами. К счастью, вместо других систем, в которых для создания таблиц, полей и добавления данных нужно создавать десятки SQL-запросов, мы употребим для этого славный своей мощью и простотой Python.
Внутри каталога inventory есть файл models.py. В этот файл можно добавить классы Python с описанием структуры данных нашего приложения для управления перечнем товаров. Мы по-простому создадим две таблицы: Categories [категории] и Items [товары]. Каждый товар относится к какой-либо категории.
Чтобы добавить упомянутые таблицы, впишите следующий код в models.py:
class Category(models.Model):
name = models.CharField(max_length=200)
class Item(models.Model):
category = models.ForeignKey(Category)
dateadded = models.DateTimeField(‘date added’)
name = models.CharField(max_length=200)
description = models.TextField()
quantity = models.IntegerField()
Здесь каждый класс соответствует своей таблице в нашей программе, а каждая переменная класса с помощью функции Django описывает тип поля с данными. Например, dateadded в классе Item имеет тип DateTimeField, поэтому Django будет хранить данные поля в формате даты, а в некоторых случаях, когда пользователю нужно ввести дату, выводить календарь для выбора даты. Другой пример – поле ‘name’, его тип CharField; это текстовая строка, и данные этого поля обычно вводятся в однострочное текстовое поле, в отличие от TextField, с которым обычно используется многострочное текстовое поле.
Схема нашей базы данных создана; теперь с ее помощью сгенерируем базу данных. Для этого скомандуйте
python manage.py syncdb
Тут вам зададут несколько вопросов. На вопрос, хотите ли вы создать суперпользователя, ответьте «да» и задайте имя пользователя и пароль. Затем вы должны вернуться в командную строку. База данных создана успешно. Запустим наш проект и посмотрим, как он выглядит. Для удобного просмотра проекта в Django есть встроенный web-сервер. Запустит его команда
python manage.py runserver
Запустите браузер и откройте адрес http://127.0.0.1:8000/, чтобы просмотреть проект. Вы должны увидеть текст о «первом приложении на Django», выполненный стандартным шрифтом. Хотя это не слишком впечатляет, но сдвиг есть! Кстати, остановить сервер можно, нажав Ctrl + C.
Интерфейс администратора
Наша база данных создана, и пора добавить в нее немного данных. В других фреймворках нам пришлось бы опуститься до написания целых кип сложных SQL-запросов, где легко наделать ошибок, или воспользоваться сторонним клиентом SQL, например, phpmyadmin. К счастью, с Django нам это не понадобится: в нем есть собственный интерфейс для управления базой данных, добавлением и удалением данных и других действий. Он встроен в ваш проект.
- Метамодернизм в позднем творчестве В.Г. Сорокина
- ЛитРПГ - последняя отрыжка постмодерна
- "Ричард III и семиотика"
- 3D-визуализация обложки Ridero создаем обложку книги при работе над самиздатом.
- Архитектура метамодерна - говоря о современном искусстве, невозможно не поговорить об архитектуре. В данной статье будет отмечено несколько интересных принципов, характерных для построек "новой волны", столь притягательных и скандальных.
- Литература
- Метамодерн
- Рокер-Прометей против изначального зла в «Песне про советскую милицию» Вени Дркина, Автор: Нина Ищенко, к.ф.н, член Союза Писателей ЛНР - перепубликация из журнала "Топос".
- Как избавиться от комаров? Лучшие типы ловушек.
- Что делать если роблокс вылетает на windows
- Что делать, если ребенок смотрит порно?
- Почему собака прыгает на людей при встрече?
- Какое масло лить в Задний дифференциал (мост) Visco diff 38434AA050
- О чем может рассказать хвост вашей кошки?
- Верветки
- Отчетность бюджетных учреждений при закупках по Закону № 223-ФЗ
- Срок исковой давности как правильно рассчитать
- Дмитрий Патрушев минсельхоз будет ли преемником Путина
- Кто такой Владислав Поздняков? Что такое "Мужское Государство" и почему его признали экстремистским в России?
- Как правильно выбрать машинное масло в Димитровграде?
- Как стать богатым и знаменитым в России?
- Почему фильм "Пипец" (Kick-Ass) стал популярен по всему миру?
- Как стать мудрецом?
- Как правильно установить FreeBSD
- Как стать таким как Путин?
- Где лучше жить - в Димитровграде или в Ульяновске?
- Почему город Димитровград так называется?
- Что такое метамодерн?
- ВАЖНО! Временное ограничение движения автотранспортных средств в Димитровграде
- Тарифы на электроэнергию для майнеров предложено повысить
Чтобы включить интерфейс администратора, нужно задать кое-какие настройки. Во-первых, нужно настроить URL. Обсудим URL’ы в Django в общем случае. В каждом проекте Django есть файл urls.py. Его можно найти в подкаталоге проекта (у нас – pawnstore). Этот файл содержит список URL-адресов, распознаваемых проектом, в виде регулярных выражений. Адреса можно затем связать с различными приложениями проекта. Подробнее об этом позже.
В файле должна присутствовать следующая строка, которую нужно раскомментировать:
url(r’^admin/’, include(admin.site.urls)),
Заодно раскомментируйте такие строки в начале файла:
from django.contrib import admin
admin.autodiscover()
Так мы включим интерфейс администратора в нашем проекте; но чтобы он поддерживался, нужно еще одно небольшое изменение. Откройте файл settings.py и раскомментируйте следующую строку в разделе INSTALLED_APPS:
‘django.contrib.admin’,
Еще добавьте строку
‘inventory’,
Раздел INSTALLED_APPS в settings.py описывает различные приложения в проекте, готовые для использования; одно из них – интерфейс администратора, другое – наше основное приложение ‘inventory’.
Опять запустим сервер:
python manage.py runserver
Затем откройте адрес http://127.0.0.1:8000/admin/, и должна открыться форма для входа в интерфейс администратора. Введите имя пользователя и пароль – и появится главный интерфейс.
К сожалению, таблиц, которые мы создали ранее (Categories и Items) здесь нет – только Groups [группы], Users [пользователи] и Sites [сайты]. Причина в том, что хотя мы включили интерфейс администратора, мы еще не предоставили интерфейсу права доступа для редактирования наших таблиц. Для этого в каталоге inventory нужно создать файл admin.py и добавить в него следующие строки:
from django.contrib import admin
from inventory.models import Category, Item
admin.site.register(Category)
admin.site.register(Item)
Затем перезапустите сервер и перезагрузите интерфейс администратора. В нем появятся две новых таблицы, как на рис. 1. Воспользуемся этим и добавим немного данных. Во-первых, добавим какую-нибудь категорию. Щелкните по таблице Categories (заметьте, что к названию каждой таблицы добавляется окончание ‘s’ для множественного числа... как мило!) и затем на кнопку Add Category [Добавить категорию] в правом верхнем углу. После этого укажите название категории и нажмите кнопку Save [Сохранить].
Теперь добавим товар [Item]. Вернитесь на домашнюю страницу и щелкните по таблице Items. Нажмите кнопку Add Item [Добавить товар] и обратите внимание, что формы для полей различных типов, которые мы добавили в модель базы данных, выглядят по-разному (отчасти поэтому важно задавать тип поля правильно). С помощью этой формы можно добавить товар в базу данных.
Одна из проблем, которую вы, возможно, заметили, состоит в том, что в выпадающем списке Category [Категория] не отображается ранее добавленная категория. Вместе этого мы видим там общий объект ‘category’. Это легко исправить.
Причина, по которой это происходит, в том, что мы не задали поле по умолчанию, которое возвращается при обращении к классу в целом. Нам нужно сказать, что когда запрашивается объект Category, нужно вернуть заданное поле, если не запрашивается какое-то другое поле. Сделаем этим полем ‘name’, добавив следующий код после класса Category в models.py:
def __unicode__(self):
return self.name
А теперь раззадоримся и добавим в нашу базу побольше данных. В каждой категории должно быть не меньше трех товаров. Например, я добавил категорию ‘Watches [Часы]’ и скопировал и вставил несколько описаний с eBay.
Создаем виды
Наш следующий шаг – получить данные из базы и отобразить их на web-странице. Для этого мы создадим несколько способов (видов, views) для просмотра наших данных.
Для начала следует изменить urls.py, добавив в него URL для каждой страницы. Начнем с общего списка последних товаров, которые были добавлены в перечень. В urls.py добавьте следующий код:
url(r’^inventory/$’, ‘inventory.views.index’),
Эта строка сообщает Django, что если URL заканчивается на ‘inventory’ (например, http://127.0.0.1:8000/inventory/), то нужно загрузить для него страницу inventory.views.index. Что такое inventory.views.index? Так и думал, что спросите! Сейчас объясню...
При загрузке страницы Django заглядывает в urls.py и смотрит, нет ли там строки, которой соответствует URL. Если есть, загружается соответствующий вид. Вид – это просто функция, которая генерирует данные, необходимые для отображения содержимого страницы. Все виды описаны в views.py (несколько видов в одном файле).
Теперь создадим вид. Откройте views.py и добавьте следующий код:
from inventory.models import Item
from django.shortcuts import render_to_response
def index(request):
latest_item_list = Item.objects.all().order_by(‘-dateadded’) [:5]
return render_to_response(‘inventory/index.html’, {‘latest_item_list’: latest_item_list})
В приведенном фрагменте кода мы создаем функцию index(). Имя этой функции ссылается на ‘index’ в inventory.views.index из нашего файла urls.py. В следующей строке мы получаем все товары из таблицы Items и сортируем их в обратном порядке (это делает вызов перед -dateadded), а затем помещаем их в переменную latest_item_list. В следующей строке мы вызываем функцию Django render_to_response(), которая отправляет их шаблону inventory/index.html. Давайте же теперь разберемся, что это такое – шаблоны.
Шаблоны
Одна из традиционных проблем с web-приложениями состоит в том, что программерам нужно писать код, а дизайнеры должны иметь возможность создать красивый дизайн, который отображает содержимое, сгенерированное кодом. Это пересечение навыков программирования и дизайна часто приносит с собой трудности; код может сбивать с толку дизайнеров, а программисты не всегда знают, как создать красивый дизайн. Django решает эту проблему с помощью шаблонов.
Пока мы задали тип URL и написали фрагмент кода, генерирующий информацию, которую нужно отобразить для URL этого типа. Последнее, что мы добавили – шаблон, который будет отображать этот код. Шаблон – специальный файл, который можно отдать дизайнерам, чтобы им было проще создать красивый дизайн на основе содержимого, генерируемого кодом, не загружая их самим кодом.
Чтобы приступить к работе с шаблонами, создадим каталог templates в нашем проекте. В нем создайте подкаталог inventory, а там – файл index.html. Прежде чем создавать шаблон, нужно сказать Django, где находятся шаблоны. Добавьте в файл settings.py полный и абсолютный путь к ним в разделе TEMPLATE_DIRS. Например:
TEMPLATE_DIRS = (
“/home/jono/pawnstore/templates”,
)
Внутри каталога templates/inventory должен быть файл index.html. Добавьте в него такой код:
Latest Items
{% if latest_item_list %}
-
{% for item in latest_item_list %}
- <a href=”/inventory/Шаблон:Item.id/”>Шаблон:Item.name</a>
{% endfor %}
{% else %}
No items are available.
{% endif %}
В этом файле используется особая разметка, которую Django преобразует в обычный HTML при загрузке шаблона. Обратившись к шаблону в views.py, мы передали ему данные в latest_item_list. Затем используются обычные операторы: if, for и else в блоках { % %} для отображения данных в соответствии с теми или иными условиями. Отметим, что мы создали ссылку, к которой добавляется идентификатор товара (например, http://127.0.0.1:8000/inventory/3/) – такой формат URL можно использовать для отображения подробной информации о товаре при щелчке на нем. Наш шаблон в действии можно увидеть на рис. 2.
- Метамодернизм в позднем творчестве В.Г. Сорокина
- ЛитРПГ - последняя отрыжка постмодерна
- "Ричард III и семиотика"
- 3D-визуализация обложки Ridero создаем обложку книги при работе над самиздатом.
- Архитектура метамодерна - говоря о современном искусстве, невозможно не поговорить об архитектуре. В данной статье будет отмечено несколько интересных принципов, характерных для построек "новой волны", столь притягательных и скандальных.
- Литература
- Метамодерн
- Рокер-Прометей против изначального зла в «Песне про советскую милицию» Вени Дркина, Автор: Нина Ищенко, к.ф.н, член Союза Писателей ЛНР - перепубликация из журнала "Топос".
- Как избавиться от комаров? Лучшие типы ловушек.
- Что делать если роблокс вылетает на windows
- Что делать, если ребенок смотрит порно?
- Почему собака прыгает на людей при встрече?
- Какое масло лить в Задний дифференциал (мост) Visco diff 38434AA050
- О чем может рассказать хвост вашей кошки?
- Верветки
- Отчетность бюджетных учреждений при закупках по Закону № 223-ФЗ
- Срок исковой давности как правильно рассчитать
- Дмитрий Патрушев минсельхоз будет ли преемником Путина
- Кто такой Владислав Поздняков? Что такое "Мужское Государство" и почему его признали экстремистским в России?
- Как правильно выбрать машинное масло в Димитровграде?
- Как стать богатым и знаменитым в России?
- Почему фильм "Пипец" (Kick-Ass) стал популярен по всему миру?
- Как стать мудрецом?
- Как правильно установить FreeBSD
- Как стать таким как Путин?
- Где лучше жить - в Димитровграде или в Ульяновске?
- Почему город Димитровград так называется?
- Что такое метамодерн?
- ВАЖНО! Временное ограничение движения автотранспортных средств в Димитровграде
- Тарифы на электроэнергию для майнеров предложено повысить
Для начала откроем urls.py и добавим строку для загрузки новой страницы на тот случай, когда в конце адреса передается идентификатор товара (например, http://127.0.0.1:8000/inventory/3/):
url(r’^inventory/(?P<item_id>\d+)/$’, ‘inventory.views.detail’),
Здесь формат URL задается регулярным выражением, и если адрес соответствует ему, мы загружаем вид ‘detail’. Важно отметить, что числу в конце адреса в этой строке соответствует переменная item_id. Мы ссылаемся на нее на этой странице.
Теперь добавим следующую функцию в наш файл views.py:
def detail(request, item_id):
item = Item.objects.get(pk=item_id)
return render_to_response(‘inventory/detail.html’, {‘item’:item})
Здесь вы видите, как переменная item_id передается функции, в которой с помощью функции Django get() проверяется соответствие этой переменной первичному ключу товара (pk). Затем для передачи остального шаблона мы вызываем все ту же функцию render_to_response().
Теперь создайте файл detail.html в каталоге templates/inventory и добавьте в него следующий код:
{% if item %}
Шаблон:Item.name
Category: Шаблон:Item.category
Description: Шаблон:Item.description
Quantity: Шаблон:Item.quantity
{% else %}
No items are available.
{% endif %}
Здесь мы просто выводим все поля. Теперь можно щелкнуть на элементе списка и получить подробную информацию о нем, как показано на рис. 3.
На нашем уроке мы познакомились со многими ключевыми идеями создания приложения в Django. Мы продвинулись далеко вперед, но это только начало. Нашей целью было познакомить вас с основными принципами, на основе которых вы сможете двигаться дальше. С фантастическим набором инструментов Django вы сможете создавать любые приложения, какие вам только понадобятся. Наслаждайтесь! |