SlideShare a Scribd company logo
1 of 20
Download to read offline
Типичные
сценарии web-
приложений
Типичные сценарии
•   Отображение объекта
•   Отображение списка объектов
•   Обработка форм и изменение объектов
•   Авторизация и сессии пользователей
•   Запуск фоновых процессов
•   Интеграция с внешними системами
2
Отображение
объекта
Маршрут в urls.py
# blog/urls.py
urlpatterns = [
url(r'^post/(?P<slug>w+)/$', post_details,
name='post-details'),
url(r'^tag/(?P<slug>w+)/$', tag_details,
name='tag-details'),
]
Часто на объекты ссылаются не по id, а по slug. Это позволяет
строить более запоминающиеся для человека URL.
4
Базовый view
from django.http import Http404
from django.shortcuts import render
def post_details(request, slug):
try:
post = Post.objects.get(slug=slug)
except Post.DoesNotExist:
raise Http404
return render(request, 'blog/post_details.html', {
'post': post,
})
5
Использование shortcut'ов
from django.shortcuts import render, get_object_or_404
from django.views.decorators.http import require_GET
@require_GET
def post_details(request, slug):
post = get_object_or_404(Post, slug=slug)
return render(request, 'blog/post_details.html', {
'post': post,
})
6
Связанные сущности
def post_details(request, slug):
post = get_object_or_404(Post, slug=slug)
try:
vote = post.votes.filter(user=request.user)[0]
except Vote.DoesNotExist:
vote = None
return render(request, 'blog/post_details.html', {
'post': post,
'category': post.category,
'tags': post.tags.all()[:],
'vote': vote,
})
7
Связанные сущности
<h1>{{ post.category.title }} - {{ post.title }}</h1>
{% for tag in post.tags.all %}
<a href="{{ tag.get_url }}">{{ tag }}</a>
{% endfor %}
8
Методы в моделях
from django.core.urlresolvers import reverse
class Tag(models.Model):
slug = models.SlugField(unique=True)
title = models.CharField(max_length=64)
def get_url(self):
return reverse('blog:tag-details',
kwargs={'slug': self.slug})
def __unicode__(self):
return self.title
9
Отображение
списка
объектов
Постраничное отображение
from django.core.paginator import Paginator
def post_list_all(request):
posts = Post.objects.filter(is_published=True)
limit = request.GET.get('limit', 10)
page = request.GET.get('page', 1)
paginator = Paginator(posts, limit)
paginator.baseurl = '/blog/all_posts/?page='
page = paginator.page(page) # Page
return render(request, 'blog/post_by_tag.html', {
'posts': page.object_list,
'paginator': paginator, 'page': page,
})
11
Шаблон paginator
<nav><ul class="pagination">
{% for p in paginator.page_range %}
{% if p.number == page.number %}
<li class="active">
{% else %}
<li>
{% endif %}
<a href="{{ paginator.baseurl }}{{ p.number }}">
{{ p.number }}</a>
</li>
{% endfor %}
</ul></nav>
12
django.core.paginator.Paginator
Свойства
•   count - полное число объектов
•   num_pages - полное число страниц
•   page_range - список страниц, например [1, 2, 3, 4]
Методы
•   page(n) - получить n-тый объект Page
13
django.core.paginator.Page
Свойства
•   object_list - список объектов на странице
•   number - порядковый номер страницы
Методы
•   has_next() / has_previous() - наличие соседней страницы
•   next_page_number() / previous_page_number()
•   start_index() / end_index() - номера первого и последнего
объектов на странице
14
Best practices
•   Проверять валидность параметров page и limit
•   Отображать 404 ошибку при некорректных параметрах
•   Ограничивать максимальное значение limit <= 1000
•   Обрабатывать «пустую» последнюю страницу
15
def paginate(request, qs):
try:
limit = int(request.GET.get('limit', 10))
except ValueError:
limit = 10
if limit > 100:
limit = 10
try:
page = int(request.GET.get('page', 1))
except ValueError:
raise Http404
paginator = Paginator(qs, limit)
try:
page = paginator.page(page)
except EmptyPage:
page = paginator.page(paginator.num_pages)
return page
16
Progressive
loading
Progressive loading
Постраничная загрузка хорошо работает в тех случаях, когда
легко определить число объектов, подходящих под поисковый
запрос. Другими словами - когда можно составить эффективный
SQL запрос.
Иногда это сделать сложно, например: «отображать все посты в
порядке добавления, но не больше одного поста из одной
категории подряд».
18
Свой ModelManager
class PostManager(models.Manager):
def main(self, since, limit=10):
qs = self.order_by('-id')
res = []
if since is not None:
qs = qs.filter('id__lt'=since)
for p in qs[:1000]:
if len(res):
res.append(p)
elif res[-1].category != p.category:
res.append(p)
if len(res) >= limit:
break
return res
19
view и шаблон
def post_list_main(request):
since = request.GET.get('since')
posts = Post.objects.main(since)
return render(request, 'blog/post_main.html', {
'posts': posts,
'since': posts[-1].id,
})
<a href="/blog/main/?since={{ since }}">Далее</a>
20

