2. Создатели Адриан Головатый ( Adrian Holovaty ), Саймон Виллисон ( Simon Willison ), Джекоб Каплан-Мосс ( Jacob Kaplan-Moss ), Вилсон Майнер ( Wilson Miner )
3. История Создатели: Эдриан Холовати (Adrian Holovaty) и Симон Виллисон Работали над созданием нескольких новостных сайтов для World Online Жесткие требования к времени разработки сайта Надо разрабатывать похожую функциональность Исходя из своих потребностей создали новый фреймворк 2005 год – библиотека становится открытой Джанго Рейнхардт в среде джазменов известный также под прозвищем «Великий Джа́нго» — джазмен-гитарист, один из основателей уникального стиля в гитарном джазе под названием «джаз-мануш», или «цыганский джаз».
5. Установка (1 /2) Установка Python Ядро среды Django работает с любыми версиями Python в диапазоне от 2.3 до 2.6 включительно. Python 3.0 пока не поддерживается. Установка официального релиза Django (из репозитория) или самой новой версии – из транка
10. Возможности обработки URL Blogs Articles News На сайте несколько разделов Разные страницы HTML генерируются по разному HTTP запрос Blogs Articles News URL обработчик HTML страница
11. Возможности обработки URL В Django для выбора обработчика запроса применяются регулярные выражения. Рассмотрим пример: from django.conf.urls.defaults import * from mysite.views import hello urlpatterns = patterns('', ('^hello/$', hello), … ) В данном случае http запрос на адрес http://mysite.ru/hello/ будет обрабатываться функцией hello
12. Возможности обработки URL Одна из приятных возможностей – выделение части URL как параметра и передачи ее в функцию - обработчик. (r'^time/plus/{1,2}/$', hours_ahead), - для запроса http://mysite.ru /time/plus/2 число 2 будет передано в функцию – обработчик hours_ahead в качестве второго параметра
14. Классическая модель MVC В создании сайтов часто используется архитектура MVC (model-view-controller). Модель (model) – инкапсулирует в себе всю работу с данными, в т.ч. работу с источниками данных (БД). Представление ( view) – отвечает за отображение информации (пользовательский интерфейс). Контроллер ( controller) – интерпретирует запросы, введенные пользователем, получает необходимые данные из модели и выводит их представление.
15. MTV ? В Django используется архитектура MTV (model-template-view). Модель ( model) – классы для работы с предметной логикой ( ORM) Шаблоны ( template) – формат генерации html страниц (и не только) по выбранным данным Представление (view) – обработка запросов пользователей, выборка данных из Модели и передачи их на генерацию в нужный Шаблон View Controller Template View Model Model MTV MVC
19. Зачем нужны шаблоны? HTML страницы Код на Python HTML страницы дизайнер программист Формат данных
20. Шаблоны Django Шаблон Django – это строка специального формата, предназначенная для разделения документа от его данных. Шаблон используется для генерации html страниц и представляет собой обычный html документ с обозначенными местами подстановки значений переменных и различными видами основной логики (шаблонные теги).
21. <html> <head><title>Ordering notice</title></head> <body> <h1>Ordering notice</h1> <p>Dear {{ person_name }} ,</p> <p>Thanks for placing an order from {{ company }} . It's scheduled to ship on {{ ship_date|date:"F j, Y" }} .</p> <p>Here are the items you've ordered:</p> <ul> {% for item in item_list %} <li> {{ item }} </li> {% endfor %} </ul> {% if ordered_warranty %} <p>Your warranty information will be included in the packaging.</p> {% else %} <p>You didn't order a warranty, so you're on your own when the products inevitably stop working.</p> {% endif %} <p>Sincerely,<br /> {{ company }} </p> </body> </html> подстановка значения переменной подстановка с применением фильтра обработка элементов списка if - else
22. Пример использования >>> from django import template >>> t = template.Template('My name is {{ name }}.') >>> c = template.Context({'name': 'Adrian'}) >>> print t.render(c) My name is Adrian. >>> c = template.Context({'name': 'Fred'}) >>> print t.render(c) My name is Fred.
23. Теги (1/3) if / else {% if today_is_weekend %} <p>Welcome to the weekend!</p> {% endif %} {% if today_is_weekend %} <p>Welcome to the weekend!</p> {% else %} <p>Get back to work.</p> {% endif %} Тег {% if %} принимает and , or или not для тестирования множества переменных или инвертирования.
24. Теги (2/3) f or Тег {% for %} позволяет обработать каждый элемент последовательности. <ul> {% for athlete in athlete_list %} <li> {{ athlete.name }} </li> {% endfor %} </ul> Для обработки списка в обратном порядке надо добавить reversed : {% for athlete in athlete_list reversed %} ... {% endfor %}
25. Теги (3/3) f or - empty {% for athlete in athlete_list %} <p> {{ athlete.name }} </p> {% empty %} <p>There are no athletes. Only computer programmers.</p> {% endfor %}
26. Другие теги Проверка эквивалентности {% ifequal a_val b_val %} Однострочный комментарий {# This is a comment #} Многострочный комментарий {% comment %} This is a multi-line comment. {% endcomment %}
31. Как создать модель? Нисходящий метод Классы Связи Схемы БД Восходящий метод Классы Связи Схемы БД Связи Связи
32. Модели в Django Для описания модели в Django надо написать класс, наследуемый от models.Model пакета django.db. Поля в описываемом классе – объекты типов models.CharField, models.URLField, models.EmailField и т.п. Для класса автоматически создаются методы для манипуляции с объектами, операции автоматически отображаются в базу данных. Рассмотрим пример:
33. from django.db import models class Publisher( models.Model ): name = models.CharField (max_length=30) address = models.CharField (max_length=50) city = models.CharField (max_length=60) state_province = models.CharField (max_length=30) country = models.CharField (max_length=50) website = models.URLField () class Author( models.Model ): salutation = models.CharField (max_length=10) first_name = models.CharField (max_length=30) last_name = models.CharField (max_length=40) email = models.EmailField () headshot = models.ImageField (upload_to='/tmp') class Book( models.Model ): title = models.CharField (max_length=100) authors = models.ManyToManyField (Author) publisher = models.ForeignKey (Publisher) publication_date = models.DateField ()
34. Создание объектов модели Создадим объект Publisher и сохраним его в БД >>> from books.models import Publisher >>> p1 = Publisher(name= 'Addison-Wesley' , address= '75 Arlington Street' , ... city= 'Boston' , state_province= 'MA' , country= 'U.S.A.' , ... website= 'http://www.apress.com/' ) >>> p1.save() Можно короче: >>> p1 = Publisher.objects.create(name= 'Apress' , ... address= '2855 Telegraph Avenue' , ... city= 'Berkeley' , state_province= 'CA' , country= 'U.S.A.' , ... website= 'http://www.apress.com/' )
35. Строковое представление Изменим объект Publisher : добавим метод __unicode__(self). class Publisher( models.Model ): name = models.CharField (max_length=30) address = models.CharField (max_length=50) city = models.CharField (max_length=60) state_province = models.CharField (max_length=30) country = models.CharField (max_length=50) website = models.URLField () def __unicode__(self): return self.name Метод __ unicode__ говорит системе как отображать данный объект в строковом представлении
36. Выборка объектов (1 /2) Отобразить все объекты: >>> Publisher.objects.all() [<Publisher: Apress>, <Publisher: O'Reilly>] Отобразить часть объектов(фильтр): >>> Publisher.objects.filter(name= 'Apress' ) [<Publisher: Apress>] >>> Publisher.objects.filter(country= "U.S.A." , state_province= "CA" ) [<Publisher: Apress>] >>> Publisher.objects.filter(name__contains= "press" ) [<Publisher: Apress>] Получение одного объекта >>> Publisher.objects.get(name= "Apress" ) <Publisher: Apress>
40. Зачем нужно кэширование? Схема без кэширования Схема с кэшированием HTTP запрос Обработка запроса Выборка данных Из БД Генерация HTML страницы HTML страница HTTP запрос HTML страница КЭШ
41. Кэширование в Django Memcached Кэширование в базу данных Кэширование на файловую систему Кэширование в оперативную память Dummy кэширование
42. Иерархия кэширования Blogs Articles News Кэширование всего сайта Blogs Articles News Кэширование отдельного представления News Низкоуровневый API
53. Что почитать? http://www.djangoproject.com/ - официальный сайт проекта http://www.djangobook.com/ - туториал по работе с Django http://djbook.ru/ - русский перевод Djangobook
55. Примерная схема работы Поддержание сайта Разработка схем кэширования 5-10% Интеграция 5% Обработка форм 20-25% Разработка views 25% Наполнение контентом (статьи, картинки, …) Настройка схем url 5% Настройка интерфейса администратора в соответствии с нуждами проетка 5% Разработка шаблонов (templates) Разработка классов ( model) 20% Разработка соглашений о необходимых данных для каждой страницы 5% Разработка структуры сайта ( URLs ) Выявление сущностей (классы) 5% Дизайнер Программист
56.
57. Шаг 1. Создание нового проекта Создаем новый проект: django-admin.py startproject MySuperProject Будет создана папка с названием MySuperApplication и следующим содержимым: Настройка URL (редактируется программистом) urls.py Здесь все настройки проекта, в частности настройки БД и подключаемые модули setting.py Управление проектом через специальные директивы, например manage.py runserver – запустит тестовый сервер manage.py технический файл __ init__.py
58. Шаг 2 . Создание моделей Создаем приложение (каждый класс должен быть определен в каком-нибудь приложении, для возможности последующей переносимости): manage.py startapp MyFirstApp Внутри проекта будет создана папка с названием MyFirstApp и следующим содержимым: Здесь надо описывать переносимые (?) views , необходимость сомнительна views.py Здесь надо описывать свои тесты tests.py Предполагается, что классы будут описываться тут models.py технический файл __ init__.py
59.
60.
61. Шаг 5. Настройка отображения в интерфейсе администратора Добавляем в папку приложения файл admin.py с примерно следующим содержимым: