Step 3 (S-44895)

From Stepik Wiki
Jump to: navigation, search

Step on Stepik: https://stepik.org/lesson/14834/step/3

Step 3 (S-44895) 1.png

[00:00 - 00:14] начнем с рассмотрения простого варианта при котором обработчик запросов возвращает а что мы да а действительно существуют на самом деле ну распространено 2 варианта


[00:14 - 00:34] при котором возвращается мы данные и а возвращаться структурированные данные а видят в xml а загрузка данных а популярным при динамической перерисовке страниц например когда вы хотите загрузить еще немножко комментариев


[00:34 - 00:50] а перейти к следующей странице новостей не перезагружая остальное то есть когда вам нужны просто в этом случае обработчика запроса отдает обычный


[00:50 - 01:08] обычно что мы страницу практически точно так же как он делает этот при а при обычном запросе а вот здесь приведен пример ничего необычного мы не видим получаем идентификатор поста загружаем


[01:08 - 01:27] сам объект поста а с помощью функции поражены про которую мы говорили свойства хвост кометы то есть список комментариев данного поста мы получаем а следующий набор комментариев следующую страницу с комментариями


[01:27 - 01:42] и соответственно отрисовываем ее с помощью шаблонизатора а единственный нюанс про которое здесь следует упомянуть это то что а вот в этом шаблоне отрисовывается только страниц комментариев


[01:42 - 01:59] то есть этот шаблон не рисует обвязку сайта ne заголовок они хедер и футер никакие java скрипты и стили туда не загружаются здесь только что содержащий комментарии все больше здесь ничего нет


[01:59 - 02:17] а это существенно уменьшают объем данных а такой подход загрузка данных с помощью используется когда а маловероятно какие то ошибки то есть загрузка комментариев не проверяет авторизацию


[02:17 - 02:35] и практически никаких ошибок здесь быть не может то есть которой следовал показывать пользователю нашу кожу 404 я с неправильной post id но поскольку post id формируется с помощью java скрипта то есть вы же сами указываете какой post id выбирать поэтому


[02:35 - 02:54] такую ошибку можно не показывает главное чтобы следить чтобы тень были правильной идентификации а в более сложных случаях нам необходимо каким то образом структурировать данные например при отправке форм


Step 3 (S-44895) 2.png

[02:54 - 03:11] нам нужно сообщить об ошибке на сегодняшний день для передачи данных между фронтэндом и бэкэндом чаще всего используется jesaul но вместе с запросом а


[03:11 - 03:29] json использоваться по 2 причинам во 1 это естественная структура для javascript то есть браузер очень легко преобразует э джисон а в javascript объекта а во 2 а джисон легко более менее легко преобразуется в структуры на


[03:29 - 03:45] а динамических языках программирования то есть это сон легко стерилизуется из питона структур списков объектов легко получается трусов и обратно и это же верно общем то для 1 у печки и тому подобное


[03:45 - 04:02] а что быть конкретно я предлагаю применять такие 2 вида ответ в случае если а ваш клиент возвращает


[04:02 - 04:20] а какой то успешный ответ использовать со следующего рода структуру обязательно есть поле статус в же соня который указывает на успешность не успешность выполнения случае с успешным выполнением статус окей а остальные поля


[04:20 - 04:38] ответ а это произвольные данные которые зависят от а от конкретной вьюшки в нашем случае content id это идентификатор нового добавлено в комменты ну чтобы тесто не может быть что то сделать


[04:38 - 04:57] в случае с ошибками очень важно чтобы все ошибки которая возвращает заявкам а выглядели обладали единой структуры а важно чтобы было поле код название может отличаться приложения приложения и а после месячных


[04:57 - 05:13] а в поле код содержатся а программный код ошибки именно на вот эту вот ну вот это поле будет ориентироваться фронтенд разработчик когда будет писать обработчики ошибок а


[05:13 - 05:28] вот это поле можно показать пользователю опционально можно ли показывать почему почему мы используем именно свои варианты то есть свою структуру для сообщение


[05:28 - 05:46] в принципе мы могли бы использовать стандартные а кода теперь ошибок то есть а 400 401 403 а проблема в том что на практике ошибок гораздо больше разновидности ошибок возникает гораздо больше чем


[05:46 - 06:02] а степи кодов и как правило нужно сообщать дополнительно информацию про эти ошибки мы здесь мы видим что текста текст сообщает какой то код таких кодов могут быть сотни


[06:02 - 06:21] а сообщается что только читаемый текст об ошибке если мы а сохраняя форму через аякс запрос нам может понадобиться передать информацию про все поля формы то есть каждые пол поля успешно или неуспешно сохранилось то есть информация про структура ошибок она может быть очень