More Related Content

What's hot

Web весна 2013 лекция 4
Web весна 2013 лекция 4Web весна 2013 лекция 4
Web весна 2013 лекция 4Technopark
 
Yii 2. Что нового?
Yii 2. Что нового?Yii 2. Что нового?
Yii 2. Что нового?yiiconf
 
YiiConf 2012 - Alexander Makarov - Yii2, что нового
YiiConf 2012 - Alexander Makarov - Yii2, что новогоYiiConf 2012 - Alexander Makarov - Yii2, что нового
YiiConf 2012 - Alexander Makarov - Yii2, что новогоAlexander Makarov
 
Yii development
Yii developmentYii development
Yii developmentMageCloud
 
Интуит. Разработка приложений для iOS. Лекция 8. Работа с данными
Интуит. Разработка приложений для iOS. Лекция 8. Работа с даннымиИнтуит. Разработка приложений для iOS. Лекция 8. Работа с данными
Интуит. Разработка приложений для iOS. Лекция 8. Работа с даннымиГлеб Тарасов
 
Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Python Meetup
 
Реализация шаблонов корпоративных приложений в Magento
Реализация шаблонов корпоративных приложений в MagentoРеализация шаблонов корпоративных приложений в Magento
Реализация шаблонов корпоративных приложений в MagentoMagecom Ukraine
 
Магия метаклассов
Магия метаклассовМагия метаклассов
Магия метаклассовAndrey Zakharevich
 
PHP Advanced
PHP AdvancedPHP Advanced
PHP AdvancedNoveo
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Vasya Petrov
 
Jquery selector optimization in drupal
Jquery selector optimization in drupalJquery selector optimization in drupal
Jquery selector optimization in drupalYury Glushkov
 
Python dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееPython dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееdelimitry
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Vasya Petrov
 
Работа с БД в Drupal 7
Работа с БД в Drupal 7Работа с БД в Drupal 7
Работа с БД в Drupal 7Eugene Fidelin
 
Templates kachalova 2014_new
Templates kachalova 2014_newTemplates kachalova 2014_new
Templates kachalova 2014_newInSales
 

What's hot (20)

Web весна 2013 лекция 4
Web весна 2013 лекция 4Web весна 2013 лекция 4
Web весна 2013 лекция 4
 
Yii 2. Что нового?
Yii 2. Что нового?Yii 2. Что нового?
Yii 2. Что нового?
 
YiiConf 2012 - Alexander Makarov - Yii2, что нового
YiiConf 2012 - Alexander Makarov - Yii2, что новогоYiiConf 2012 - Alexander Makarov - Yii2, что нового
YiiConf 2012 - Alexander Makarov - Yii2, что нового
 
Yserver
YserverYserver
Yserver
 
Server optimization
Server optimizationServer optimization
Server optimization
 
Yii development
Yii developmentYii development
Yii development
 
Интуит. Разработка приложений для iOS. Лекция 8. Работа с данными
Интуит. Разработка приложений для iOS. Лекция 8. Работа с даннымиИнтуит. Разработка приложений для iOS. Лекция 8. Работа с данными
Интуит. Разработка приложений для iOS. Лекция 8. Работа с данными
 
