Step 6 (S-44783)

From Stepik Wiki
Jump to: navigation, search

Step on Stepik: https://stepik.org/lesson/14827/step/6

Step 6 (S-44783) 1.png

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


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


[00:32 - 00:50] собственно в этом файле находится записи по которым django ориентироваться а что происходит при обработке запроса django начинает поиск файлов список которых указан


Step 6 (S-44783) 1.png

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


[01:08 - 01:23] использовать именно переменную имя фиксированная проходит по всем паттернам а которое перечислено в этой переменной эта переменная то фактически список


[01:23 - 01:40] в ней содержатся специальные объекты джанго в перебирает до 1 совпадения если совпадение найдена а джанго передает управление контроллером вьюшке а связанное с данным если совпадений не найдено


[01:40 - 01:56] возвращается код ошибки 404 то есть страница не найдена а давайте посмотрим на синтаксис а ты что находится внутри а ну синтаксис понятно что это язык python


Step 6 (S-44783) 2.png

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


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


[02:30 - 02:48] 1 аргумент трахаются регулярные выражения мы видим вот регулярные выражения а то есть маршрутизатор django работает на основе регулярных выражений угол а постоянно сравниваются с последовательность регулярок


[02:48 - 03:03] 2 аргументом могут передаваться разные вещи 2 аргументом может передаваться имя функции а в данном случае эта функция home из файла в new speed приложение блок


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


[03:21 - 03:38] образуя таким образом дерево а давайте посмотрим ну вот это вот это корневой файловой распи можете сдаться на уровне проекта давайте посмотрим как устроена маршрутизация а внутри 1 приложения


[03:38 - 03:53] а вот это вот файлы распи которые находятся внутри приложения блог а мы видим что здесь есть некоторые отличия ну во 1 вместо простого списка вызвана функция


[03:53 - 04:09] на самом деле это очень небольшая обертка которое необходимо которые занимались тем что добавляет вот указанные префиксы инициатором с придаются некоторые префикс префикс добавляет ко всем именам функций


[04:09 - 04:29] обращать внимание не следует мы по прежнему считаю что некоторые список но в итоге то есть список а в этом списке есть 3 маршрута они все 3 а сформировано несколько по разному


[04:29 - 04:48] а 1 маршрут сформирован с использованием конкретной функции то есть мы видим что у нас импортировано функция post list именно функции как объект и а именно сама функция указана


[04:48 - 05:03] маршруте это наиболее рекомендуемое поведение то есть при возможности указать явно функция нужно поступать так а почему это желательное поведение а


[05:03 - 05:22] дело в том что если вы указываете функцию по имени как например в последних 2 примерах идет указание функции по имени а эта функция будет загружена только при необходимости то есть при 1 запросе


[05:22 - 05:39] точнее не функция file you speak вот этот файл будет загружен при 1 запросе к данной функции а в тот момент если в этом файле была ошибка естественно сервер ответят хттп ошибкой 500$


[05:39 - 05:54] но это произойдет уже в момент запроса клиента и клиент увидит эту ошибку если вы загружаете функции не по имени а импортируя их явно из а модуле views


[05:54 - 06:09] то есть импортировать эти функции и в модуле views есть ошибка то это ошибка обнаружиться уже при запуске сервера скорее всего когда администратор рядом и что то сможет сделать а то есть использование


[06:09 - 06:26] объектов избавляет от ошибок а в остальном здесь нет ничего нового а вот еще важный момент который следует отметить а


[06:26 - 06:41] это использование имен мы видим что в последних а у всех а всех маршрутов в данном файле есть имена а


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


Step 6 (S-44783) 4.png

[06:57 - 07:12] маршрута внутрь функции нужно передать регулярные выражения для сопоставления с сходящим урлов и а ссылку на функцию вьюшку которая будет выполняться


[07:12 - 07:27] либо саму функцию либо ее имя также можно задать параметр name имя функции паттерн с это тонкая обертка добавляет префикс не рассматриваем ее и функции include позволяет включать


[07:27 - 07:47] 1 урл внутрь 1 файл спи внутр другого а причем они образуют дерево то есть это не просто вставка получается не плоский список маршрутов а дерево а в чем особенность э какие особенности нужно помнить а при работе с маршрутизатором


Step 6 (S-44783) 5.png

[07:47 - 08:04] номер 1 слэш в начале регулярок не указываются то есть все урлы веб они начинаются с лучше логично думать что в начале урока в начале регулярке также должен быть сплошной то не так


[08:04 - 08:21] а django выбираю 1 слэш это сделал но в основном из за взаимодействия с функцией good поэтому в регулярках где мы указываем 1 случайно нет вот смотрите самый самый корневой файл