[06:21 - 06:39] очень сложно поэтому я не удобно упаковывать в степи кода ответов на все равно придется как то в теле ответа передавать сериализованном виде эту информацию поэтому предлагаю поступить проще ли


[06:39 - 06:56] не рассчитывать на типикона ответа всегда отвечать 200 а сообщения об ошибках передавать вот в такой структуре а смотреть в такой структуре в основном передаются с кодом кто то по 220 200 ok


[06:56 - 07:11] передаются ошибки бизнес логике то есть если ваш сервер не может соединиться с базой данных или произошла какая то другая ошибка


[07:11 - 07:28] которую вы не можете обработать а вы можете смело возвращать 500 код ошибки то есть выбрасывать exception вращать 500 от ошибки в таком случае а аякс call back вызвал не будет будет вызван обработчик


[07:28 - 07:45] но скорее всего в этом случае ничего поделать уже нельзя то есть лучшее что может сделать front end разработчика то написать чтобы изменить возникли какие то внутренние проблемы пятак а каким образом


[07:45 - 08:02] выводить вот такие данные с помощью нашего фреймворка junk ну во 1 у нас есть стандартный объекта через pos можно использовать его главное правильным образом сформировать тело ответа и задать правильный content type но


Step 3 (S-44895) 3.png

[08:02 - 08:18] удобнее для запросов создать точнее создать специальные классы а здесь я их назвал теперь он сорекс теперь он с аяксом


[08:18 - 08:36] соответственно 1 класс а предполагается использовать для успешных 2 класс для сообщения об ошибках а класс наследуется 1 класс а наследуются стандартного 2


[08:36 - 08:54] теперь стал саят your наследуется от 1 мы видим что в этих классах переопределены только конструктора то есть по сути дела это другой способ создания того же самого объекта теперь давайте рассмотрим 1 конструктор мы видим что


[08:54 - 09:13] используются 2 аргумента 1 это необязательный аргумент статус умолчанию статус ok то есть вы можете указать произвольный статус но по умолчанию это успешно ответ поэтому статус ok и


[09:13 - 09:30] это произвольный набор аргументов то есть словарь а с аргументами которой вы хотите вернуть javascript что дальше происходит мы добавляем статус в этот словарь


[09:30 - 09:47] это как бы а вот эта строчка она гарантирует у нас что все коллекции спонсоров а поля статуса он будет называться именно вот так что вас не будет разных вариантов а разных форматов


[09:47 - 10:03] ответа а это очень важно когда в команде работают множество программистов чтобы не происходило такого а и далее мы взываем собственно говоря родительский конструктор конструктор мы передаем уже стандарт аргументы


[10:03 - 10:19] content это от тела а тело ответа и content type content type нас аппликейшен джи сон как исследуют а для а ответов содержащую 600


[10:19 - 10:37] а вот содержимое а смотрите что мы делаем мы вызываем функцию джисон точка да эта функция стандартного модуля для сериализации десериализации jesaul на вход этой функции мы передаем наш словарь с данными


[10:37 - 10:54] а на выходе будет уже строчка содержащая а в случае с 2 классом нас конструктор передается 2 метода кот и мягче


[10:54 - 11:09] то есть мы говорили что в сообщениях об ошибках у нас должно быть 2 поля обязательны статус должен быть а поле статус должно всегда совпадать содержать слова террор


[11:09 - 11:25] а кот содержатся а в полякова содержатся номер либо номер либо описание ошибки для javascript


[11:25 - 11:41] программисты и в поле мясо для пользователя а все взрывается родительский конструктор а отсюда вызывается еще родительский конструктор вызывается нас получается что теперь с пол содержащей а джисон и правильной


[11:41 - 12:00] content type а как использовать данные классы во вьюшке давайте посмотрим например допустим у нас есть то которое добавляет комментарий делает запросы то есть обрабатывает запрос


Step 3 (S-44895) 4.png

[12:00 - 12:15] а в принципе в йошку похожа на стандартное а в u которые мы рассматривали создается экземпляр формы данные получаются из request post


[12:15 - 12:31] то есть в этом нет никакого отличие от обычных запросов форма проверяется на корректность если форма корректна происходит сохранение проверить корректность сохранили получил новый комментарий


[12:31 - 12:50] а теперь нам нужно вернуть айдишник комментария в javascript мы создаем и возвращаю новой теперь спонсор а вот эти аргументы которые мы передали в конструктор


[12:50 - 13:05] реализована и пойдут в jesaul в результате если форма невалидно мы возвращаем теперь спонсор роф указываем код ошибки неправильные параметры