Что нового в Django 1.4
Что нового в Django 1.4Что нового в Django 1.4
Что нового в Django 1.4
 
Javascript
JavascriptJavascript
Javascript
 
Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"
 
Реализация шаблонов корпоративных приложений в Magento
Реализация шаблонов корпоративных приложений в MagentoРеализация шаблонов корпоративных приложений в Magento
Реализация шаблонов корпоративных приложений в Magento
 
Магия метаклассов
Магия метаклассовМагия метаклассов
Магия метаклассов
 
PHP Advanced
PHP AdvancedPHP Advanced
PHP Advanced
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
Jquery selector optimization in drupal
Jquery selector optimization in drupalJquery selector optimization in drupal
Jquery selector optimization in drupal
 
Python dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееPython dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущее
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
Работа с БД в Drupal 7
Работа с БД в Drupal 7Работа с БД в Drupal 7
Работа с БД в Drupal 7
 
Templates kachalova 2014_new
Templates kachalova 2014_newTemplates kachalova 2014_new
Templates kachalova 2014_new
 
Perl: Symbol table
Perl: Symbol tablePerl: Symbol table
Perl: Symbol table
 

Viewers also liked

16 - Web-технологии. Технология AJAX
16 - Web-технологии. Технология AJAX16 - Web-технологии. Технология AJAX
16 - Web-технологии. Технология AJAXRoman Brovko
 
09 - Web-технологии. MVC фреймворки
09 - Web-технологии. MVC фреймворки09 - Web-технологии. MVC фреймворки
09 - Web-технологии. MVC фреймворкиRoman Brovko
 
15 - Web-технологии. Сессии и авторизация
15 - Web-технологии. Сессии и авторизация15 - Web-технологии. Сессии и авторизация
15 - Web-технологии. Сессии и авторизацияRoman Brovko
 
14 - Web-технологии. Обработка форм
14 - Web-технологии. Обработка форм14 - Web-технологии. Обработка форм
14 - Web-технологии. Обработка формRoman Brovko
 
02 - Web-технологии. Web-клиенты
02 - Web-технологии. Web-клиенты02 - Web-технологии. Web-клиенты
02 - Web-технологии. Web-клиентыRoman Brovko
 
01 - Web-технологии. Архитектура Web приложений
01 - Web-технологии. Архитектура Web приложений01 - Web-технологии. Архитектура Web приложений
01 - Web-технологии. Архитектура Web приложенийRoman Brovko
 
17 - Web-технологии. Real Time сообщения
17 - Web-технологии. Real Time сообщения17 - Web-технологии. Real Time сообщения
17 - Web-технологии. Real Time сообщенияRoman Brovko
 
01 - Системные требования
01 - Системные требования01 - Системные требования
01 - Системные требованияRoman Brovko
 
03 - Установка Xcode
03 - Установка Xcode03 - Установка Xcode
03 - Установка XcodeRoman Brovko
 
02 - Установка macOS
02 - Установка macOS02 - Установка macOS
02 - Установка macOSRoman Brovko
 
07 - Web-технологии. Web-сервера
07 - Web-технологии. Web-сервера07 - Web-технологии. Web-сервера
07 - Web-технологии. Web-сервераRoman Brovko
 
04 - Практика UML. Описание прецедентов
04 - Практика UML. Описание прецедентов04 - Практика UML. Описание прецедентов
04 - Практика UML. Описание прецедентовRoman Brovko
 
04 - Web-технологии. CSS - язык описания стилей
04 - Web-технологии. CSS - язык описания стилей04 - Web-технологии. CSS - язык описания стилей
04 - Web-технологии. CSS - язык описания стилейRoman Brovko
 
03 - Web-технологии. Язык разметки HTML
03 - Web-технологии. Язык разметки HTML03 - Web-технологии. Язык разметки HTML
03 - Web-технологии. Язык разметки HTMLRoman Brovko
 
Практический анализ и визуальное моделирование на UML
Практический анализ и визуальное моделирование на UMLПрактический анализ и визуальное моделирование на UML
Практический анализ и визуальное моделирование на UMLNikolai Kireev
 
