Step 2 (S-44803)
Step on Stepik: https://stepik.org/lesson/14831/step/2
[00:00 - 00:18] мы с вами рассмотрели основные компоненты фреймворка django и теперь переходим к рассмотрению типичных для приложения сценариев естественно мы будем их реализации использовать уже имеющийся функционал
[00:18 - 00:35] а пятак какие есть типичный сценарий а сразу оговоримся что часть сценариев проходят мимо аппликейшен сервера из мы говорили что статически документов нас обрабатывается веб сервером фронтэндом
[00:35 - 00:54] персистентная соединения обрабатывается отдельным сервером а но тем не менее большая часть а бизнес логики в приложениях обрабатываешь аппликейшен сервер а и типичный сценарий можно выделить следующие 1 самый простой сценарий это отображение объектов
[00:54 - 01:11] а мы в дальнейшем обсуждении предполагаем что объект хранится в реляционной базе данных а в нашем случае мы начали говорить про блок посты в блоге поэтому на с объектом будет пост в блоге
[01:11 - 01:28] но в принципе объект может быть произвольно и структуры может храниться в 1 таблице в нескольких либо в разных базах данных типами только базы данных это зависит от модели данных которая есть в вашем приложении
[01:28 - 01:45] как правило отображения 1 объекта это достаточно простой сценарий а следующий сценарий это отображение списка объектов здесь ситуация несколько сложнее все зависит от задание которое стоит 1
[01:45 - 02:00] поставленной задачи это может быть как простейший запрос к базе данных к 1 таблице так и очень сложная выборка например полнотекстовый поиск а любовь что то иное а мы будем рассматривать
[02:00 - 02:15] 2 варианта загрузки данных из базы попроще чуть посложнее а в большинстве случаев вот приложение предоставляет возможность для изменения хранящихся в них да
[02:15 - 02:30] это делается с помощью отправке форм поэтому 3 важный сценарий это обработка форм изменения хранящихся данных
[02:30 - 02:48] когда мы говорим про какие то изменения с время возникает проблема авторизации то есть мы подавляющем большинстве случаев не можем позволить изменять а данные в приложении com good
[02:48 - 03:03] вы должны знать какой пользователь выполняет запрос поэтому 4 важная функция в приложениях авторизация править проверка авторизации и поддержания сессии пользователей
[03:03 - 03:21] а вот эти 4 сценария мы рассмотрим детально и а есть еще 2 меня важно сценария мы хотим с поверхности а запуск фоновых процессов
[03:21 - 03:37] предполагается что в наше положение состоит не только из обработчиков и запросов носики из каких то фоновых процессов например очистка данных который все время работы и интеграция с внешними системами
[03:37 - 03:53] большинство приложений работают не в вакууме как то взаимодействовать с внешним миром а с чесноков с другими приложениями либо другими информационными стен и так
[03:53 - 04:11] мы переходим к рассмотрению 1 и простейшего сценария это отображение объектов как мы говорили у нас мы предполагаем что мы разрабатывали некоторую систему ведения блогов
[04:11 - 04:25] поэтому для нас является пост в блоге 1 с чего нужно начать нужно определить с какого а по какому урлу будет отображаться а тот или иной объект
[04:25 - 04:40] а мы предполагаем что у нас обед будет отображаться по урлу слэш blog это префикс нашего приложения django слэш post
[04:40 - 04:58] а некоторые текстовые фрагмент текста мин заметьте что здесь мы использовали именно текст не
[04:58 - 05:14] а весьма часто здесь используют вместо текста просто число идентификатор поста как правило это идентификатор базы данных а ну число обычно называют айтишников а вот для
[05:14 - 05:33] а тексту фрагмента текста которая встречается у людей есть а специальное слово его называют термином slug а это общем так так так принято в инфраструктуре django а вот этот фрагмент называть флагом объекта
[05:33 - 05:52] здесь довольно простой мы указываем что захватываем определенный угол захватывает из урла а последовательность символов перемен slug и
[05:52 - 06:06] данный маршрут ведет к вьюшки post thanks которая будет показывать а непосредственно будет отображать страницу поста а давать
[06:06 - 06:26] перейдем собственно говоря q и посмотрим как она выглядит вот юшку post it tells это базовый такой пример что происходит во 1 мы видим что у нее есть параметр флаг а это тот параметр который мы захватили и основной ход состоит из
[06:26 - 06:42] вызова метода get у нас есть модель пост гет а важный момент при отображении объекта а заключается в том что объект может быть
[06:42 - 06:58] ненайдя простейший вариант его удалили из базы данных а поэтому ваш запрос он может закончится не получением объект а вот таким исключением post does not exist
[06:58 - 07:13] если от исключений не перехватить оно придет появления 500 ошибка что не корректно а любой найденный объект должен отображаться в виде страница 404 для этого в django есть
[07:13 - 07:32] специальный exception которые нужно выбросить поэтому мы перехватываем exception does not exist и бросаем вместо него теперь 404 собственно вот и все как обещал спроста полученный объект
[07:32 - 07:51] мы получили объект post его нужно каким то образом отобразить ведешь моя страничка для этого мы используем механизма шаблонизации делаем вызов метода снять функция рендер указываем шаблон которая соответствует страница 1 поста и передаем туда данные
[07:51 - 08:10] post а здесь все просто но в этой книжке есть несколько допущении недоработок например вот это очень длинная конструкции и не охота писать каждый раз
[08:10 - 08:27] а поэтому джанги есть так называемый шоткаты вот как это функции для выполнения типичных бытовых операций ну 1 уже известные нам шутка это рендер которое вызывает шаблонизатор
[08:27 - 08:43] на самом деле шаблонизатор состоит из нескольких класс вызывается более сложным образом но от нас спасает большинстве случаев для загрузки объекта из базы а есть шутка
[08:43 - 09:02] о 404 используется он следующим образом это просто функция а 1 аргументом в функцию передается класс модели нашем случае это post а оставшийся аргумента это
[09:02 - 09:17] а аргументы к вызову метода get нашем случае условия выборки по словам а если по сбылась мы получим переменную фактически кот кот
[09:17 - 09:34] мы видели на продающем сайте а он позволяет нам сократить объем кода который мы пишем и а 2 вещь поскольку данная ветка предназначена для отображения данных а желательно то обозначить и использовать декоратор
[09:34 - 09:50] который запретит другие запросы например у меня тут post а потому что дал данный предполагается что он будет обрабатываться методом get он будет отображать
[09:50 - 10:08] но принципиально кот делает тоже самое следующий момент это отображение связанных сущностей то есть надо понимать что в большинстве случаев странице поста она состоит а скажем не только из данных с моего поста
[10:08 - 10:23] что такое пост в блоге это заголовок и текст по сути а на странице поста отображается а разные вещи помимо самого поста категории этого поста теги поста авто а список пользователей компот
[10:23 - 10:42] понравился кому не понравился а динамика визитов то есть куча данных связанных с конкретной запись это дополнительный контент на странице а каким образом нужно отображать эти данные на странице поста например
[10:42 - 11:01] а представим что у нас есть таблица с лайками либо с голосами а пользователей и хотим вывести показание текущего пользователя то есть э ну отношение текущего пользователя к данному
[11:01 - 11:18] то есть после лайкал а если там лайкал то там такой поставь какую оценку а для этого помимо загрузки самого поста загрузили post мы вызываем метод
[11:18 - 11:33] вот так вот вот точка фильтр то есть с данным постом связанный объект голосов а вот это relation waltz а и фильтруем
[11:33 - 11:51] список голосов по текущему пользователю то есть тот голос который отдал текущий пользователь получает лестно 1 объект ну поскольку предполагает что 1 пользователь 1 пост может 1 раз а может случиться так что пользователь не голосовал в таком случае мы перехватываем исключения это не ошибка
[11:51 - 12:06] нормальное состояние и возвращаем а вместо этого нам дали а для странице поста мы будем показывают категорию и список тегов
[12:06 - 12:23] а для того чтобы загрузить из поста категории мы воспользуемся методом модели нас метод категория чем свойства а объектов постов которая загружает объект категория связаны с ним и
[12:23 - 12:38] свойство text которая позволяет нам получить полный список тегов связаны с этим постом мы про это говорили да осуждали а в результате у нас данные которые передаются в нашем доме
[12:38 - 12:57] а с их стало больше помимо поста мы передаем явно категорию я на список тегов явно а голос использовать ну здесь тоже все довольно просто то есть если нам нужны дополнительные данные и мы должны их загрузить
[12:57 - 13:15] внутри вью и передать текст шаблонизатор во многих случаях можно обойтись без вот этого то есть мы видим что наш кот он раздувается нас появляется дополнительная загрузка здесь дополнительная логика
[13:15 - 13:34] удалить в дополнительном доходе хотя бы элементарно а во многих случаях можно обойтись а только шаблонизатор мы знаем что а завтра django присутствует такая фича такая возможность как вызов методов объектов и вызов
[13:34 - 13:50] свойств а без возможности передачи аргумент а поэтому если мы не загружает дополнительных данных то есть например вот это не загружали и вот это не загружали
[13:50 - 14:06] может в шаблоне загрузить разгрузить дам непосредственно шаблон то есть нас есть объект post и шаблона обращаемся к свойствам категории получаю уже объект категории связанные с постом выводим ее заголовок
[14:06 - 14:23] то есть простейшая а обращение от от 1 модели связано можно делать и удобно делать непосредственно из шаблона здесь водится список название поста а
[14:23 - 14:41] 2 строчке показывается пример как пройтись по всем темам поста то есть мы обращаемся к связи текст который есть в посте а точка com чтобы получить кое reset и для каждого тэга мы вводим ссылку на
[14:41 - 14:56] имя тэга а то есть если вам нужна просто отобразить как это сделать простейшую загрузку нет смысла а эту загрузку делать во вью это можно перевести в шаблон
[14:56 - 15:13] тут нужно соблюдать баланс слишком много кода в шаблонах от общем то плохо а далее а нужно обратить внимание на 3 строчку каким образом мы вводим ссылку на
[15:13 - 15:29] конкретной так здесь важно 2 вещи во 1 мы не формируем уру внутри шаблона вызывает некоторое свойство либо метод get а 2 мы
[15:29 - 15:43] не выводим какой то конкретной поля а от объекта тег мы выводим как бы так целиком 16 есть тег тег на самом деле это объект
[15:43 - 16:02] модель вводим как бы как строчку а для того чтобы вот эта строка корректно работала в моделях нужно определить специальные методы и а вот эти методы которые показаны этом слайде
[16:02 - 16:17] это очень полезная общепринятые такое соглашение во 1 метод подчеркивание подчеркивание юникод это метод называемый стринги фиксации
[16:17 - 16:36] объекта то есть этот метод позволяет любой объект представить в виде строки а когда питон образовать объект сроку например при печати с помощью оператора форматирование либо при выводе в шаблоне проверяется наличие этого метода если
[16:36 - 16:51] метод присутствует а он вызывается это должен вернуть подстроку ну в нашем случае он возвращает значение поля title а это позволяет вам не плодить лишних от ваших шаблонах
[16:51 - 17:09] и а в сложных системах где теги могут отображаться в десятках страниц это позволяет централизованно изменить отображение тэга 2 важный подход это метод который возвращает а
[17:09 - 17:26] урок странице данного объекта то есть предполагается что в некоторых объектов есть своя страница ну понятно что поставить своей странице у тэга тоже есть своя страница как правило на этой странице написано заголовок т к ней список постов
[17:26 - 17:42] вместо того чтобы во всех шаблонах копировать урл мы вызываем метод модель д которую нас записан в 1 месте а собсна говоря здесь мы используем
[17:42 - 17:58] мы тоже говорили указываем имя роутера и передаем аргументы таким образом а строится а строится абсолютный путь данной модели а
[17:58 - 18:17] в общем то это все приемы которые хотелось бы обсудить при котором используется при отображении 1 модели а важным еще раз хотелось отметить а то что мы стараемся размещать код можно больше года в модели про это
[18:17 - 18:34] я уже говорил и к нему возвращаюсь еще раз мы видим что в данном случае мы а разместили в моделях методах и пример построения полу это важно это позволяет избавиться от дублирования в других частях системы