[13:05 - 13:25] и сообщение об ошибке в общем то использования максимально простое вас они как раз были сделаны для того чтобы упростить конструировании создания таких ответов и а гарантироваться однообразие а формат среди всех видов


[13:25 - 13:44] а что здесь на этом примере можно еще отметить здесь мы замечаем 2 вещи во 1 не совсем корректно отображаются ошибки формы то есть мы все ошибки которые возникли в форме мы с помощью вот этого вызова for точка и рост с текст


Step 3 (S-44895) 5.png

[13:44 - 13:59] сливаем в 1 строчку на самом деле это не очень хорошая практика том что если форма большая нам нужно конкретно знать в каких полях были ошибки а


[13:59 - 14:15] встроенный в django for есть другие методы не s текст s джисон либо сон либо с дата


[14:15 - 14:33] а 1 метод возвращает данные формы в виде что не совсем удобно для нас потому что мы сами стерилизуем часов а 2 метод с дата а возвращает виде плоской структуры а


[14:33 - 14:51] на самом деле можно немножко усовершенствовать наше кода ответа чтобы они принимали те данные от которой вернул формы но не критично то есть а при возврате ошибок из формы


[14:51 - 15:08] а в чем суть при возврате ошибок из формы важно сохранить максимальную детализацию здесь мы этого не сделали поскольку это такой пример демонстрационный но в рабочих проектах это крайне желательно чтобы на стороне javascript могли знать


[15:08 - 15:23] какое то конфет на поле привело к ошибке 2 момент который на которые следует обратить внимание это декоратор


[15:23 - 15:42] в обычных в обычных вьюшках мы использовали декоратор логин required чтобы обозначить что для данной вьюшки требуется авторизация то что нужно что то что пользователь был авторизован если пользователь не авторизован декоратор логин require


[15:42 - 15:59] делал редирект то есть возвращал пользователь на страницу авторизации а случись технология такой подход работать не будет потому что на страницу авторизации попадет не пользователь а конкретный


[15:59 - 16:16] аякс запрос пользователь не увидит этой странице а будет просто некогда ошибка пожалуйста в случае с запросами для нас важно передать ошибка об отсутствии авторизации в виде поля в jesaul чтобы


[16:16 - 16:32] front end разработчик мог эту ошибку перехватить и показать форму авторизации а самостоятельно а давайте посмотрим как такой декоратор может быть устроим здесь приведен пример


Step 3 (S-44895) 6.png

[16:32 - 16:48] декоратора логин required алекс а для проверки авторизации вот эта обертка нас не интересует просто это относится к коду декоратора


[16:48 - 17:05] интересующие нас кот находится вот здесь а давайте смотреть по строчкам 1 что мы делаем проверяем что пользователь аутентифицирован он или нет


[17:05 - 17:24] то есть вызываем метод из outlook если пользователь авторизован с ним все хорошо мы просто вызываем а декорируем вьюшку то есть вызывает у функцию которая изначально была


[17:24 - 17:39] а декорирована передаем если необходима документы возвращаем его значение если пользователь не авторизован и нам нужна а сообщить про это клиенту


[17:39 - 17:56] а в таком случае мы смотрим request is с помощью этого метода можно проверить является ли запрос аякс запросов либо обычно как я уже говорил надежного метода проверки нету но


[17:56 - 18:11] если вы используете для запросов всегда только в библиотеку а это библиотека будет передавать специальный заголовок место про которое мы говорили в начале


[18:11 - 18:29] и соответственно с помощью метода request is аякс можно проверить наличие этого заголовка и понять что происходит аякс запрос а в таком случае если пользователь не авторизован а у нас происходит аякс запрос


[18:29 - 18:48] нам необходимо вернуть ошибку поэтому вместо редиректа возвращается а теперь сполз а я егор то есть это 200 ответ а со специальным специальным кодом но


[18:48 - 19:04] а соответственно javascript программист должен перехватить этот код и показать форму авторизации в случае если у нас не аякс запрос то мы поступаем стандартным образом


[19:04 - 19:19] то есть отправляем браузер на логин ну соответственно сохраняем текущие параметры картине чтобы браузер стал туда вернуться


[19:19 - 19:36] таким образом у нас получился универсальный декоратор который может требовать авторизацию и для аякс запросов и для обычных запросов а тут следует отметить что


[19:36 - 19:54] этот декоратор он довольно сильно завязан на конкретное приложение то есть его придется писать в каждом приложении свое ну почему потому что во 1 мы указали явно то есть мы должны знать уровень страница логина а во 2 мы используем


[19:54 - 20:12] а что теперь распознал солях сферу это класс который мы недавно создали самостоятельно он естественно тоже специфичен для нашего приложение поэтому вот такое декоратор еще бы и нет в стандартном комплекте джанго