08 - Web-технологии. Архитектура frontend-backend
08 - Web-технологии. Архитектура frontend-backend08 - Web-технологии. Архитектура frontend-backend
08 - Web-технологии. Архитектура frontend-backendRoman Brovko
 
66 - Spring. Spring и JSF
66 - Spring. Spring и JSF66 - Spring. Spring и JSF
66 - Spring. Spring и JSFRoman Brovko
 
09 - Java. Тестирование Java-программ
09 - Java. Тестирование Java-программ09 - Java. Тестирование Java-программ
09 - Java. Тестирование Java-программRoman Brovko
 
12 - Java. Разработка сетевых приложений на Java
12 - Java. Разработка сетевых приложений на Java12 - Java. Разработка сетевых приложений на Java
12 - Java. Разработка сетевых приложений на JavaRoman Brovko
 
10 - Java. Многопоточность в Java: основы
10 - Java. Многопоточность в Java: основы10 - Java. Многопоточность в Java: основы
10 - Java. Многопоточность в Java: основыRoman Brovko
 

Viewers also liked (20)

16 - Web-технологии. Технология AJAX
16 - Web-технологии. Технология AJAX16 - Web-технологии. Технология AJAX
16 - Web-технологии. Технология AJAX
 
09 - Web-технологии. MVC фреймворки
09 - Web-технологии. MVC фреймворки09 - Web-технологии. MVC фреймворки
09 - Web-технологии. MVC фреймворки
 
15 - Web-технологии. Сессии и авторизация
15 - Web-технологии. Сессии и авторизация15 - Web-технологии. Сессии и авторизация
15 - Web-технологии. Сессии и авторизация
 
14 - Web-технологии. Обработка форм
14 - Web-технологии. Обработка форм14 - Web-технологии. Обработка форм
14 - Web-технологии. Обработка форм
 
02 - Web-технологии. Web-клиенты
02 - Web-технологии. Web-клиенты02 - Web-технологии. Web-клиенты
02 - Web-технологии. Web-клиенты
 
01 - Web-технологии. Архитектура Web приложений
01 - Web-технологии. Архитектура Web приложений01 - Web-технологии. Архитектура Web приложений
01 - Web-технологии. Архитектура Web приложений
 
17 - Web-технологии. Real Time сообщения
17 - Web-технологии. Real Time сообщения17 - Web-технологии. Real Time сообщения
17 - Web-технологии. Real Time сообщения
 
01 - Системные требования
01 - Системные требования01 - Системные требования
01 - Системные требования
 
03 - Установка Xcode
03 - Установка Xcode03 - Установка Xcode
03 - Установка Xcode
 
02 - Установка macOS
02 - Установка macOS02 - Установка macOS
02 - Установка macOS
 
07 - Web-технологии. Web-сервера
07 - Web-технологии. Web-сервера07 - Web-технологии. Web-сервера
07 - Web-технологии. Web-сервера
 
04 - Практика UML. Описание прецедентов
04 - Практика UML. Описание прецедентов04 - Практика UML. Описание прецедентов
04 - Практика UML. Описание прецедентов
 
04 - Web-технологии. CSS - язык описания стилей
04 - Web-технологии. CSS - язык описания стилей04 - Web-технологии. CSS - язык описания стилей
04 - Web-технологии. CSS - язык описания стилей
 
03 - Web-технологии. Язык разметки HTML
03 - Web-технологии. Язык разметки HTML03 - Web-технологии. Язык разметки HTML
03 - Web-технологии. Язык разметки HTML
 
Практический анализ и визуальное моделирование на UML
Практический анализ и визуальное моделирование на UMLПрактический анализ и визуальное моделирование на UML
Практический анализ и визуальное моделирование на UML
 
08 - Web-технологии. Архитектура frontend-backend
08 - Web-технологии. Архитектура frontend-backend08 - Web-технологии. Архитектура frontend-backend
08 - Web-технологии. Архитектура frontend-backend
 
66 - Spring. Spring и JSF
66 - Spring. Spring и JSF66 - Spring. Spring и JSF
66 - Spring. Spring и JSF
 