Step 6 (S-44783) 6.png

[08:21 - 08:36] 1 регулярка которая соответствует главной странице то есть пустой угол крышка и потом доллар это пустой а соответствует главной странице здесь нет потому что слэш django убирает


Step 6 (S-44783) 7.png

[08:36 - 08:51] а можно указывать какие то так и саму это понятно а используется для описания маршрутов используются регулярные выражения а да такой факт


[08:51 - 09:07] в некоторых свободных мест регулярных выражений используется специальный синтаксис а вы не можете писать честно регулярное выражение ну может написать нечто что потом в них преобразовывается а маршрутов можно указывать имена


[09:07 - 09:23] то есть создавать а создавать именованные роуты это тоже правильно и а маршрута можно разносить по разным приложение то есть у вас в принципе есть возможность все все ваши маршруты поместить в корневой файловой раз p


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


Step 6 (S-44783) 8.png

[09:42 - 09:58] а скажем когда у вас нет included и просто есть полный список посмотрим корневой файл спи а представим что у нас есть


[09:58 - 10:16] слэш admin что то там такой урок пришел ну у нас плоский список то есть вместо include место include здесь просто 20 урлов из а приложение блок


[10:16 - 10:31] перечислено здесь 20 строчек а django просто последовательно перебирает и с на применяют 1 регулярку потом 2 3 20 раз 20 раз применяют регулярке поскольку у нас


[10:31 - 10:50] маршрут слэш admin он не подходит под эти регулярки приложение блок и прежде чем он дойдет до нужной нам строчки да вот этой будет выполнена 20 регулярных выражений это естественно медленно сопоставления с кем нибудь не очень быстро опираться на сайте


[10:50 - 11:08] что происходит когда мы используем функцию include а выполняется 1 выражение регулярное выражение выполняется 2 здесь пример не очень хорошим здесь потому что а в регулярке написано


[11:08 - 11:25] а крышка то есть фактически а произойдет совпадения и а мы перейдем внутрь файла если здесь было бы написано блок вот так то это бы выражение не совпало и мы перешли бы как нибудь


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


[11:42 - 11:58] а классическая сравнения почему поиск по дереву быстрее чем а последовательный перевод а вполне понятно поэтому следует разносить маршруты по разным файлам и организовывать их в 1 дерево и


Step 6 (S-44783) 9.png

[11:58 - 12:15] в конце best practice либо как хотите это называйте крайне важное правило которое часто натыкаюсь новички а нужно делать как можно более


[12:15 - 12:32] точно разделе 1 действие в приложении это 1 road 1 контроллер а новички часто сваливают всю логику 1 контроллер у них получается 1 очень большая функции соответственно для нее делается 1 road


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


[12:51 - 13:09] а теперь такой момент как риверз роутер а мы говорили что в маршрутке можно указывать имя зачем это нужно а это нужно для такой вещи как придешь роутинг


Step 6 (S-44783) 10.png

[13:09 - 13:24] а смотрите при выполнении локи в приложении вам часто нужно бывает сформировать какое то например вы генерируете страницу со списком статей


[13:24 - 13:43] и вам нужно для каждой статьи сделать гиперссылку на страницу отдельной статье какие есть варианты вы можете просто захардкодить то есть прописать в шаблоне либо в питоновском коде это в принципе нормальный вариант но у него есть недостатки


[13:43 - 13:58] а если у вас поменяется схема урлов то есть если вы решите перенести страниц в другой угол вам придется исправлять ваш ход а 2 недостаток


[13:58 - 14:16] а для джанги более критичной невозможно сделать переносимым приложение если у вас приложение захардкожено урлы а дело в том что когда приложение добавляются в проект джанго приложение оно не знает в какой по какому урлу оно будет работать


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


[14:32 - 14:51] bout а приложение а если оно получено через open source она не знает об этом поэтому оно должно строить а урлы на себя каким то образом независимо от префикса для этого используется


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


Step 6 (S-44783) 11.png

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


Step 6 (S-44783) 12.png

[15:24 - 15:43] а в некоторых случаях 1 имени недостаточно например мы хотим получить а маршрут конкретной конкретной статье маршрута есть имя post details и еще нужен аргумент


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


[16:02 - 16:20] соответственно blog post 7 получаем полный а в шаблоне для этого используется специальный так но смысл тот же самый указывается


[16:20 - 16:36] и на маршрута и все необходимое для перемены таким образом мы в нашем приложении сможем отвязаться от конкретных урлов и у нас появится возможность а поменять урлы в приложении и а


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


[16:52 - 17:08] это довольно простой компания а вот работал может определить функцию вью может ее выслать а про работу с юбками мы поговорим на следующем уроке