09 - Java. Тестирование Java-программ
09 - Java. Тестирование Java-программ09 - Java. Тестирование Java-программ
09 - Java. Тестирование Java-программ
 
12 - Java. Разработка сетевых приложений на Java
12 - Java. Разработка сетевых приложений на Java12 - Java. Разработка сетевых приложений на Java
12 - Java. Разработка сетевых приложений на Java
 
10 - Java. Многопоточность в Java: основы
10 - Java. Многопоточность в Java: основы10 - Java. Многопоточность в Java: основы
10 - Java. Многопоточность в Java: основы
 

Similar to 13 - Web-технологии. Отображение данных

Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Minktyomo4ka
 
2014 Jeeconf - Geb Spock
2014 Jeeconf - Geb Spock2014 Jeeconf - Geb Spock
2014 Jeeconf - Geb SpockBohdan Danyliuk
 
Web осень 2013 лекция 8
Web осень 2013 лекция 8Web осень 2013 лекция 8
Web осень 2013 лекция 8Technopark
 
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
View как чистая функция от состояния базы данных  - Илья Беда, bro.agencyView как чистая функция от состояния базы данных  - Илья Беда, bro.agency
View как чистая функция от состояния базы данных - Илья Беда, bro.agencyit-people
 
Профилирование и оптимизация jQuery–кода
Профилирование и оптимизация jQuery–кодаПрофилирование и оптимизация jQuery–кода
Профилирование и оптимизация jQuery–кодаprivate_face
 
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)Ontico
 
Мульти-доменность в Django проекте
Мульти-доменность в Django проектеМульти-доменность в Django проекте
Мульти-доменность в Django проектеAlexey Kinyov
 
django cheBit'11
django cheBit'11django cheBit'11
django cheBit'11dva
 
Регрессионное тестирование верстки
Регрессионное тестирование версткиРегрессионное тестирование верстки
Регрессионное тестирование версткиTalks&Works
 
Командная разработка “толстых клиентов”
Командная разработка “толстых клиентов”Командная разработка “толстых клиентов”
Командная разработка “толстых клиентов”Open-IT
 
Профилирования и оптимизация jQuery-кода
Профилирования и оптимизация jQuery-кодаПрофилирования и оптимизация jQuery-кода
Профилирования и оптимизация jQuery-кодаprivate_face
 
Sequel — механизм доступа к БД, написанный на Ruby
Sequel — механизм доступа к БД, написанный на RubySequel — механизм доступа к БД, написанный на Ruby
Sequel — механизм доступа к БД, написанный на RubyAlexey Nayden
 
Take more from Jquery
Take more from JqueryTake more from Jquery
Take more from JqueryMagento Dev
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов ИгорьPVasili
 
Web весна 2012 лекция 4
Web весна 2012 лекция 4Web весна 2012 лекция 4
Web весна 2012 лекция 4Technopark
 
JavaScript. Event Model (in russian)
JavaScript. Event Model (in russian)JavaScript. Event Model (in russian)
JavaScript. Event Model (in russian)Mikhail Davydov
 
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...Yandex
 
«Индексация сайтов в Яндексе» 17 лекция, александр смирнов
«Индексация сайтов в Яндексе» 17 лекция, александр смирнов«Индексация сайтов в Яндексе» 17 лекция, александр смирнов
«Индексация сайтов в Яндексе» 17 лекция, александр смирновЕвгений Летов
 

Similar to 13 - Web-технологии. Отображение данных (20)

Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Mink
 
2014 Jeeconf - Geb Spock
2014 Jeeconf - Geb Spock2014 Jeeconf - Geb Spock
2014 Jeeconf - Geb Spock
 
Django
DjangoDjango
Django
 
Web осень 2013 лекция 8
Web осень 2013 лекция 8Web осень 2013 лекция 8
Web осень 2013 лекция 8
 
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
View как чистая функция от состояния базы данных  - Илья Беда, bro.agencyView как чистая функция от состояния базы данных  - Илья Беда, bro.agency
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
 
Профилирование и оптимизация jQuery–кода
Профилирование и оптимизация jQuery–кодаПрофилирование и оптимизация jQuery–кода
Профилирование и оптимизация jQuery–кода
 
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)
 
Мульти-доменность в Django проекте
Мульти-доменность в Django проектеМульти-доменность в Django проекте
Мульти-доменность в Django проекте
 
django cheBit'11
django cheBit'11django cheBit'11
django cheBit'11
 
Jsfwdays 2013-2
Jsfwdays 2013-2Jsfwdays 2013-2
Jsfwdays 2013-2
 
Регрессионное тестирование верстки
Регрессионное тестирование версткиРегрессионное тестирование верстки
Регрессионное тестирование верстки
 
Командная разработка “толстых клиентов”
Командная разработка “толстых клиентов”Командная разработка “толстых клиентов”
Командная разработка “толстых клиентов”
 
Профилирования и оптимизация jQuery-кода
Профилирования и оптимизация jQuery-кодаПрофилирования и оптимизация jQuery-кода
Профилирования и оптимизация jQuery-кода
 
Sequel — механизм доступа к БД, написанный на Ruby
Sequel — механизм доступа к БД, написанный на RubySequel — механизм доступа к БД, написанный на Ruby
Sequel — механизм доступа к БД, написанный на Ruby
 
Take more from Jquery
Take more from JqueryTake more from Jquery
Take more from Jquery
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов Игорь
 
Web весна 2012 лекция 4
Web весна 2012 лекция 4Web весна 2012 лекция 4
Web весна 2012 лекция 4
 
JavaScript. Event Model (in russian)
JavaScript. Event Model (in russian)JavaScript. Event Model (in russian)
JavaScript. Event Model (in russian)
 
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
 
«Индексация сайтов в Яндексе» 17 лекция, александр смирнов
«Индексация сайтов в Яндексе» 17 лекция, александр смирнов«Индексация сайтов в Яндексе» 17 лекция, александр смирнов
«Индексация сайтов в Яндексе» 17 лекция, александр смирнов
 

More from Roman Brovko

Individual task Networking
Individual task NetworkingIndividual task Networking
Individual task NetworkingRoman Brovko
 
Networking essentials lect3
Networking essentials lect3Networking essentials lect3
Networking essentials lect3Roman Brovko
 
Gl embedded starterkit_ethernet
Gl embedded starterkit_ethernetGl embedded starterkit_ethernet
Gl embedded starterkit_ethernetRoman Brovko
 
Networking essentials lect2
Networking essentials lect2Networking essentials lect2
Networking essentials lect2Roman Brovko
 
Networking essentials lect1
Networking essentials lect1Networking essentials lect1
Networking essentials lect1Roman Brovko
 
Bare metal training_07_spi_flash
Bare metal training_07_spi_flashBare metal training_07_spi_flash
Bare metal training_07_spi_flashRoman Brovko
 
Bare metal training_06_I2C
Bare metal training_06_I2CBare metal training_06_I2C
Bare metal training_06_I2CRoman Brovko
 
Bare metal training_05_uart
Bare metal training_05_uartBare metal training_05_uart
Bare metal training_05_uartRoman Brovko
 
Bare metal training_04_adc_temp_sensor
Bare metal training_04_adc_temp_sensorBare metal training_04_adc_temp_sensor
Bare metal training_04_adc_temp_sensorRoman Brovko
 
Bare metal training_03_timers_pwm
Bare metal training_03_timers_pwmBare metal training_03_timers_pwm
Bare metal training_03_timers_pwmRoman Brovko
 
Bare metal training_02_le_ds_and_buttons
Bare metal training_02_le_ds_and_buttonsBare metal training_02_le_ds_and_buttons
Bare metal training_02_le_ds_and_buttonsRoman Brovko
 
Bare metal training_01_hello_world
Bare metal training_01_hello_worldBare metal training_01_hello_world
Bare metal training_01_hello_worldRoman Brovko
 
Bare metal training_00_prerequisites
Bare metal training_00_prerequisitesBare metal training_00_prerequisites
Bare metal training_00_prerequisitesRoman Brovko
 
C language lect_23_advanced
C language lect_23_advancedC language lect_23_advanced
C language lect_23_advancedRoman Brovko
 
C language lect_22_advanced
C language lect_22_advancedC language lect_22_advanced
C language lect_22_advancedRoman Brovko
 
C language lect_21_advanced
C language lect_21_advancedC language lect_21_advanced
C language lect_21_advancedRoman Brovko
 
подготовка рабочего окружения
подготовка рабочего окруженияподготовка рабочего окружения
подготовка рабочего окруженияRoman Brovko
 
C language lect_20_advanced
C language lect_20_advancedC language lect_20_advanced
C language lect_20_advancedRoman Brovko
 
C language lect_19_basics
C language lect_19_basicsC language lect_19_basics
C language lect_19_basicsRoman Brovko
 

More from Roman Brovko (20)

Individual task Networking
Individual task NetworkingIndividual task Networking
Individual task Networking
 
Networking essentials lect3
Networking essentials lect3Networking essentials lect3
Networking essentials lect3
 
Gl embedded starterkit_ethernet
Gl embedded starterkit_ethernetGl embedded starterkit_ethernet
Gl embedded starterkit_ethernet
 
Networking essentials lect2
Networking essentials lect2Networking essentials lect2
Networking essentials lect2
 
Networking essentials lect1
Networking essentials lect1Networking essentials lect1
Networking essentials lect1
 
Bare metal training_07_spi_flash
Bare metal training_07_spi_flashBare metal training_07_spi_flash
Bare metal training_07_spi_flash
 
Bare metal training_06_I2C
Bare metal training_06_I2CBare metal training_06_I2C
Bare metal training_06_I2C
 
Glesk worshop
Glesk worshopGlesk worshop
Glesk worshop
 
Bare metal training_05_uart
Bare metal training_05_uartBare metal training_05_uart
Bare metal training_05_uart
 
Bare metal training_04_adc_temp_sensor
Bare metal training_04_adc_temp_sensorBare metal training_04_adc_temp_sensor
Bare metal training_04_adc_temp_sensor
 
Bare metal training_03_timers_pwm
Bare metal training_03_timers_pwmBare metal training_03_timers_pwm
Bare metal training_03_timers_pwm
 
Bare metal training_02_le_ds_and_buttons
Bare metal training_02_le_ds_and_buttonsBare metal training_02_le_ds_and_buttons
Bare metal training_02_le_ds_and_buttons
 
Bare metal training_01_hello_world
Bare metal training_01_hello_worldBare metal training_01_hello_world
Bare metal training_01_hello_world
 
Bare metal training_00_prerequisites
Bare metal training_00_prerequisitesBare metal training_00_prerequisites
Bare metal training_00_prerequisites
 
C language lect_23_advanced
C language lect_23_advancedC language lect_23_advanced
C language lect_23_advanced
 
C language lect_22_advanced
C language lect_22_advancedC language lect_22_advanced
C language lect_22_advanced
 
C language lect_21_advanced
C language lect_21_advancedC language lect_21_advanced
C language lect_21_advanced
 
подготовка рабочего окружения
подготовка рабочего окруженияподготовка рабочего окружения
подготовка рабочего окружения
 
C language lect_20_advanced
C language lect_20_advancedC language lect_20_advanced
C language lect_20_advanced
 
C language lect_19_basics
C language lect_19_basicsC language lect_19_basics
C language lect_19_basics
 

13 - Web-технологии. Отображение данных

  • 2. Типичные сценарии •   Отображение объекта •   Отображение списка объектов •   Обработка форм и изменение объектов •   Авторизация и сессии пользователей •   Запуск фоновых процессов •   Интеграция с внешними системами 2
  • 4. Маршрут в urls.py # blog/urls.py urlpatterns = [ url(r'^post/(?P<slug>w+)/$', post_details, name='post-details'), url(r'^tag/(?P<slug>w+)/$', tag_details, name='tag-details'), ] Часто на объекты ссылаются не по id, а по slug. Это позволяет строить более запоминающиеся для человека URL. 4
  • 5. Базовый view from django.http import Http404 from django.shortcuts import render def post_details(request, slug): try: post = Post.objects.get(slug=slug) except Post.DoesNotExist: raise Http404 return render(request, 'blog/post_details.html', { 'post': post, }) 5
  • 6. Использование shortcut'ов from django.shortcuts import render, get_object_or_404 from django.views.decorators.http import require_GET @require_GET def post_details(request, slug): post = get_object_or_404(Post, slug=slug) return render(request, 'blog/post_details.html', { 'post': post, }) 6
  • 7. Связанные сущности def post_details(request, slug): post = get_object_or_404(Post, slug=slug) try: vote = post.votes.filter(user=request.user)[0] except Vote.DoesNotExist: vote = None return render(request, 'blog/post_details.html', { 'post': post, 'category': post.category, 'tags': post.tags.all()[:], 'vote': vote, }) 7
  • 8. Связанные сущности <h1>{{ post.category.title }} - {{ post.title }}</h1> {% for tag in post.tags.all %} <a href="{{ tag.get_url }}">{{ tag }}</a> {% endfor %} 8
  • 9. Методы в моделях from django.core.urlresolvers import reverse class Tag(models.Model): slug = models.SlugField(unique=True) title = models.CharField(max_length=64) def get_url(self): return reverse('blog:tag-details', kwargs={'slug': self.slug}) def __unicode__(self): return self.title 9
  • 11. Постраничное отображение from django.core.paginator import Paginator def post_list_all(request): posts = Post.objects.filter(is_published=True) limit = request.GET.get('limit', 10) page = request.GET.get('page', 1) paginator = Paginator(posts, limit) paginator.baseurl = '/blog/all_posts/?page=' page = paginator.page(page) # Page return render(request, 'blog/post_by_tag.html', { 'posts': page.object_list, 'paginator': paginator, 'page': page, }) 11
  • 12. Шаблон paginator <nav><ul class="pagination"> {% for p in paginator.page_range %} {% if p.number == page.number %} <li class="active"> {% else %} <li> {% endif %} <a href="{{ paginator.baseurl }}{{ p.number }}"> {{ p.number }}</a> </li> {% endfor %} </ul></nav> 12
  • 13. django.core.paginator.Paginator Свойства •   count - полное число объектов •   num_pages - полное число страниц •   page_range - список страниц, например [1, 2, 3, 4] Методы •   page(n) - получить n-тый объект Page 13
  • 14. django.core.paginator.Page Свойства •   object_list - список объектов на странице •   number - порядковый номер страницы Методы •   has_next() / has_previous() - наличие соседней страницы •   next_page_number() / previous_page_number() •   start_index() / end_index() - номера первого и последнего объектов на странице 14
  • 15. Best practices •   Проверять валидность параметров page и limit •   Отображать 404 ошибку при некорректных параметрах •   Ограничивать максимальное значение limit <= 1000 •   Обрабатывать «пустую» последнюю страницу 15
  • 16. def paginate(request, qs): try: limit = int(request.GET.get('limit', 10)) except ValueError: limit = 10 if limit > 100: limit = 10 try: page = int(request.GET.get('page', 1)) except ValueError: raise Http404 paginator = Paginator(qs, limit) try: page = paginator.page(page) except EmptyPage: page = paginator.page(paginator.num_pages) return page 16
  • 18. Progressive loading Постраничная загрузка хорошо работает в тех случаях, когда легко определить число объектов, подходящих под поисковый запрос. Другими словами - когда можно составить эффективный SQL запрос. Иногда это сделать сложно, например: «отображать все посты в порядке добавления, но не больше одного поста из одной категории подряд». 18
  • 19. Свой ModelManager class PostManager(models.Manager): def main(self, since, limit=10): qs = self.order_by('-id') res = [] if since is not None: qs = qs.filter('id__lt'=since) for p in qs[:1000]: if len(res): res.append(p) elif res[-1].category != p.category: res.append(p) if len(res) >= limit: break return res 19
  • 20. view и шаблон def post_list_main(request): since = request.GET.get('since') posts = Post.objects.main(since) return render(request, 'blog/post_main.html', { 'posts': posts, 'since': posts[-1].id, }) <a href="/blog/main/?since={{ since }}">Далее</a> 20