From a25051972ceeb481e79324b35aa686ad8dcb3654 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Thu, 4 Jun 2026 09:26:56 +0300 Subject: [PATCH] Auto | arch-x1: 2026-06-04 09:26:56 --- .obsidian/workspace.json | 22 +++++++++++------- ...одготовка к экзамену по веб-разработке.pdf | Bin 0 -> 160997 bytes .../Archive}/00_базовые_понятия.pdf | Bin ...Подготовка к экзамену по Веб-Разработке.md | 0 99 System/INDEX.md | 13 ++++++++--- 5 files changed, 23 insertions(+), 12 deletions(-) create mode 100644 90 Library/Programming/Web/Подготовка к экзамену по веб-разработке.pdf rename {00 Inbox => 99 System/Archive}/00_базовые_понятия.pdf (100%) rename {00 Inbox => 99 System/Archive}/Подготовка к экзамену по Веб-Разработке.md (100%) diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index 7de3258..634f747 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -11,12 +11,15 @@ "id": "b338ee701498f876", "type": "leaf", "state": { - "type": "pdf", + "type": "markdown", "state": { - "file": "00 Inbox/00_базовые_понятия.pdf" + "file": "99 System/Archive/Основные команды git.md", + "mode": "preview", + "source": false, + "backlinks": false }, - "icon": "lucide-file-text", - "title": "00_базовые_понятия" + "icon": "lucide-file", + "title": "Основные команды git" } }, { @@ -156,7 +159,7 @@ "profileSourceId": "7004edff-76db-412f-95d3-5fd8e180d055", "serial": { "columns": 48, - "data": "\u001b[48;5;22m \u001b[2m430 \u001b[32;22m+\u001b[38;2;205;214;244m \u001b[27X\r\n\u001b[39m \u001b[2m431 \u001b[32;22m+\u001b[39X\r\n\u001b[39m \u001b[2m432 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250msection\u001b[38;2;205;214;244m class=\"block\" id=\"\u001b[38;2;137;180;250mblock-4\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[1X\r\n\u001b[39m \u001b[2m433 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh2\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mБлок 4. CSS selectors и базовые\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m свойства\u001b[25X\r\n\u001b[39m \u001b[2m434 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"cards\"\u001b[38;2;147;153;178m>\u001b[16X\r\n\u001b[39m \u001b[2m435 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-css-u\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mniversal\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mУниверсальный селектор\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`\u001b[38;2;137;180;250m*\u001b[38;2;205;214;244m` выбирает все элементы. Часто п\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mрименяют для сброса `\u001b[38;2;137;180;250mbox-sizing\u001b[38;2;205;214;244m`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m но сп\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mецифичность у него нулевая.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-css-selectors\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mПодробно: CSS selectors\u001b[38;2;205;214;244m\u001b[2X\r\n\u001b[39m \u001b[2m436 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-css-b\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22masic-selectors\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mЭлемент\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m класс\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m иде\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mнтификатор\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m` выбирает теги\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `\u001b[38;2;147;153;178m.\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mcard\u001b[38;2;205;214;244m` — класс\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175mmain\u001b[38;2;205;214;244m` — уникальный id.\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m ID специфичнее класса и тега.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m cl\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mass=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-css-selector\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22ms\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: CSS selectors\u001b[38;2;205;214;244m\u001b[38X\r\n\u001b[39m \u001b[2m437 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-css-c\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mombinators\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mДочерний\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m потомок\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m сест\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mринский\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`A B` — потомок\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `A \u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m B`\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m — прямой ребёнок\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `A \u001b[38;2;147;153;178m+\u001b[38;2;205;214;244m B` — следующий\u001b[1X\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mсосед\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `A \u001b[38;2;147;153;178m~\u001b[38;2;205;214;244m B` — последующие соседи.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-css-se\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mlectors\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: CSS selectors\u001b[38;2;205;214;244m\u001b[32X\r\n\u001b[39m \u001b[2m438 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-css-a\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mttr\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mСелектор атрибута\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`\u001b[38;2;147;153;178m[\u001b[38;2;249;226;175matt\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mr\u001b[38;2;147;153;178m]\u001b[38;2;205;214;244m`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `\u001b[38;2;147;153;178m[\u001b[38;2;249;226;175mtype\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"email\"\u001b[38;2;147;153;178m]\u001b[38;2;205;214;244m`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `\u001b[38;2;137;180;250ma\u001b[38;2;147;153;178m[\u001b[38;2;249;226;175mhref\u001b[38;2;148;226;213m^=\u001b[38;2;166;227;161m\"https\"\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m]\u001b[38;2;205;214;244m` выбирают элементы по наличию или зна\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mчению атрибута.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-lin\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mk\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-css-selectors\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: CS\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mS selectors\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m439 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-css-p\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mseudo\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПсевдоклассы\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`\u001b[38;2;147;153;178m:\u001b[38;2;205;214;244mhover`\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m,\u001b[38;2;205;214;244m `\u001b[38;2;147;153;178m:\u001b[38;2;205;214;244mfocus`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `\u001b[38;2;147;153;178m:\u001b[38;2;205;214;244mchecked`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `\u001b[38;2;147;153;178m:\u001b[38;2;205;214;244mnth-child\u001b[38;2;147;153;178m()\u001b[38;2;205;214;244m`\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mвыбирают состояние или позицию элемента\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m. Структурные псевдоклассы зависят от м\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mеста в DOM.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" h\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mref=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-css-selectors\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: CSS se\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mlectors\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m440 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-css-g\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mroup\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mГруппировка селекторов\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m>\u001b[38;2;205;214;244mСелекторы через запятую получают одно\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mправило: `\u001b[38;2;137;180;250mh1\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mh2\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mh3\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m{\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mmargin\u001b[38;2;148;226;213m:\u001b[38;2;205;214;244m \u001b[38;2;250;179;135m0\u001b[38;2;147;153;178m;\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m}\u001b[38;2;205;214;244m`.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-css-s\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22melectors\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: CSS selectors\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m441 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-css-c\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mascade\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНаследование и каскадирован\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mие\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mКаскад решает конфликт правил\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m по важности\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m специфичности и порядку.\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mНаследуются в основном текстовые свойст\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mва\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m например `color` и `\u001b[38;2;137;180;250mfont-family\u001b[38;2;205;214;244m`.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-css-s\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22melectors\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: CSS selectors\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m442 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-css-s\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mpecificity\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mСпецифичность\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mУс\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mловный вес: inline > ID > классы/\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mатрибуты/псевдоклассы > теги/псевдоэ\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mлементы. При равенстве побеждает правил\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mо ниже в коде.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-link\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-css-selectors\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: CSS\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m selectors\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m443 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-box-m\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22model\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mБлочная модель\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mБлок со\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mстоит из \u001b[38;2;137;180;250mcontent\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m padding\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m border и mar\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mgin. `\u001b[38;2;137;180;250mbox-sizing\u001b[38;2;205;214;244m: \u001b[38;2;137;180;250mborder-box\u001b[38;2;205;214;244m` включает\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mpadding и border в заданную ширину.\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-css-pro\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mps\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: CSS свойства\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m444 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-backg\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mround\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mФон элемента\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mОсновные\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m свойства: `\u001b[38;2;137;180;250mbackground-color\u001b[38;2;205;214;244m`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `\u001b[38;2;137;180;250mbackgro\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mund-image\u001b[38;2;205;214;244m`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `\u001b[38;2;137;180;250mbackground-repeat\u001b[38;2;205;214;244m`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `\u001b[38;2;137;180;250mbackg\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mround-position\u001b[38;2;205;214;244m`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `\u001b[38;2;137;180;250mbackground-size\u001b[38;2;205;214;244m`.\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-css-pro\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mps\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: CSS свойства\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m445 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-margi\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mn-align\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mMargin и выравнивание блок\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mов\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`margin` задаёт внешний отсту\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mп. Для центрирования блочного элемента\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mс заданной шириной часто используют `\u001b[38;2;137;180;250mma\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mrgin-left\u001b[38;2;205;214;244m/right: auto`.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mde\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mtail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-css-props\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m: CSS свойства\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m446 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-fonts\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mШрифты\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`\u001b[38;2;137;180;250mfont-family\u001b[38;2;205;214;244m`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `\u001b[38;2;137;180;250mfon\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mt-size\u001b[38;2;205;214;244m`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `\u001b[38;2;137;180;250mfont-weight\u001b[38;2;205;214;244m`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `\u001b[38;2;137;180;250mfont-style\u001b[38;2;205;214;244m` за\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mдают семейство\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m размер\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m толщину и накло\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mн текста.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" hre\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mf=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-css-props\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: CSS свойства\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m447 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-text-\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22malign\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВыравнивание и подчёркивание\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m текста\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`\u001b[38;2;137;180;250mtext-align\u001b[38;2;205;214;244m` управляет г\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mоризонтальным выравниванием текста\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `\u001b[38;2;137;180;250mte\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mxt-decoration\u001b[38;2;205;214;244m` — подчёркиванием и други\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mми линиями.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" h\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mref=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-css-props\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: CSS свойст\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mва\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m448 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-line-\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mletter\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;137;180;250mline-height\u001b[38;2;205;214;244m и \u001b[38;2;137;180;250mletter-spacin\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mg\u001b[38;2;205;214;244m\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`\u001b[38;2;137;180;250mline-height\u001b[38;2;205;214;244m` задаёт высоту ст\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mроки\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `\u001b[38;2;137;180;250mletter-spacing\u001b[38;2;205;214;244m` — расстояние меж\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mду буквами. На читаемость влияют сильне\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mе\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m чем кажется.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-lin\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mk\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-css-props\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: CSS св\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mойства\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m449 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-text-\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mshadow\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mТень текста\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`\u001b[38;2;137;180;250mtext-sh\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22madow\u001b[38;2;205;214;244m: x y blur color;` добавляет тень к\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m тексту. В тестах важно помнить порядок\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m смещения\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m размытия и цвета.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m clas\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22ms=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-css-props\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПод\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mробно: CSS свойства\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m450 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m451 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m452 \u001b[32;22m+\r\n\u001b[39m \u001b[2m453 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250msection\u001b[38;2;205;214;244m class=\"block\" id=\"\u001b[38;2;137;180;250mblock-5\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m454 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh2\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mБлок 5. Flexbox Layout. Grid La\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22myout\r\n\u001b[39m \u001b[2m455 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"cards\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m456 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-flex-\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mcontainer\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mFlex-контейнер и оси\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`display: flex` создаёт \u001b[38;2;137;180;250mflex-контей\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mнер\u001b[38;2;205;214;244m. Главная ось задаётся `\u001b[38;2;137;180;250mflex-directi\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mon\u001b[38;2;205;214;244m`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m поперечная идёт перпендикулярно.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-layou\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mt\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: Flex/Grid\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m457 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-inlin\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22me-flex\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mСтрочный \u001b[38;2;137;180;250mflex-контейнер\u001b[38;2;205;214;244m\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`display: \u001b[38;2;137;180;250minline-flex\u001b[38;2;205;214;244m` делает конте\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mйнер \u001b[38;2;137;180;250mflex-контейнером\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m но сам контейнер\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m ведёт себя как строчный элемент во вне\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mшнем потоке.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\"\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-layout\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: Flex/Grid\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m458 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-flex-\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22malign\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВыравнивание по осям\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m`\u001b[38;2;137;180;250mjustify-content\u001b[38;2;205;214;244m` выравнивает по главно\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mй оси\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `\u001b[38;2;137;180;250malign-items\u001b[38;2;205;214;244m` — по поперечной. `\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22malign-content\u001b[38;2;205;214;244m` работает при нескольких\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mстроках.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-layout\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: Flex/Grid\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m459 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-flex-\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mgrow\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;137;180;250mflex-grow\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m shrink\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m basis\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`\u001b[38;2;137;180;250mflex-basis\u001b[38;2;205;214;244m` — базовый размер\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `\u001b[38;2;137;180;250mflex\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22m-grow\u001b[38;2;205;214;244m` — как элемент растёт\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `\u001b[38;2;137;180;250mflex-shri\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mnk\u001b[38;2;205;214;244m` — как сжимается при нехватке места.\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-lay\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mout\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: Flex/Grid\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m460 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-grid-\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mcontainer\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mGrid-контейнер\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`d\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22misplay: grid` создаёт двумерную сетку.\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mКолонки задаются `\u001b[38;2;137;180;250mgrid-template-columns\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m строки — `\u001b[38;2;137;180;250mgrid-template-rows\u001b[38;2;205;214;244m`.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m class=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-layout\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mП\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mодробно: Flex/Grid\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m461 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-fr\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВеличина fr\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`fr` — доля свобо\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mдного пространства \u001b[38;2;137;180;250mgrid-контейнера\u001b[38;2;205;214;244m. `1f\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mr 2fr` делит свободное место в пропорци\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mи 1 к 2.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-layout\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: Flex/Grid\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m462 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-repea\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mt-minmax\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mrepeat и minmax\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`r\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mepeat(3\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m 1fr)` повторяет трек. `minmax(\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m200px\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m 1fr)` задаёт минимум и максимум\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mразмера трека.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-link\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-layout\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: Flex/Grid<\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m/\u001b[38;2;137;180;250ma\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m463 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m464 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m465 \u001b[32;22m+\r\n\u001b[39m \u001b[2m466 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250msection\u001b[38;2;205;214;244m class=\"block\" id=\"\u001b[38;2;137;180;250mblock-djan\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mgo\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m467 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh2\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mБлоки 6-12. Django\r\n\u001b[39m \u001b[2m468 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"cards\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m469 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-djang\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mo-models\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mСоздание моделей\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mМ\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mодель — класс-наследник `models\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mModel\u001b[38;2;205;214;244m`;\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m поля класса описывают столбцы таблицы.\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m Модели обычно лежат в `models\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mpy\u001b[38;2;205;214;244m` прил\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mожения.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django-models\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: Django mod\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mels\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m470 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-prima\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mry-key\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПервичный ключ\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПерви\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mчный ключ уникально идентифицирует запи\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mсь. Если не задать явно\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m Django создаёт\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m поле `id` автоматически.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django-models\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПо\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mдробно: Django models\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m471 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-migra\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mtions\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mМиграции\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`makemigrati\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mons` создаёт файлы миграций из изменени\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mй моделей\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `migrate` применяет их к баз\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mе данных.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" hre\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mf=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django-models\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: Django m\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22models\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m472 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-meta\u001b[38;2;205;214;244m\"\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mClass Meta\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`class Meta` зад\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mаёт метаданные модели: `ordering`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `ver\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mbose_name`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `db_table`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m ограничения и д\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mругие настройки.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-li\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mnk\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django-models\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: D\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mjango models\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m473 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-null-\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mblank\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mnull=True и blank=True\u001b[38;2;205;214;244m<\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`null=True` разрешает `NULL` в БД. `b\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mlank=True` разрешает пустое значение на\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m уровне форм/валидации Django.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m cl\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mass=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django-model\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22ms\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: Django models\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m474 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-charf\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mield\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mCharField\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`CharField`\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mхранит короткую строку и требует `max_l\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mength`. Для длинного текста обычно беру\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mт `TextField`.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-link\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django-models\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: Dja\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mngo models\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m475 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-forei\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mgnkey\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mForeignKey\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`ForeignKe\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22my` задаёт связь многие-к-одному. `on_de\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mlete` определяет поведение при удалении\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m связанного объекта; `related_name` зад\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mаёт имя обратной связи.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mde\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mtail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django-models\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодр\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mобно: Django models\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m476 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-manyt\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22momany\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mMany-\u001b[38;2;137;180;250mto-\u001b[38;2;205;214;244mMany\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`ManyToM\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22manyField` задаёт связь многие-ко-многим\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m. Django создаёт промежуточную таблицу\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mавтоматически\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m либо можно указать свою\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mчерез `through`.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-li\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mnk\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django-models\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: D\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mjango models\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m477 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-fbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mFBV\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mFunction-Based View — фу\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mнкция\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m которая принимает `request` и во\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mзвращает `HttpResponse`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `render`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `red\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mirect` или ошибку.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mlink\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django-fbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: Dj\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mango FBV\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m478 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-rende\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mr\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mrender\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`render(request\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mt\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22memplate\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m context)` рендерит шаблон с ко\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mнтекстом и возвращает `HttpResponse`.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-djang\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mo-fbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: Django FBV\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m479 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-conte\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mxt\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПередача данных в шаблон\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m>\u001b[38;2;205;214;244mДанные передаются словарём context: кл\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mючи становятся именами переменных в шаб\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mлоне.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22md-django-fbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: Django FBV\u001b[38;2;205;214;244m<\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m/\u001b[38;2;137;180;250marticle\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m480 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-get-o\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mbject\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mОбъект или 404\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`get_o\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mbject_or_404(Model\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m pk=pk)` возвращает\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mобъект или генерирует HTTP 404\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m если за\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mписи нет.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" hre\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mf=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django-fbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: Django FBV<\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m/\u001b[38;2;137;180;250ma\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m481 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-routi\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mng-fbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mМаршрутизация FBV\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m`urlpatterns` функция передаётся напрям\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mую: `\u001b[38;2;137;180;250mpath\u001b[38;2;205;214;244m(\"posts/<int\u001b[38;2;147;153;178m:\u001b[38;2;205;214;244mpk>/\", view\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22ms\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mdetail\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m name=\"detail\")`.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django-fbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодр\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mобно: Django FBV\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m482 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-cbv-t\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mypes\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mTemplateView\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m DetailView\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m Lis\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mtView\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`TemplateView` показывает\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mшаблон\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `DetailView` — один объект\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `Li\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mstView` — список объектов.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django-cbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодр\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mобно: Django CBV\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m483 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-cbv-m\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22models\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mCBV и модели\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mДля `Lis\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mtView`/`DetailView` можно указать `mode\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22ml = Post`; Django сам построит queryset\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m и стандартные имена шаблонов.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m cl\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mass=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django-cbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mПодробно: Django CBV\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m484 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-cbv-e\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mxtra\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mДополнительные данные\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mДополнительный контекст обычно добавляю\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mт через `get_context_data`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m вызывая `su\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mper()` и дополняя словарь.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django-cbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодр\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mобно: Django CBV\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m485 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-cbv-d\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mefault-vars\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПеременные по умолчани\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mю\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`ListView` отдаёт `object_list\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m` и `modelname_list`; `DetailView` отда\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mёт `\u001b[38;2;137;180;250mobject\u001b[38;2;205;214;244m` и `modelname`.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django-cbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодр\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mобно: Django CBV\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m486 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-cbv-q\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mueryset\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПереопределение выгрузки\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`get_queryset()` меняет список об\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mъектов, `get_object()` — получение одно\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mго объекта. Часто используют фильтрацию\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m по пользователю или статусу.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m cla\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mss=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django-cbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mП\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mодробно: Django CBV\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m487 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-pagin\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mation\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПаджинация\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ `ListVie\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mw` достаточно задать `paginate_by = N`;\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m в шаблоне появится `page_obj`.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m c\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mlass=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django-cbv\u001b[38;2;205;214;244m\"\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m>\u001b[38;2;205;214;244mПодробно: Django CBV\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m488 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-cbv-t\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22memplates\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mШаблоны по умолчанию\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mДля `DetailView`: `app/model_detail\u001b[38;2;147;153;178m.\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mhtml\u001b[38;2;205;214;244m`; для `ListView`: `app/model_list\u001b[38;2;147;153;178m.\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mhtml\u001b[38;2;205;214;244m`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m если не задан `template_name`.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-djang\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mo-cbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: Django CBV\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m489 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-cbv-s\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22muper\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВызов базовой логики\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mП\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mри переопределении методов вроде `get_c\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22montext_data` обычно сначала вызывают `s\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22muper()`, чтобы не потерять стандартный\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mконтекст.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" hre\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mf=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django-cbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: Django CBV<\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m/\u001b[38;2;137;180;250ma\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m490 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-cbv-r\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mouting\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mМаршрутизация CBV\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mКл\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mасс подключается через `\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mas_view\u001b[38;2;205;214;244m()`: `\u001b[38;2;137;180;250mp\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22math\u001b[38;2;205;214;244m(\"\"\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m PostListView\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mas_view\u001b[38;2;205;214;244m(), name=\"p\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22most_list\")`.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\"\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django-cbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: Django C\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mBV\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m491 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-djang\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mo-urls\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango URLs\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`\u001b[38;2;137;180;250mpath\u001b[38;2;205;214;244m()`\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m задаёт маршрут, view\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m kwargs и имя. `r\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22me_path()` использует regex. `reverse()`\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m строит URL по имени маршрута.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m cl\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mass=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django-urls\u001b[38;2;205;214;244m\"\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m>\u001b[38;2;205;214;244mПодробно: Django URLs\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m492 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-djang\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mo-templates\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mЯзык шаблонов Django\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПеременные пишутся как `\u001b[38;2;147;153;178m{\u001b[38;2;205;214;244m{ value\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m}\u001b[38;2;205;214;244m}`, теги как `\u001b[38;2;147;153;178m{\u001b[38;2;205;214;244m% for %\u001b[38;2;147;153;178m}\u001b[38;2;205;214;244m`, фильтры как\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m`\u001b[38;2;147;153;178m{\u001b[38;2;205;214;244m{ name|lower \u001b[38;2;147;153;178m}\u001b[38;2;205;214;244m}`. Наследование делает\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mся через `extends` и `block`.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m cla\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mss=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django-templa\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mtes\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: Django templates\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m493 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-djang\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mo-queries\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango queries\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mQu\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22merySet ленивый и цепочечный. Важно знат\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mь `get`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `\u001b[38;2;137;180;250mfilter\u001b[38;2;205;214;244m`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `exclude`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `order_by\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `annotate`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `aggregate`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `Q`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `F`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mselect_related`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `prefetch_related`.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22m-queries\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: Django queries\u001b[38;2;205;214;244m<\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m/\u001b[38;2;137;180;250marticle\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m494 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-djang\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mo-forms\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango forms\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`forms\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m.\u001b[38;2;249;226;175mForm\u001b[38;2;205;214;244m` — ручная форма\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `ModelForm` стро\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mится по модели. Валидация через `is_val\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mid`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `cleaned_data`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `clean_field`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `cl\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mean`.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22md-django-forms\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: Django forms<\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m/\u001b[38;2;137;180;250ma\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m495 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m496 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m497 \u001b[32;22m+\r\n\u001b[39m \u001b[2m498 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250msection\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetails\u001b[38;2;205;214;244m\" id=\"\u001b[38;2;137;180;250mdetails\u001b[38;2;205;214;244m\"\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m>\r\n\u001b[39m \u001b[2m499 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh2\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробные заметки\r\n\u001b[39m \u001b[2m500 \u001b[32;22m+\r\n\u001b[39m \u001b[2m501 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-ip\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m502 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mIP-адресация\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m IPv4\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m IPv6\r\n\u001b[39m \u001b[2m503 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../../Networking/Протоколы/IP-адр\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mес\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mIP-адрес,\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"../../Net\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mworking/Протоколы/IPv6\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mIPv6\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m504 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ интернете используются адрес\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mа разных уровней: физический адрес инте\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mрфейса\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m сетевой IP-адрес и символьное D\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mNS-имя. IPv4 записывается четырьмя окте\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mтами\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m например `192.168.1.10`. IPv6 исп\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mользует 128 бит и записывается группами\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m шестнадцатеричных чисел.\r\n\u001b[39m \u001b[2m505 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте часто с\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mпрашивают: IPv4 = 32 бита\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m IPv6 = 128 б\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mит\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m IPv4 октет = 0-255\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m IPv6 не совмест\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mим напрямую с IPv4.\r\n\u001b[39m \u001b[2m506 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-ip-ad\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mdressing\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткой теме\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m507 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m508 \u001b[32;22m+\r\n\u001b[39m \u001b[2m509 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-tcp\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m510 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mTCP\r\n\u001b[39m \u001b[2m511 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../../Networking/Протоколы/TCP vs\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m UDP\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mTCP vs UDP\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m512 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mTCP устанавливает соединение п\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mеред передачей данных\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m делит данные на\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mсегменты\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m нумерует их\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m подтверждает дос\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mтавку и повторяет потерянные данные. За\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m это платит дополнительными задержками\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mи служебным трафиком.\r\n\u001b[39m \u001b[2m513 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: TCP —\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mнадёжный\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mconnection-oriented\u001b[38;2;205;214;244m; UDP — бы\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mстрее и проще\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m но без гарантий доставки\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m и порядка.\r\n\u001b[39m \u001b[2m514 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-tcp\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mНазад к краткой теме\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m515 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m516 \u001b[32;22m+\r\n\u001b[39m \u001b[2m517 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-subnet\u001b[38;2;205;214;244m\"\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m>\r\n\u001b[39m \u001b[2m518 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодсети и маска подсети\r\n\u001b[39m \u001b[2m519 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../../Networking/Подсети и маска\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mподсети\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодсети и маска подсети\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\r\n\u001b[39m \u001b[2m520 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mМаска подсети определяет\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m каки\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mе биты IPv4-адреса относятся к сети\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m а\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mкакие к хосту. Запись `/24` равна маске\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m `255.255.255.0`: первые 24 бита — сеть\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m,\u001b[38;2;205;214;244m последние 8 — хосты.\r\n\u001b[39m \u001b[2m521 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mЗапомнить: чем\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mбольше префикс `/N`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m тем меньше адресов\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m в подсети.\r\n\u001b[39m \u001b[2m522 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-subne\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mt\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткой теме\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m523 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m524 \u001b[32;22m+\r\n\u001b[39m \u001b[2m525 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-nat\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m526 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mNAT\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m приватные адреса\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m localh\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22most\r\n\u001b[39m \u001b[2m527 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../../Networking/NAT\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mNAT,\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m <\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"../../Networking/Подсети и ма\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mска подсети\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодсети и маска подсети\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m528 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mNAT переводит приватные IPv4-а\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mдреса во внешний публичный адрес. Часты\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mе приватные диапазоны: `10.0.0.0/8`, `1\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m72.16.0.0/12`, `192.168.0.0/16`. Loopba\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mck-диапазон `127.0.0.0/8` не использует\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mся для обмена между узлами сети; `127.0\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m.0.1` и `localhost` указывают на текущу\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mю машину.\r\n\u001b[39m \u001b[2m529 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: NAT эк\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mономит публичные IPv4 и скрывает внутре\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mннюю адресацию\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m но ломает прямую \u001b[38;2;137;180;250mend-to\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22m-end\u001b[38;2;205;214;244m связность.\r\n\u001b[39m \u001b[2m530 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-nat-l\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mocalhost\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткой теме\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m531 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m532 \u001b[32;22m+\r\n\u001b[39m \u001b[2m533 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-dns\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m534 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDNS и DNS-серверы\r\n\u001b[39m \u001b[2m535 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../../Networking/Протоколы/DNS\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDNS\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m536 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDNS — распределённая база данн\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mых\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m которая по доменному имени возвраща\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mет IP-адрес или другие записи. Типичная\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m цепочка: локальный кэш/hosts\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m resolver\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m провайдера\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mroot-серверы\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m TLD-серверы\u001b[38;2;147;153;178m,\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m авторитативные серверы домена.\r\n\u001b[39m \u001b[2m537 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: root н\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mе знает IP конкретного сайта\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m он направ\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mляет к TLD; авторитативный сервер знает\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m записи домена.\r\n\u001b[39m \u001b[2m538 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-dns\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mНазад к краткой теме\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m539 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m540 \u001b[32;22m+\r\n\u001b[39m \u001b[2m541 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-http\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m542 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mHTTP и HTTP-сообщения\r\n\u001b[39m \u001b[2m543 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../../Networking/Протоколы/HTTP\u001b[38;2;147;153;178m,\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mHTTPS и HTTP3\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mHTTP\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m HTTPS и HTTP/3<\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m/\u001b[38;2;137;180;250ma\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m544 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mHTTP — протокол прикладного ур\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mовня. Запрос и ответ состоят из стартов\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mой строки\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m заголовков\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m пустой строки и\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mнеобязательного тела. Методы описывают\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mдействие над ресурсом\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m заголовки переда\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mют метаданные\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m коды ответа показывают р\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mезультат обработки.\r\n\u001b[39m \u001b[2m545 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mtable\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mtr\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mth\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mМетод\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mth\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mСмыс\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mл\u001b[38;2;205;214;244m\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mtr\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mtd\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`GET`\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mtd\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПолучи\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mть ресурс\u001b[38;2;205;214;244m\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mtr\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mtd\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`POST`\u001b[38;2;205;214;244m<\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mtd\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mОтправить данные\u001b[38;2;205;214;244m\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mtr\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mtd\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`P\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mUT`\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mtd\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mСоздать/заменить ресурс\u001b[38;2;205;214;244m\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mtr\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mtd\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`PATCH`\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mtd\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mЧастично\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mизменить ресурс\u001b[38;2;205;214;244m\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mtr\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mtd\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`DELET\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mE`\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mtd\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mУдалить ресурс\u001b[38;2;205;214;244m\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m546 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: `4xx`\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m— проблема на стороне клиента\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `5xx` —\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mпроблема на стороне сервера.\r\n\u001b[39m \u001b[2m547 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-http\u001b[38;2;205;214;244m\"\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m>\u001b[38;2;205;214;244mНазад к HTTP\u001b[38;2;205;214;244m · <\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-http-me\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mssage\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к HTTP-сообщениям\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m548 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m549 \u001b[32;22m+\r\n\u001b[39m \u001b[2m550 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-https\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m551 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mHTTPS\r\n\u001b[39m \u001b[2m552 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../../Networking/Протоколы/HTTP\u001b[38;2;147;153;178m,\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mHTTPS и HTTP3\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mHTTP\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m HTTPS и HTTP/3<\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m/\u001b[38;2;137;180;250ma\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m553 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mHTTPS — это HTTP\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m защищённый T\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mLS. Сертификат связывает домен с ключам\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mи и подтверждает подлинность сервера. T\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mLS обеспечивает шифрование\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m целостность\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m и защиту от подмены трафика.\r\n\u001b[39m \u001b[2m554 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: HTTP п\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mорт `80`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m HTTPS порт `443`; Basic auth\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mбез HTTPS небезопасен.\r\n\u001b[39m \u001b[2m555 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-https\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткой теме\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m556 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m557 \u001b[32;22m+\r\n\u001b[39m \u001b[2m558 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-http3\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m559 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mHTTP/3\r\n\u001b[39m \u001b[2m560 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../../Networking/Протоколы/HTTP\u001b[38;2;147;153;178m,\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mHTTPS и HTTP3\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mHTTP\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m HTTPS и HTTP/3<\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m/\u001b[38;2;137;180;250ma\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m561 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mHTTP/3 переносит HTTP на QUIC\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mповерх UDP. QUIC делает потоки независи\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mмыми: потеря пакета не блокирует все за\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mпросы внутри соединения\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m как это возмож\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mно в HTTP/2 поверх TCP. TLS 1.3 встроен\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m в QUIC.\r\n\u001b[39m \u001b[2m562 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: HTTP/3\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m не меняет методы и коды HTTP\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m меняет т\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mранспорт: UDP/QUIC вместо TCP.\r\n\u001b[39m \u001b[2m563 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-http3\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткой теме\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m564 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m565 \u001b[32;22m+\r\n\u001b[39m \u001b[2m566 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-ports\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m567 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mСетевые порты\r\n\u001b[39m \u001b[2m568 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../../Networking/Сетевые порты\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mСетевые порты\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m569 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПорт уточняет приложение-получ\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mателя внутри хоста. Номер порта находит\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mся в диапазоне `0-65535`. Порты TCP и U\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mDP независимы: `53/tcp` и `53/udp` — ра\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mзные конечные точки.\r\n\u001b[39m \u001b[2m570 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mМинимум к запом\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mинанию: HTTP `80`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m HTTPS `443`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m DNS `53\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m SSH `22`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m SMTP `25`.\r\n\u001b[39m \u001b[2m571 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-ports\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткой теме\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m572 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m573 \u001b[32;22m+\r\n\u001b[39m \u001b[2m574 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-auth\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m575 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mИдентификация\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m аутентификация\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m,\u001b[38;2;205;214;244m авторизация\r\n\u001b[39m \u001b[2m576 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../../Networking/Веб-аутентификац\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mия и авторизация\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВеб-аутентификация\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m и авторизация\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m577 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mИдентификация сообщает системе\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m идентификатор субъекта. Аутентификация\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m проверяет подлинность. Авторизация выд\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mаёт права на действия. В HTTP встречают\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mся схемы Basic\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m Digest и Bearer.\r\n\u001b[39m \u001b[2m578 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте не пута\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mть: логин — идентификация\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m пароль/код —\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m аутентификация, доступ к админке — авт\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mоризация.\r\n\u001b[39m \u001b[2m579 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-auth\u001b[38;2;205;214;244m\"\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m>\u001b[38;2;205;214;244mНазад к краткой теме\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m580 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m581 \u001b[32;22m+\r\n\u001b[39m \u001b[2m582 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-oauth\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m583 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mOAuth 2.0\r\n\u001b[39m \u001b[2m584 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../../Networking/OAuth 2.0\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mOA\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22muth 2.0\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m585 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mOAuth 2.0 позволяет стороннему\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m приложению получить ограниченный досту\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mп к ресурсам пользователя. Вместо парол\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mя приложение получает токен с конкретны\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mми правами и сроком жизни.\r\n\u001b[39m \u001b[2m586 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: OAuth\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m2.0 — авторизация\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m не парольная аутенти\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mфикация. Для входа поверх OAuth обычно\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mнужен OpenID Connect.\r\n\u001b[39m \u001b[2m587 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-oauth\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткой теме\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m588 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m589 \u001b[32;22m+\r\n\u001b[39m \u001b[2m590 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-uri\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m591 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mURI\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m URL\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m URN\r\n\u001b[39m \u001b[2m592 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../../Networking/Протоколы/URI\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m U\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mRL\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m URN\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mURI\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m URL\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m URN\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m593 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mURL показывает\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m где находится\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mресурс и как его получить: схема\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m хост\u001b[38;2;147;153;178m,\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m порт\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m путь\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m параметры\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m фрагмент. URN з\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mадаёт стабильное имя ресурса без места\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mполучения. URI — общее понятие для иден\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mтификаторов ресурсов.\r\n\u001b[39m \u001b[2m594 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mГлавная формула\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m: URL ⊂ URI; URN ⊂ URI; не каждый URI я\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mвляется URL.\r\n\u001b[39m \u001b[2m595 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-uri\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mНазад к краткой теме\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m596 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m597 \u001b[32;22m+\r\n\u001b[39m \u001b[2m598 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-html\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m599 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mHTML\r\n\u001b[39m \u001b[2m600 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"Основы HTML (структура\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m таблицы\u001b[38;2;147;153;178m,\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mформы)\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mОсновы HTML (структура\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m табл\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mицы\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m формы)\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m601 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mHTML описывает структуру докум\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mента. Важно знать базовый каркас\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m роль\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m`\u001b[38;2;137;180;250mhead\u001b[38;2;205;214;244m` и `\u001b[38;2;137;180;250mbody\u001b[38;2;205;214;244m`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m блочные и строчные эле\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mменты\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m семантические теги\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m атрибуты `cl\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mass`/`id`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m ссылки\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m изображения\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m списки\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mи таблицы.\r\n\u001b[39m \u001b[2m602 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: `class\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m` можно повторять\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `id` должен быть уни\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mкальным; таблицы — для табличных данных\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m,\u001b[38;2;205;214;244m не для макета.\r\n\u001b[39m \u001b[2m603 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175mblock-2\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткому блоку HTML\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m604 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m605 \u001b[32;22m+\r\n\u001b[39m \u001b[2m606 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-html-fo\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mrms\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m607 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mHTML Forms\r\n\u001b[39m \u001b[2m608 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"Основы HTML (структура\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m таблицы\u001b[38;2;147;153;178m,\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mформы)\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mОсновы HTML (структура\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m табл\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mицы\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m формы)\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m609 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mФорма отправляет данные на сер\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mвер. `action` задаёт URL\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `method` — сп\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mособ отправки. `\u001b[38;2;137;180;250mlabel\u001b[38;2;205;214;244m` связывается с по\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mлем через `for` и `id`. `name` определя\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mет имя параметра при отправке. `require\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22md` и типы \u001b[38;2;137;180;250minput\u001b[38;2;205;214;244m помогают браузерной вал\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mидации\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m но не заменяют серверную провер\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mку.\r\n\u001b[39m \u001b[2m610 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: у \u001b[38;2;137;180;250mradi\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mo-кнопок\u001b[38;2;205;214;244m одной группы должен быть одина\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mковый `name`; у `\u001b[38;2;137;180;250mbutton\u001b[38;2;205;214;244m` внутри формы л\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mучше явно задавать `type`.\r\n\u001b[39m \u001b[2m611 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175mblock-3\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткому блоку HTML Forms\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\r\n\u001b[39m \u001b[2m612 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m613 \u001b[32;22m+\r\n\u001b[39m \u001b[2m614 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-css-sel\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mectors\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m615 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mCSS selectors\r\n\u001b[39m \u001b[2m616 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"Основы\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m селекторы и блочная модел\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mь\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mCSS: Основы и селекторы\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m617 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mCSS-селектор выбирает элементы\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m,\u001b[38;2;205;214;244m к которым применяются правила. Нужно\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mразличать селекторы тега\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m класса\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m id\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m а\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mтрибута\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m псевдокласса и комбинаторы. Ка\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mскад учитывает важность\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m специфичность\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mи порядок правил.\r\n\u001b[39m \u001b[2m618 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mСпецифичность:\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22minline > ID > класс/атрибут/псевд\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mокласс > тег/псевдоэлемент.\r\n\u001b[39m \u001b[2m619 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175mblock-4\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткому блоку CSS\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m620 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m621 \u001b[32;22m+\r\n\u001b[39m \u001b[2m622 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-css-pro\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mps\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m623 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mCSS базовые свойства\r\n\u001b[39m \u001b[2m624 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"Основы\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m селекторы и блочная модел\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mь\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mCSS: Основы и селекторы\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m625 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mБлочная модель состоит из \u001b[38;2;137;180;250mcont\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22ment\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m padding\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m border и margin. `\u001b[38;2;137;180;250mbox-siz\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22ming\u001b[38;2;205;214;244m` меняет расчёт ширины. Текстовые св\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mойства управляют шрифтами\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m выравнивание\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mм\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m межстрочным расстоянием\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m расстоянием\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m между буквами и декором текста. Фон за\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mдаётся через группу `background-\u001b[38;2;137;180;250m*\u001b[38;2;205;214;244m`.\r\n\u001b[39m \u001b[2m626 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: `width\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m` при `\u001b[38;2;137;180;250mcontent-box\u001b[38;2;205;214;244m` не включает padding\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m/border\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m при `\u001b[38;2;137;180;250mborder-box\u001b[38;2;205;214;244m` включает.\r\n\u001b[39m \u001b[2m627 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175mblock-4\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткому блоку CSS\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m628 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m629 \u001b[32;22m+\r\n\u001b[39m \u001b[2m630 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-layout\u001b[38;2;205;214;244m\"\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m>\r\n\u001b[39m \u001b[2m631 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mFlexbox и Grid\r\n\u001b[39m \u001b[2m632 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"Адаптивность\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m Flexbox и Grid\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mCSS: Адаптивность\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m Flexbox и Grid\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m633 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mFlexbox — одномерная модель ра\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mскладки по главной и поперечной оси. Gr\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mid — двумерная сетка строк и колонок. F\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mlex удобен для распределения элементов\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mв строке или колонке\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m Grid — для общего\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m макета страницы.\r\n\u001b[39m \u001b[2m634 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: `\u001b[38;2;137;180;250mjusti\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mfy-content\u001b[38;2;205;214;244m` работает по главной оси fle\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mx\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `\u001b[38;2;137;180;250malign-items\u001b[38;2;205;214;244m` — по поперечной; `fr`\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m— доля свободного пространства Grid.\r\n\u001b[39m \u001b[2m635 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175mblock-5\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткому блоку Flex/Grid\u001b[38;2;205;214;244m<\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m/\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m636 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m637 \u001b[32;22m+\r\n\u001b[39m \u001b[2m638 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-django-\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mmodels\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m639 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango models\r\n\u001b[39m \u001b[2m640 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../Python/Модели и ORM\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m Модели и ORM\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m641 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mМодели описывают структуру таб\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mлиц и связи между ними. `CharField` тре\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mбует `max_length`; `ForeignKey` задаёт\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m`on_delete`; `ManyToManyField` создаёт\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mпромежуточную таблицу или использует ук\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mазанную через `through`. Миграции перен\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mосят изменения моделей в БД.\r\n\u001b[39m \u001b[2m642 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: `null=\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mTrue` относится к БД\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `blank=True` — к\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mформам/валидации Django.\r\n\u001b[39m \u001b[2m643 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175mblock-d\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mjango\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткому блоку Django\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m644 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m645 \u001b[32;22m+\r\n\u001b[39m \u001b[2m646 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-django-\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mfbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m647 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango FBV\r\n\u001b[39m \u001b[2m648 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../Python/Представления, шаблоны\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mи CBV\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango: Представления\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m шаблон\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mы и CBV\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m649 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mFBV — обычная функция-представ\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mление. Она принимает `request`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m получае\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mт данные\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m вызывает `render` или возвращ\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mает другой `HttpResponse`. Маршрутизиру\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mется через `\u001b[38;2;137;180;250mpath\u001b[38;2;205;214;244m()` прямой передачей фу\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mнкции.\r\n\u001b[39m \u001b[2m650 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: `rende\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mr(request\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mtemplate\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m context)` возвраща\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mет HTTP-ответ; `get_object_or_404` возв\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mращает объект или 404.\r\n\u001b[39m \u001b[2m651 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175mblock-d\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mjango\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткому блоку Django\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m652 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m653 \u001b[32;22m+\r\n\u001b[39m \u001b[2m654 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-django-\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mcbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m655 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango CBV\r\n\u001b[39m \u001b[2m656 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../Python/Представления, шаблоны\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mи CBV\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango: Представления\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m шаблон\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mы и CBV\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m657 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mCBV — классовые представления\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mс готовой логикой. `TemplateView` показ\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mывает шаблон\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `ListView` выводит список\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m,\u001b[38;2;205;214;244m `DetailView` выводит один объект. В U\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mRL подключаются через `\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mas_view\u001b[38;2;205;214;244m()`.\r\n\u001b[39m \u001b[2m658 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: `ListV\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22miew` по умолчанию даёт `object_list`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mDetailView` — `\u001b[38;2;137;180;250mobject\u001b[38;2;205;214;244m`; шаблоны по умол\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mчанию `model_list\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mhtml\u001b[38;2;205;214;244m` и `model_detail\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m.\u001b[38;2;249;226;175mhtml\u001b[38;2;205;214;244m`.\r\n\u001b[39m \u001b[2m659 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175mblock-d\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mjango\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткому блоку Django\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m660 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m661 \u001b[32;22m+\r\n\u001b[39m \u001b[2m662 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-django-\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22murls\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m663 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango URLs\r\n\u001b[39m \u001b[2m664 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../Python/Представления, шаблоны\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mи CBV\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango: Представления\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m шаблон\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mы и CBV\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m665 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`urlpatterns` связывает URL с\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mпредставлениями. `\u001b[38;2;137;180;250mpath\u001b[38;2;205;214;244m()` использует ro\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mute\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m view\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m kwargs и name. Конвертеры вр\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mоде `int`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `slug`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `uuid`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `\u001b[38;2;137;180;250mpath\u001b[38;2;205;214;244m` извле\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mкают параметры. `reverse()` и `\u001b[38;2;147;153;178m{\u001b[38;2;205;214;244m% url %\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m}\u001b[38;2;205;214;244m` строят URL по имени маршрута.\r\n\u001b[39m \u001b[2m666 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: не хар\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mдкодить URL\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m если есть именованный марш\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mрут и `reverse`/`url`.\r\n\u001b[39m \u001b[2m667 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-djang\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mo-urls\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткой теме\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m668 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m669 \u001b[32;22m+\r\n\u001b[39m \u001b[2m670 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-django-\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mtemplates\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m671 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mЯзык шаблонов Django\r\n\u001b[39m \u001b[2m672 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../Python/Представления, шаблоны\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mи CBV\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango: Представления\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m шаблон\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mы и CBV\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m673 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDTL использует переменные `\u001b[38;2;147;153;178m{\u001b[38;2;205;214;244m{\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mvalue \u001b[38;2;147;153;178m}\u001b[38;2;205;214;244m}`, теги `\u001b[38;2;147;153;178m{\u001b[38;2;205;214;244m% tag %\u001b[38;2;147;153;178m}\u001b[38;2;205;214;244m` и фильтры `\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m{\u001b[38;2;205;214;244m{ value|\u001b[38;2;137;180;250mfilter\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m}\u001b[38;2;205;214;244m}`. Наследование строи\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mтся через `\u001b[38;2;147;153;178m{\u001b[38;2;205;214;244m% extends %\u001b[38;2;147;153;178m}\u001b[38;2;205;214;244m` и `\u001b[38;2;147;153;178m{\u001b[38;2;205;214;244m% block %\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m}\u001b[38;2;205;214;244m`. Статика подключается через `\u001b[38;2;147;153;178m{\u001b[38;2;205;214;244m% load\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m static %\u001b[38;2;147;153;178m}\u001b[38;2;205;214;244m` и `\u001b[38;2;147;153;178m{\u001b[38;2;205;214;244m% static 'path' %\u001b[38;2;147;153;178m}\u001b[38;2;205;214;244m`.\r\n\u001b[39m \u001b[2m674 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: функци\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mи Python с произвольными аргументами на\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mпрямую из шаблона вызывать нельзя; испо\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mльзуют теги\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m фильтры или подготовку дан\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mных во view.\r\n\u001b[39m \u001b[2m675 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-djang\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mo-templates\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткой теме\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m676 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m677 \u001b[32;22m+\r\n\u001b[39m \u001b[2m678 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-django-\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mqueries\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m679 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango queries\r\n\u001b[39m \u001b[2m680 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../Python/Модели и ORM\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m Модели и ORM\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m681 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mQuerySet ленив: запрос выполня\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mется при фактическом обращении к данным\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m. Методы можно цепочечно комбинировать.\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m `get()` возвращает один объект или оши\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mбку, `\u001b[38;2;137;180;250mfilter\u001b[38;2;205;214;244m()` возвращает QuerySet\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `a\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mggregate()` возвращает итоговый словарь\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m, `annotate()` добавляет вычисляемые по\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mля к объектам.\r\n\u001b[39m \u001b[2m682 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: `selec\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mt_related` — для ForeignKey/OneToOne че\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mрез JOIN; `prefetch_related` — для Many\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mToMany и обратных связей отдельными зап\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mросами.\r\n\u001b[39m \u001b[2m683 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-djang\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mo-queries\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткой теме\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m684 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m685 \u001b[32;22m+\r\n\u001b[39m \u001b[2m686 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-django-\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mforms\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m687 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango forms\r\n\u001b[39m \u001b[2m688 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../Python/Работа с формами и CUD\u001b[38;2;147;153;178m.\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango: Работа с формами и CUD\u001b[38;2;205;214;244m<\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m/\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m689 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`forms\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mForm\u001b[38;2;205;214;244m` описывает форму в\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mручную\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `forms\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mModelForm\u001b[38;2;205;214;244m` строится по м\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mодели через `Meta`. `is_valid()` запуск\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mает валидацию, `cleaned_data` содержит\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mочищенные данные\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `clean_\u001b[38;2;205;214;244m()` вал\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mидирует поле, `clean()` — форму целиком\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m. `widget` управляет HTML-представление\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mм поля.\r\n\u001b[39m \u001b[2m690 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: `\u001b[38;2;137;180;250mform\u001b[38;2;147;153;178m.\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22msave\u001b[38;2;205;214;244m()` есть у ModelForm; серверная вал\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mидация обязательна\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m HTML `required` не\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mзащита.\r\n\u001b[39m \u001b[2m691 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-djang\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mo-forms\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткой теме\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m692 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m693 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m694 \u001b[32;22m+\r\n\u001b[39m \u001b[2m695 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175mtop\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНаверх\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m696 \u001b[32;22m+\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m697 \u001b[32;22m+\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m698 \u001b[32;22m+\u001b[38;2;205;214;244m\r\n\u001b[0m\u001b[48X\r\n\u001b[2m────────────────────────────────────────────────\r\n\r\n• \u001b[0mHTML собран. Проверяю технические вещи:\r\n повторяющиеся якоря, наличие целевых файлов и\r\n возможность напечатать PDF через headless\r\n Chromium.\r\n\r\n\u001b[32;1m•\u001b[0m \u001b[1mRan\u001b[0m \u001b[38;2;137;180;250mwhich\u001b[38;2;205;214;244m chromium\r\n\u001b[39;2m └ /usr/bin/chromium\r\n\r\n\u001b[31;1;22m•\u001b[0m \u001b[1mRan\u001b[0m \u001b[38;2;137;180;250mrtk\u001b[38;2;205;214;244m grep\u001b[38;2;147;153;178m -\u001b[38;2;235;160;172mo\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m\"id=\u001b[38;2;245;194;231m\\\"\u001b[38;2;166;227;161m[^\"\u001b[38;2;205;214;244m]+\u001b[38;2;245;194;231m\\\"\u001b[38;2;166;227;161m\" \"\u001b[38;2;205;214;244m90 Library/\r\n\u001b[39;2m │ \u001b[38;2;205;214;244;22mProgramming/Web/Подготовка к экзамену по\r\n\u001b[39;2m │ \u001b[38;2;205;214;244;22mвеб-разработке.html\u001b[38;2;166;227;161m\"\r\n\u001b[39;2m └ zsh:1: unmatched \"\r\n\r\n\u001b[32;1;22m•\u001b[0m \u001b[1mRan\u001b[0m \u001b[38;2;137;180;250mrtk\u001b[38;2;205;214;244m git diff\u001b[38;2;147;153;178m --\u001b[38;2;235;160;172mstat\r\n\u001b[39;2m └ .obsidian/workspace.json | 28 ++++++++++++\r\n\u001b[0m \u001b[2m++--------------\r\n\u001b[0m \u001b[2m 1 file changed, 14 insertions(+), 14\r\n\u001b[0m \u001b[2mdeletions(-)\r\n\r\n────────────────────────────────────────────────\r\n\r\n• \u001b[0mОдна проверочная команда сломалась на\r\n кавычках, без влияния на файлы. Повторяю её\r\n нормальной quoting-командой и сразу исправлю\r\n найденные дубли якорей, если будут.\r\n\r\n\u001b[32;1m•\u001b[0m \u001b[1mRan\u001b[0m \u001b[38;2;137;180;250mrtk\u001b[38;2;205;214;244m git status\u001b[38;2;147;153;178m --\u001b[38;2;235;160;172mshort\r\n\u001b[39;2m └ M .obsidian/workspace.json\r\n\u001b[0m \u001b[2m?? \"90 Library/Programming/Web/Подготовка к\r\n\u001b[0m \u001b[2mэкзамену по веб-разработке.html\"\r\n\r\n\u001b[31;1;22m•\u001b[0m \u001b[1mRan\u001b[0m \u001b[38;2;137;180;250mrtk\u001b[38;2;205;214;244m grep\u001b[38;2;147;153;178m -\u001b[38;2;235;160;172mo\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m'id=\"[^\"]+\"'\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m\"90 Library/\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22mProgramming/Web/Подготовка к экзамену по\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22mвеб-разработке.html\"\r\n\u001b[39;2m └ (no output)\r\n\r\n────────────────────────────────────────────────\r\n\r\n• \u001b[36;22mrg\u001b[0m с шаблоном для атрибутов не поймал HTML,\r\n поэтому проверю через более простые поиски по\r\n \u001b[36mid=\u001b[0m и ссылкам. Заодно вижу, что \u001b[36m.obsidian/\r\n\u001b[0m \u001b[36mworkspace.json\u001b[0m уже изменён вне моей задачи,\r\n его не трогаю.\r\n\r\n\u001b[31;1m•\u001b[0m \u001b[1mRan\u001b[0m \u001b[38;2;137;180;250mrtk\u001b[38;2;205;214;244m grep\u001b[38;2;147;153;178m -\u001b[38;2;235;160;172mn\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m\"href=\u001b[38;2;245;194;231m\\\"\u001b[38;2;166;227;161m#[^\"\u001b[38;2;205;214;244m]+\u001b[38;2;245;194;231m\\\"\u001b[38;2;166;227;161m\" \"\u001b[38;2;205;214;244m90 Library/\r\n\u001b[39;2m │ \u001b[38;2;205;214;244;22mProgramming/Web/Подготовка к экзамену по\r\n\u001b[39;2m │ \u001b[38;2;205;214;244;22mвеб-разработке.html\u001b[38;2;166;227;161m\"\r\n\u001b[39;2m └ zsh:1: unmatched \"\r\n\r\n\u001b[32;1;22m•\u001b[0m \u001b[1mRan\u001b[0m \u001b[38;2;137;180;250mrtk\u001b[38;2;205;214;244m grep\u001b[38;2;147;153;178m -\u001b[38;2;235;160;172mn\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m\"href=\u001b[38;2;245;194;231m\\\"\u001b[38;2;166;227;161m#s-meta\u001b[38;2;245;194;231m\\\"\u001b[38;2;166;227;161m|\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22mid=\u001b[38;2;245;194;231m\\\"\u001b[38;2;166;227;161ms-meta\u001b[38;2;245;194;231m\\\"\u001b[38;2;166;227;161m\"\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m\"90 Library/Programming/\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22mWeb/Подготовка к экзамену по\r\n\u001b[39;2m │ … +1 lines\r\n └ 4 matches in 3F:\r\n\r\n … +11 lines (ctrl + t to view transcript)\r\n\u001b[0m \u001b[2m 300: Class Meta\r\n\r\n\r\n\u001b[32;1;22m•\u001b[0m \u001b[1mRan\u001b[0m \u001b[38;2;137;180;250mrtk\u001b[38;2;205;214;244m grep\u001b[38;2;147;153;178m -\u001b[38;2;235;160;172mn\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m\"id=\"\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m\"90 Library/Programming/\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22mWeb/Подготовка к экзамену по\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22mвеб-разработке.html\"\r\n\u001b[39;2m └ 115 matches in 71F:\r\n\r\n … +237 lines (ctrl + t to view transcript)\r\n\r\n\u001b[0m \u001b[2m... +20\r\n\r\n────────────────────────────────────────────────\r\n\r\n• \u001b[0mНашёл реальный конфликт якоря \u001b[36ms-meta\u001b[0m: HTML\r\n meta-теги и Django \u001b[36mClass Meta\u001b[0m. Исправляю\r\n Django-якорь на отдельный \u001b[36ms-django-meta\u001b[0m.\r\n\r\n\u001b[2m• \u001b[1;22mEdited\u001b[0m 90 Library/Programming/Web/Подготовка к\r\nэкзамену по веб-разработке.html (\u001b[32m+2\u001b[0m \u001b[31m-2\u001b[0m)\r\n \u001b[2m299 \u001b[0m \u001b[38;2;205;214;244m \u001b[38;2;148;226;213m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mhref\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"#s-migrations\"\u001b[38;2;148;226;213m>\u001b[38;2;205;214;244mМиграци\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22mи\u001b[38;2;148;226;213m\r\n\u001b[39;48;5;52m \u001b[2m300 \u001b[31;22m-\u001b[38;2;205;214;244;2m \u001b[38;2;148;226;213m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mhref\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"#s-meta\"\u001b[38;2;148;226;213m>\u001b[38;2;205;214;244mClass Meta\u001b[38;2;148;226;213m\r\n\u001b[39;48;5;22;22m \u001b[2m300 \u001b[32;22m+\u001b[38;2;205;214;244m \u001b[38;2;148;226;213m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mhref\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"#s-django-meta\"\u001b[38;2;148;226;213m>\u001b[38;2;205;214;244mClass\u001b[1X\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mMeta\u001b[38;2;148;226;213m\r\n\u001b[0m \u001b[2m301 \u001b[0m \u001b[38;2;205;214;244m \u001b[38;2;148;226;213m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mhref\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"#s-null-blank\"\u001b[38;2;148;226;213m>\u001b[38;2;205;214;244mnull/bl\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22mank\u001b[38;2;148;226;213m\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m471 \u001b[0m \u001b[38;2;205;214;244m \u001b[38;2;148;226;213m<\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mclass\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"card\"\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mid\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"s-migra\r\n\u001b[0m \u001b[2m \u001b[38;2;166;227;161;22mtions\"\u001b[38;2;148;226;213m><\u001b[38;2;137;180;250mh3\u001b[38;2;148;226;213m>\u001b[38;2;205;214;244mМиграции\u001b[38;2;148;226;213m<\u001b[38;2;137;180;250mp\u001b[38;2;148;226;213m>\u001b[38;2;205;214;244m`makemigrati\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22mons` создаёт файлы миграций из изменени\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22mй моделей, `migrate` применяет их к баз\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22mе данных.\u001b[38;2;148;226;213m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mclass\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"detail-link\"\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mhre\r\n\u001b[0m \u001b[2m \u001b[38;2;249;226;175;22mf\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"#d-django-models\"\u001b[38;2;148;226;213m>\u001b[38;2;205;214;244mПодробно: Django m\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22models\u001b[38;2;148;226;213m\r\n\u001b[39;48;5;52m \u001b[2m472 \u001b[31;22m-\u001b[38;2;205;214;244;2m \u001b[38;2;148;226;213m<\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mclass\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"card\"\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mid\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"s-meta\"\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22m уровне форм/валидации Django.\u001b[38;2;148;226;213m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mcl\r\n\u001b[0m \u001b[2m \u001b[38;2;249;226;175;22mass\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"detail-link\"\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mhref\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"#d-django-model\r\n\u001b[0m \u001b[2m \u001b[38;2;166;227;161;22ms\"\u001b[38;2;148;226;213m>\u001b[38;2;205;214;244mПодробно: Django models\u001b[38;2;148;226;213m\u001b[38;2;205;214;244m\u001b[6X\r\n\u001b[39m \u001b[2m476 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-manyt\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22momany\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mMany-\u001b[38;2;137;180;250mto-\u001b[38;2;205;214;244mMany\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`ManyToM\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22manyField` задаёт связь многие-ко-многим\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m. Django создаёт промежуточную таблицу\u001b[1X\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mавтоматически\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m либо можно указать свою\u001b[1X\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mчерез `through`.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-li\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mnk\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django-models\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: D\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mjango models\u001b[38;2;205;214;244m\u001b[13X\r\n\u001b[39m \u001b[2m477 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-fbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mFBV\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mFunction-Based View — фу\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mнкция\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m которая принимает `request` и во\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mзвращает `HttpResponse`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `render`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `red\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mirect` или ошибку.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mlink\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django-fbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: Dj\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mango FBV\u001b[38;2;205;214;244m\u001b[17X\r\n\u001b[39m \u001b[2m478 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-rende\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mr\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mrender\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`render(request\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mt\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22memplate\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m context)` рендерит шаблон с ко\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mнтекстом и возвращает `HttpResponse`.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-djang\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mo-fbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: Django FBV\u001b[38;2;205;214;244m\u001b[37X\r\n\u001b[39m \u001b[2m479 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-conte\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mxt\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПередача данных в шаблон\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m>\u001b[38;2;205;214;244mДанные передаются словарём context: кл\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mючи становятся именами переменных в шаб\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mлоне.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22md-django-fbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: Django FBV\u001b[38;2;205;214;244m<\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m/\u001b[38;2;137;180;250marticle\u001b[38;2;147;153;178m>\u001b[30X\r\n\u001b[39m \u001b[2m480 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-get-o\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mbject\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mОбъект или 404\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`get_o\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mbject_or_404(Model\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m pk=pk)` возвращает\u001b[1X\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mобъект или генерирует HTTP 404\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m если за\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mписи нет.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" hre\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mf=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django-fbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: Django FBV<\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m/\u001b[38;2;137;180;250ma\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m481 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-routi\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mng-fbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mМаршрутизация FBV\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m`urlpatterns` функция передаётся напрям\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mую: `\u001b[38;2;137;180;250mpath\u001b[38;2;205;214;244m(\"posts/<int\u001b[38;2;147;153;178m:\u001b[38;2;205;214;244mpk>/\", view\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22ms\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mdetail\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m name=\"detail\")`.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django-fbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодр\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mобно: Django FBV\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m482 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-cbv-t\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mypes\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mTemplateView\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m DetailView\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m Lis\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mtView\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`TemplateView` показывает\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mшаблон\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `DetailView` — один объект\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `Li\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mstView` — список объектов.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django-cbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодр\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mобно: Django CBV\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m483 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-cbv-m\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22models\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mCBV и модели\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mДля `Lis\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mtView`/`DetailView` можно указать `mode\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22ml = Post`; Django сам построит queryset\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m и стандартные имена шаблонов.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m cl\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mass=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django-cbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mПодробно: Django CBV\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m484 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-cbv-e\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mxtra\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mДополнительные данные\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mДополнительный контекст обычно добавляю\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mт через `get_context_data`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m вызывая `su\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mper()` и дополняя словарь.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django-cbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодр\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mобно: Django CBV\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m485 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-cbv-d\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mefault-vars\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПеременные по умолчани\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mю\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`ListView` отдаёт `object_list\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m` и `modelname_list`; `DetailView` отда\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mёт `\u001b[38;2;137;180;250mobject\u001b[38;2;205;214;244m` и `modelname`.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django-cbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодр\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mобно: Django CBV\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m486 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-cbv-q\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mueryset\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПереопределение выгрузки\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`get_queryset()` меняет список об\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mъектов, `get_object()` — получение одно\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mго объекта. Часто используют фильтрацию\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m по пользователю или статусу.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m cla\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mss=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django-cbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mП\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mодробно: Django CBV\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m487 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-pagin\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mation\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПаджинация\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ `ListVie\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mw` достаточно задать `paginate_by = N`;\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m в шаблоне появится `page_obj`.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m c\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mlass=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django-cbv\u001b[38;2;205;214;244m\"\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m>\u001b[38;2;205;214;244mПодробно: Django CBV\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m488 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-cbv-t\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22memplates\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mШаблоны по умолчанию\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mДля `DetailView`: `app/model_detail\u001b[38;2;147;153;178m.\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mhtml\u001b[38;2;205;214;244m`; для `ListView`: `app/model_list\u001b[38;2;147;153;178m.\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mhtml\u001b[38;2;205;214;244m`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m если не задан `template_name`.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-djang\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mo-cbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: Django CBV\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m489 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-cbv-s\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22muper\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВызов базовой логики\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mП\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mри переопределении методов вроде `get_c\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22montext_data` обычно сначала вызывают `s\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22muper()`, чтобы не потерять стандартный\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mконтекст.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" hre\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mf=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django-cbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: Django CBV<\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m/\u001b[38;2;137;180;250ma\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m490 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-cbv-r\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mouting\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mМаршрутизация CBV\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mКл\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mасс подключается через `\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mas_view\u001b[38;2;205;214;244m()`: `\u001b[38;2;137;180;250mp\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22math\u001b[38;2;205;214;244m(\"\"\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m PostListView\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mas_view\u001b[38;2;205;214;244m(), name=\"p\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22most_list\")`.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\"\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django-cbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: Django C\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mBV\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m491 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-djang\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mo-urls\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango URLs\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`\u001b[38;2;137;180;250mpath\u001b[38;2;205;214;244m()`\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m задаёт маршрут, view\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m kwargs и имя. `r\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22me_path()` использует regex. `reverse()`\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m строит URL по имени маршрута.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m cl\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mass=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django-urls\u001b[38;2;205;214;244m\"\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m>\u001b[38;2;205;214;244mПодробно: Django URLs\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m492 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-djang\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mo-templates\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mЯзык шаблонов Django\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПеременные пишутся как `\u001b[38;2;147;153;178m{\u001b[38;2;205;214;244m{ value\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m}\u001b[38;2;205;214;244m}`, теги как `\u001b[38;2;147;153;178m{\u001b[38;2;205;214;244m% for %\u001b[38;2;147;153;178m}\u001b[38;2;205;214;244m`, фильтры как\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m`\u001b[38;2;147;153;178m{\u001b[38;2;205;214;244m{ name|lower \u001b[38;2;147;153;178m}\u001b[38;2;205;214;244m}`. Наследование делает\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mся через `extends` и `block`.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m cla\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mss=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django-templa\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mtes\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: Django templates\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m493 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-djang\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mo-queries\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango queries\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mQu\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22merySet ленивый и цепочечный. Важно знат\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mь `get`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `\u001b[38;2;137;180;250mfilter\u001b[38;2;205;214;244m`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `exclude`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `order_by\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `annotate`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `aggregate`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `Q`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `F`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mselect_related`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `prefetch_related`.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175md-django\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22m-queries\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: Django queries\u001b[38;2;205;214;244m<\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m/\u001b[38;2;137;180;250marticle\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m494 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"card\" id=\"\u001b[38;2;137;180;250ms-djang\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mo-forms\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango forms\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`forms\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m.\u001b[38;2;249;226;175mForm\u001b[38;2;205;214;244m` — ручная форма\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `ModelForm` стро\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mится по модели. Валидация через `is_val\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mid`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `cleaned_data`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `clean_field`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `cl\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mean`.\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetail-link\u001b[38;2;205;214;244m\" href=\"\u001b[38;2;147;153;178m#\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22md-django-forms\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробно: Django forms<\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m/\u001b[38;2;137;180;250ma\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m495 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m496 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m497 \u001b[32;22m+\r\n\u001b[39m \u001b[2m498 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250msection\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mdetails\u001b[38;2;205;214;244m\" id=\"\u001b[38;2;137;180;250mdetails\u001b[38;2;205;214;244m\"\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m>\r\n\u001b[39m \u001b[2m499 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh2\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодробные заметки\r\n\u001b[39m \u001b[2m500 \u001b[32;22m+\r\n\u001b[39m \u001b[2m501 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-ip\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m502 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mIP-адресация\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m IPv4\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m IPv6\r\n\u001b[39m \u001b[2m503 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../../Networking/Протоколы/IP-адр\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mес\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mIP-адрес,\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"../../Net\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mworking/Протоколы/IPv6\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mIPv6\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m504 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ интернете используются адрес\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mа разных уровней: физический адрес инте\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mрфейса\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m сетевой IP-адрес и символьное D\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mNS-имя. IPv4 записывается четырьмя окте\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mтами\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m например `192.168.1.10`. IPv6 исп\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mользует 128 бит и записывается группами\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m шестнадцатеричных чисел.\r\n\u001b[39m \u001b[2m505 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте часто с\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mпрашивают: IPv4 = 32 бита\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m IPv6 = 128 б\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mит\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m IPv4 октет = 0-255\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m IPv6 не совмест\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mим напрямую с IPv4.\r\n\u001b[39m \u001b[2m506 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-ip-ad\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mdressing\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткой теме\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m507 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m508 \u001b[32;22m+\r\n\u001b[39m \u001b[2m509 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-tcp\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m510 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mTCP\r\n\u001b[39m \u001b[2m511 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../../Networking/Протоколы/TCP vs\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m UDP\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mTCP vs UDP\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m512 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mTCP устанавливает соединение п\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mеред передачей данных\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m делит данные на\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mсегменты\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m нумерует их\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m подтверждает дос\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mтавку и повторяет потерянные данные. За\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m это платит дополнительными задержками\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mи служебным трафиком.\r\n\u001b[39m \u001b[2m513 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: TCP —\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mнадёжный\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mconnection-oriented\u001b[38;2;205;214;244m; UDP — бы\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mстрее и проще\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m но без гарантий доставки\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m и порядка.\r\n\u001b[39m \u001b[2m514 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-tcp\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mНазад к краткой теме\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m515 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m516 \u001b[32;22m+\r\n\u001b[39m \u001b[2m517 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-subnet\u001b[38;2;205;214;244m\"\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m>\r\n\u001b[39m \u001b[2m518 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодсети и маска подсети\r\n\u001b[39m \u001b[2m519 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../../Networking/Подсети и маска\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mподсети\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодсети и маска подсети\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\r\n\u001b[39m \u001b[2m520 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mМаска подсети определяет\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m каки\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mе биты IPv4-адреса относятся к сети\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m а\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mкакие к хосту. Запись `/24` равна маске\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m `255.255.255.0`: первые 24 бита — сеть\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m,\u001b[38;2;205;214;244m последние 8 — хосты.\r\n\u001b[39m \u001b[2m521 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mЗапомнить: чем\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mбольше префикс `/N`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m тем меньше адресов\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m в подсети.\r\n\u001b[39m \u001b[2m522 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-subne\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mt\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткой теме\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m523 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m524 \u001b[32;22m+\r\n\u001b[39m \u001b[2m525 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-nat\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m526 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mNAT\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m приватные адреса\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m localh\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22most\r\n\u001b[39m \u001b[2m527 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../../Networking/NAT\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mNAT,\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m <\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"../../Networking/Подсети и ма\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mска подсети\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПодсети и маска подсети\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m528 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mNAT переводит приватные IPv4-а\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mдреса во внешний публичный адрес. Часты\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mе приватные диапазоны: `10.0.0.0/8`, `1\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m72.16.0.0/12`, `192.168.0.0/16`. Loopba\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mck-диапазон `127.0.0.0/8` не использует\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mся для обмена между узлами сети; `127.0\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m.0.1` и `localhost` указывают на текущу\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mю машину.\r\n\u001b[39m \u001b[2m529 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: NAT эк\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mономит публичные IPv4 и скрывает внутре\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mннюю адресацию\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m но ломает прямую \u001b[38;2;137;180;250mend-to\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22m-end\u001b[38;2;205;214;244m связность.\r\n\u001b[39m \u001b[2m530 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-nat-l\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mocalhost\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткой теме\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m531 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m532 \u001b[32;22m+\r\n\u001b[39m \u001b[2m533 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-dns\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m534 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDNS и DNS-серверы\r\n\u001b[39m \u001b[2m535 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../../Networking/Протоколы/DNS\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDNS\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m536 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDNS — распределённая база данн\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mых\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m которая по доменному имени возвраща\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mет IP-адрес или другие записи. Типичная\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m цепочка: локальный кэш/hosts\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m resolver\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m провайдера\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mroot-серверы\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m TLD-серверы\u001b[38;2;147;153;178m,\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m авторитативные серверы домена.\r\n\u001b[39m \u001b[2m537 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: root н\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mе знает IP конкретного сайта\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m он направ\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mляет к TLD; авторитативный сервер знает\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m записи домена.\r\n\u001b[39m \u001b[2m538 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-dns\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mНазад к краткой теме\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m539 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m540 \u001b[32;22m+\r\n\u001b[39m \u001b[2m541 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-http\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m542 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mHTTP и HTTP-сообщения\r\n\u001b[39m \u001b[2m543 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../../Networking/Протоколы/HTTP\u001b[38;2;147;153;178m,\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mHTTPS и HTTP3\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mHTTP\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m HTTPS и HTTP/3<\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m/\u001b[38;2;137;180;250ma\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m544 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mHTTP — протокол прикладного ур\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mовня. Запрос и ответ состоят из стартов\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mой строки\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m заголовков\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m пустой строки и\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mнеобязательного тела. Методы описывают\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mдействие над ресурсом\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m заголовки переда\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mют метаданные\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m коды ответа показывают р\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mезультат обработки.\r\n\u001b[39m \u001b[2m545 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mtable\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mtr\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mth\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mМетод\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mth\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mСмыс\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mл\u001b[38;2;205;214;244m\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mtr\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mtd\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`GET`\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mtd\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПолучи\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mть ресурс\u001b[38;2;205;214;244m\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mtr\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mtd\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`POST`\u001b[38;2;205;214;244m<\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mtd\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mОтправить данные\u001b[38;2;205;214;244m\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mtr\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mtd\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`P\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mUT`\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mtd\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mСоздать/заменить ресурс\u001b[38;2;205;214;244m\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mtr\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mtd\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`PATCH`\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mtd\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mЧастично\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mизменить ресурс\u001b[38;2;205;214;244m\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mtr\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mtd\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`DELET\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mE`\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250mtd\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mУдалить ресурс\u001b[38;2;205;214;244m\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m546 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: `4xx`\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m— проблема на стороне клиента\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `5xx` —\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mпроблема на стороне сервера.\r\n\u001b[39m \u001b[2m547 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-http\u001b[38;2;205;214;244m\"\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m>\u001b[38;2;205;214;244mНазад к HTTP\u001b[38;2;205;214;244m · <\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-http-me\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mssage\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к HTTP-сообщениям\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m548 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m549 \u001b[32;22m+\r\n\u001b[39m \u001b[2m550 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-https\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m551 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mHTTPS\r\n\u001b[39m \u001b[2m552 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../../Networking/Протоколы/HTTP\u001b[38;2;147;153;178m,\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mHTTPS и HTTP3\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mHTTP\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m HTTPS и HTTP/3<\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m/\u001b[38;2;137;180;250ma\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m553 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mHTTPS — это HTTP\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m защищённый T\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mLS. Сертификат связывает домен с ключам\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mи и подтверждает подлинность сервера. T\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mLS обеспечивает шифрование\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m целостность\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m и защиту от подмены трафика.\r\n\u001b[39m \u001b[2m554 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: HTTP п\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mорт `80`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m HTTPS порт `443`; Basic auth\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mбез HTTPS небезопасен.\r\n\u001b[39m \u001b[2m555 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-https\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткой теме\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m556 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m557 \u001b[32;22m+\r\n\u001b[39m \u001b[2m558 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-http3\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m559 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mHTTP/3\r\n\u001b[39m \u001b[2m560 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../../Networking/Протоколы/HTTP\u001b[38;2;147;153;178m,\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mHTTPS и HTTP3\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mHTTP\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m HTTPS и HTTP/3<\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m/\u001b[38;2;137;180;250ma\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m561 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mHTTP/3 переносит HTTP на QUIC\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mповерх UDP. QUIC делает потоки независи\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mмыми: потеря пакета не блокирует все за\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mпросы внутри соединения\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m как это возмож\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mно в HTTP/2 поверх TCP. TLS 1.3 встроен\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m в QUIC.\r\n\u001b[39m \u001b[2m562 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: HTTP/3\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m не меняет методы и коды HTTP\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m меняет т\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mранспорт: UDP/QUIC вместо TCP.\r\n\u001b[39m \u001b[2m563 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-http3\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткой теме\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m564 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m565 \u001b[32;22m+\r\n\u001b[39m \u001b[2m566 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-ports\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m567 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mСетевые порты\r\n\u001b[39m \u001b[2m568 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../../Networking/Сетевые порты\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mСетевые порты\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m569 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mПорт уточняет приложение-получ\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mателя внутри хоста. Номер порта находит\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mся в диапазоне `0-65535`. Порты TCP и U\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mDP независимы: `53/tcp` и `53/udp` — ра\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mзные конечные точки.\r\n\u001b[39m \u001b[2m570 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mМинимум к запом\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mинанию: HTTP `80`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m HTTPS `443`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m DNS `53\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m SSH `22`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m SMTP `25`.\r\n\u001b[39m \u001b[2m571 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-ports\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткой теме\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m572 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m573 \u001b[32;22m+\r\n\u001b[39m \u001b[2m574 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-auth\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m575 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mИдентификация\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m аутентификация\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m,\u001b[38;2;205;214;244m авторизация\r\n\u001b[39m \u001b[2m576 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../../Networking/Веб-аутентификац\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mия и авторизация\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВеб-аутентификация\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m и авторизация\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m577 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mИдентификация сообщает системе\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m идентификатор субъекта. Аутентификация\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m проверяет подлинность. Авторизация выд\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mаёт права на действия. В HTTP встречают\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mся схемы Basic\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m Digest и Bearer.\r\n\u001b[39m \u001b[2m578 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте не пута\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mть: логин — идентификация\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m пароль/код —\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m аутентификация, доступ к админке — авт\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mоризация.\r\n\u001b[39m \u001b[2m579 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-auth\u001b[38;2;205;214;244m\"\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m>\u001b[38;2;205;214;244mНазад к краткой теме\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m580 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m581 \u001b[32;22m+\r\n\u001b[39m \u001b[2m582 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-oauth\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m583 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mOAuth 2.0\r\n\u001b[39m \u001b[2m584 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../../Networking/OAuth 2.0\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mOA\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22muth 2.0\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m585 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mOAuth 2.0 позволяет стороннему\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m приложению получить ограниченный досту\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mп к ресурсам пользователя. Вместо парол\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mя приложение получает токен с конкретны\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mми правами и сроком жизни.\r\n\u001b[39m \u001b[2m586 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: OAuth\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m2.0 — авторизация\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m не парольная аутенти\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mфикация. Для входа поверх OAuth обычно\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mнужен OpenID Connect.\r\n\u001b[39m \u001b[2m587 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-oauth\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткой теме\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m588 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m589 \u001b[32;22m+\r\n\u001b[39m \u001b[2m590 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-uri\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m591 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mURI\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m URL\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m URN\r\n\u001b[39m \u001b[2m592 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../../Networking/Протоколы/URI\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m U\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mRL\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m URN\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mURI\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m URL\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m URN\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m593 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mURL показывает\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m где находится\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mресурс и как его получить: схема\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m хост\u001b[38;2;147;153;178m,\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m порт\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m путь\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m параметры\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m фрагмент. URN з\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mадаёт стабильное имя ресурса без места\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mполучения. URI — общее понятие для иден\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mтификаторов ресурсов.\r\n\u001b[39m \u001b[2m594 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mГлавная формула\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m: URL ⊂ URI; URN ⊂ URI; не каждый URI я\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mвляется URL.\r\n\u001b[39m \u001b[2m595 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-uri\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mНазад к краткой теме\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m596 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m597 \u001b[32;22m+\r\n\u001b[39m \u001b[2m598 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-html\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m599 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mHTML\r\n\u001b[39m \u001b[2m600 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"Основы HTML (структура\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m таблицы\u001b[38;2;147;153;178m,\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mформы)\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mОсновы HTML (структура\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m табл\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mицы\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m формы)\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m601 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mHTML описывает структуру докум\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mента. Важно знать базовый каркас\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m роль\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m`\u001b[38;2;137;180;250mhead\u001b[38;2;205;214;244m` и `\u001b[38;2;137;180;250mbody\u001b[38;2;205;214;244m`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m блочные и строчные эле\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mменты\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m семантические теги\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m атрибуты `cl\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mass`/`id`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m ссылки\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m изображения\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m списки\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mи таблицы.\r\n\u001b[39m \u001b[2m602 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: `class\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m` можно повторять\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `id` должен быть уни\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mкальным; таблицы — для табличных данных\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m,\u001b[38;2;205;214;244m не для макета.\r\n\u001b[39m \u001b[2m603 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175mblock-2\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткому блоку HTML\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m604 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m605 \u001b[32;22m+\r\n\u001b[39m \u001b[2m606 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-html-fo\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mrms\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m607 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mHTML Forms\r\n\u001b[39m \u001b[2m608 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"Основы HTML (структура\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m таблицы\u001b[38;2;147;153;178m,\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mформы)\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mОсновы HTML (структура\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m табл\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mицы\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m формы)\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m609 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mФорма отправляет данные на сер\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mвер. `action` задаёт URL\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `method` — сп\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mособ отправки. `\u001b[38;2;137;180;250mlabel\u001b[38;2;205;214;244m` связывается с по\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mлем через `for` и `id`. `name` определя\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mет имя параметра при отправке. `require\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22md` и типы \u001b[38;2;137;180;250minput\u001b[38;2;205;214;244m помогают браузерной вал\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mидации\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m но не заменяют серверную провер\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mку.\r\n\u001b[39m \u001b[2m610 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: у \u001b[38;2;137;180;250mradi\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mo-кнопок\u001b[38;2;205;214;244m одной группы должен быть одина\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mковый `name`; у `\u001b[38;2;137;180;250mbutton\u001b[38;2;205;214;244m` внутри формы л\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mучше явно задавать `type`.\r\n\u001b[39m \u001b[2m611 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175mblock-3\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткому блоку HTML Forms\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\r\n\u001b[39m \u001b[2m612 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m613 \u001b[32;22m+\r\n\u001b[39m \u001b[2m614 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-css-sel\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mectors\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m615 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mCSS selectors\r\n\u001b[39m \u001b[2m616 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"Основы\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m селекторы и блочная модел\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mь\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mCSS: Основы и селекторы\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m617 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mCSS-селектор выбирает элементы\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m,\u001b[38;2;205;214;244m к которым применяются правила. Нужно\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mразличать селекторы тега\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m класса\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m id\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m а\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mтрибута\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m псевдокласса и комбинаторы. Ка\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mскад учитывает важность\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m специфичность\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mи порядок правил.\r\n\u001b[39m \u001b[2m618 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mСпецифичность:\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22minline > ID > класс/атрибут/псевд\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mокласс > тег/псевдоэлемент.\r\n\u001b[39m \u001b[2m619 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175mblock-4\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткому блоку CSS\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m620 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m621 \u001b[32;22m+\r\n\u001b[39m \u001b[2m622 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-css-pro\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mps\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m623 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mCSS базовые свойства\r\n\u001b[39m \u001b[2m624 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"Основы\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m селекторы и блочная модел\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mь\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mCSS: Основы и селекторы\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m625 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mБлочная модель состоит из \u001b[38;2;137;180;250mcont\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22ment\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m padding\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m border и margin. `\u001b[38;2;137;180;250mbox-siz\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22ming\u001b[38;2;205;214;244m` меняет расчёт ширины. Текстовые св\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mойства управляют шрифтами\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m выравнивание\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mм\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m межстрочным расстоянием\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m расстоянием\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m между буквами и декором текста. Фон за\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mдаётся через группу `background-\u001b[38;2;137;180;250m*\u001b[38;2;205;214;244m`.\r\n\u001b[39m \u001b[2m626 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: `width\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m` при `\u001b[38;2;137;180;250mcontent-box\u001b[38;2;205;214;244m` не включает padding\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m/border\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m при `\u001b[38;2;137;180;250mborder-box\u001b[38;2;205;214;244m` включает.\r\n\u001b[39m \u001b[2m627 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175mblock-4\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткому блоку CSS\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m628 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m629 \u001b[32;22m+\r\n\u001b[39m \u001b[2m630 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-layout\u001b[38;2;205;214;244m\"\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m>\r\n\u001b[39m \u001b[2m631 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mFlexbox и Grid\r\n\u001b[39m \u001b[2m632 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"Адаптивность\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m Flexbox и Grid\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mCSS: Адаптивность\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m Flexbox и Grid\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m633 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mFlexbox — одномерная модель ра\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mскладки по главной и поперечной оси. Gr\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mid — двумерная сетка строк и колонок. F\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mlex удобен для распределения элементов\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mв строке или колонке\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m Grid — для общего\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m макета страницы.\r\n\u001b[39m \u001b[2m634 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: `\u001b[38;2;137;180;250mjusti\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mfy-content\u001b[38;2;205;214;244m` работает по главной оси fle\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mx\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `\u001b[38;2;137;180;250malign-items\u001b[38;2;205;214;244m` — по поперечной; `fr`\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m— доля свободного пространства Grid.\r\n\u001b[39m \u001b[2m635 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175mblock-5\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткому блоку Flex/Grid\u001b[38;2;205;214;244m<\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m/\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m636 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m637 \u001b[32;22m+\r\n\u001b[39m \u001b[2m638 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-django-\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mmodels\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m639 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango models\r\n\u001b[39m \u001b[2m640 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../Python/Модели и ORM\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m Модели и ORM\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m641 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mМодели описывают структуру таб\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mлиц и связи между ними. `CharField` тре\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mбует `max_length`; `ForeignKey` задаёт\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m`on_delete`; `ManyToManyField` создаёт\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mпромежуточную таблицу или использует ук\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mазанную через `through`. Миграции перен\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mосят изменения моделей в БД.\r\n\u001b[39m \u001b[2m642 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: `null=\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mTrue` относится к БД\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `blank=True` — к\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mформам/валидации Django.\r\n\u001b[39m \u001b[2m643 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175mblock-d\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mjango\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткому блоку Django\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m644 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m645 \u001b[32;22m+\r\n\u001b[39m \u001b[2m646 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-django-\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mfbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m647 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango FBV\r\n\u001b[39m \u001b[2m648 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../Python/Представления, шаблоны\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mи CBV\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango: Представления\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m шаблон\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mы и CBV\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m649 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mFBV — обычная функция-представ\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mление. Она принимает `request`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m получае\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mт данные\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m вызывает `render` или возвращ\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mает другой `HttpResponse`. Маршрутизиру\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mется через `\u001b[38;2;137;180;250mpath\u001b[38;2;205;214;244m()` прямой передачей фу\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mнкции.\r\n\u001b[39m \u001b[2m650 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: `rende\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mr(request\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m \u001b[38;2;137;180;250mtemplate\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m context)` возвраща\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mет HTTP-ответ; `get_object_or_404` возв\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mращает объект или 404.\r\n\u001b[39m \u001b[2m651 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175mblock-d\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mjango\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткому блоку Django\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m652 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m653 \u001b[32;22m+\r\n\u001b[39m \u001b[2m654 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-django-\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mcbv\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m655 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango CBV\r\n\u001b[39m \u001b[2m656 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../Python/Представления, шаблоны\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mи CBV\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango: Представления\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m шаблон\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mы и CBV\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m657 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mCBV — классовые представления\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mс готовой логикой. `TemplateView` показ\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mывает шаблон\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `ListView` выводит список\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m,\u001b[38;2;205;214;244m `DetailView` выводит один объект. В U\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mRL подключаются через `\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mas_view\u001b[38;2;205;214;244m()`.\r\n\u001b[39m \u001b[2m658 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: `ListV\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22miew` по умолчанию даёт `object_list`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mDetailView` — `\u001b[38;2;137;180;250mobject\u001b[38;2;205;214;244m`; шаблоны по умол\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mчанию `model_list\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mhtml\u001b[38;2;205;214;244m` и `model_detail\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m.\u001b[38;2;249;226;175mhtml\u001b[38;2;205;214;244m`.\r\n\u001b[39m \u001b[2m659 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175mblock-d\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mjango\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткому блоку Django\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m660 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m661 \u001b[32;22m+\r\n\u001b[39m \u001b[2m662 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-django-\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22murls\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m663 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango URLs\r\n\u001b[39m \u001b[2m664 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../Python/Представления, шаблоны\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mи CBV\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango: Представления\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m шаблон\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mы и CBV\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m665 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`urlpatterns` связывает URL с\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mпредставлениями. `\u001b[38;2;137;180;250mpath\u001b[38;2;205;214;244m()` использует ro\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mute\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m view\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m kwargs и name. Конвертеры вр\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mоде `int`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `slug`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `uuid`\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `\u001b[38;2;137;180;250mpath\u001b[38;2;205;214;244m` извле\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mкают параметры. `reverse()` и `\u001b[38;2;147;153;178m{\u001b[38;2;205;214;244m% url %\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m}\u001b[38;2;205;214;244m` строят URL по имени маршрута.\r\n\u001b[39m \u001b[2m666 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: не хар\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mдкодить URL\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m если есть именованный марш\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mрут и `reverse`/`url`.\r\n\u001b[39m \u001b[2m667 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-djang\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mo-urls\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткой теме\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m668 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m669 \u001b[32;22m+\r\n\u001b[39m \u001b[2m670 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-django-\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mtemplates\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m671 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mЯзык шаблонов Django\r\n\u001b[39m \u001b[2m672 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../Python/Представления, шаблоны\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mи CBV\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango: Представления\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m шаблон\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mы и CBV\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m673 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDTL использует переменные `\u001b[38;2;147;153;178m{\u001b[38;2;205;214;244m{\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mvalue \u001b[38;2;147;153;178m}\u001b[38;2;205;214;244m}`, теги `\u001b[38;2;147;153;178m{\u001b[38;2;205;214;244m% tag %\u001b[38;2;147;153;178m}\u001b[38;2;205;214;244m` и фильтры `\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m{\u001b[38;2;205;214;244m{ value|\u001b[38;2;137;180;250mfilter\u001b[38;2;205;214;244m \u001b[38;2;147;153;178m}\u001b[38;2;205;214;244m}`. Наследование строи\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mтся через `\u001b[38;2;147;153;178m{\u001b[38;2;205;214;244m% extends %\u001b[38;2;147;153;178m}\u001b[38;2;205;214;244m` и `\u001b[38;2;147;153;178m{\u001b[38;2;205;214;244m% block %\r\n\u001b[39m \u001b[2m \u001b[38;2;147;153;178;22m}\u001b[38;2;205;214;244m`. Статика подключается через `\u001b[38;2;147;153;178m{\u001b[38;2;205;214;244m% load\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m static %\u001b[38;2;147;153;178m}\u001b[38;2;205;214;244m` и `\u001b[38;2;147;153;178m{\u001b[38;2;205;214;244m% static 'path' %\u001b[38;2;147;153;178m}\u001b[38;2;205;214;244m`.\r\n\u001b[39m \u001b[2m674 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: функци\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mи Python с произвольными аргументами на\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mпрямую из шаблона вызывать нельзя; испо\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mльзуют теги\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m фильтры или подготовку дан\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mных во view.\r\n\u001b[39m \u001b[2m675 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-djang\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mo-templates\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткой теме\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m676 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m677 \u001b[32;22m+\r\n\u001b[39m \u001b[2m678 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-django-\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mqueries\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m679 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango queries\r\n\u001b[39m \u001b[2m680 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../Python/Модели и ORM\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m Модели и ORM\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m681 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mQuerySet ленив: запрос выполня\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mется при фактическом обращении к данным\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m. Методы можно цепочечно комбинировать.\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m `get()` возвращает один объект или оши\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mбку, `\u001b[38;2;137;180;250mfilter\u001b[38;2;205;214;244m()` возвращает QuerySet\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `a\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mggregate()` возвращает итоговый словарь\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m, `annotate()` добавляет вычисляемые по\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mля к объектам.\r\n\u001b[39m \u001b[2m682 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: `selec\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mt_related` — для ForeignKey/OneToOne че\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mрез JOIN; `prefetch_related` — для Many\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mToMany и обратных связей отдельными зап\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mросами.\r\n\u001b[39m \u001b[2m683 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-djang\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mo-queries\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткой теме\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m684 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m685 \u001b[32;22m+\r\n\u001b[39m \u001b[2m686 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m class=\"note\" id=\"\u001b[38;2;137;180;250md-django-\r\n\u001b[39m \u001b[2m \u001b[38;2;137;180;250;22mforms\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m687 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mh3\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango forms\r\n\u001b[39m \u001b[2m688 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"\u001b[38;2;137;180;250mnote-source\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mVault: <\u001b[38;2;137;180;250ma\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mhref=\"../Python/Работа с формами и CUD\u001b[38;2;147;153;178m.\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mmd\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mDjango: Работа с формами и CUD\u001b[38;2;205;214;244m<\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m/\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\r\n\u001b[39m \u001b[2m689 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m`forms\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mForm\u001b[38;2;205;214;244m` описывает форму в\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mручную\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `forms\u001b[38;2;147;153;178m.\u001b[38;2;249;226;175mModelForm\u001b[38;2;205;214;244m` строится по м\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mодели через `Meta`. `is_valid()` запуск\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mает валидацию, `cleaned_data` содержит\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mочищенные данные\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m `clean_\u001b[38;2;205;214;244m()` вал\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mидирует поле, `clean()` — форму целиком\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m. `widget` управляет HTML-представление\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mм поля.\r\n\u001b[39m \u001b[2m690 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mdiv\u001b[38;2;205;214;244m class=\"exam\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mВ тесте: `\u001b[38;2;137;180;250mform\u001b[38;2;147;153;178m.\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22msave\u001b[38;2;205;214;244m()` есть у ModelForm; серверная вал\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mидация обязательна\u001b[38;2;147;153;178m,\u001b[38;2;205;214;244m HTML `required` не\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mзащита.\r\n\u001b[39m \u001b[2m691 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175ms-djang\r\n\u001b[39m \u001b[2m \u001b[38;2;249;226;175;22mo-forms\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНазад к краткой теме\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m692 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m693 \u001b[32;22m+\u001b[38;2;205;214;244m \r\n\u001b[39m \u001b[2m694 \u001b[32;22m+\r\n\u001b[39m \u001b[2m695 \u001b[32;22m+\u001b[38;2;205;214;244m <\u001b[38;2;137;180;250mp\u001b[38;2;205;214;244m class=\"back\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m href=\"\u001b[38;2;147;153;178m#\u001b[38;2;249;226;175mtop\u001b[38;2;205;214;244m\"\u001b[38;2;147;153;178m>\u001b[38;2;205;214;244mНаверх\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22m\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m696 \u001b[32;22m+\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m697 \u001b[32;22m+\u001b[38;2;205;214;244m\r\n\u001b[39m \u001b[2m698 \u001b[32;22m+\u001b[38;2;205;214;244m\r\n\u001b[0m\u001b[48X\r\n\u001b[2m────────────────────────────────────────────────\r\n\r\n• \u001b[0mHTML собран. Проверяю технические вещи:\r\n повторяющиеся якоря, наличие целевых файлов и\r\n возможность напечатать PDF через headless\r\n Chromium.\r\n\r\n\u001b[32;1m•\u001b[0m \u001b[1mRan\u001b[0m \u001b[38;2;137;180;250mwhich\u001b[38;2;205;214;244m chromium\r\n\u001b[39;2m └ /usr/bin/chromium\r\n\r\n\u001b[31;1;22m•\u001b[0m \u001b[1mRan\u001b[0m \u001b[38;2;137;180;250mrtk\u001b[38;2;205;214;244m grep\u001b[38;2;147;153;178m -\u001b[38;2;235;160;172mo\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m\"id=\u001b[38;2;245;194;231m\\\"\u001b[38;2;166;227;161m[^\"\u001b[38;2;205;214;244m]+\u001b[38;2;245;194;231m\\\"\u001b[38;2;166;227;161m\" \"\u001b[38;2;205;214;244m90 Library/\r\n\u001b[39;2m │ \u001b[38;2;205;214;244;22mProgramming/Web/Подготовка к экзамену по\r\n\u001b[39;2m │ \u001b[38;2;205;214;244;22mвеб-разработке.html\u001b[38;2;166;227;161m\"\r\n\u001b[39;2m └ zsh:1: unmatched \"\r\n\r\n\u001b[32;1;22m•\u001b[0m \u001b[1mRan\u001b[0m \u001b[38;2;137;180;250mrtk\u001b[38;2;205;214;244m git diff\u001b[38;2;147;153;178m --\u001b[38;2;235;160;172mstat\r\n\u001b[39;2m └ .obsidian/workspace.json | 28 ++++++++++++\r\n\u001b[0m \u001b[2m++--------------\r\n\u001b[0m \u001b[2m 1 file changed, 14 insertions(+), 14\r\n\u001b[0m \u001b[2mdeletions(-)\r\n\r\n────────────────────────────────────────────────\r\n\r\n• \u001b[0mОдна проверочная команда сломалась на\r\n кавычках, без влияния на файлы. Повторяю её\r\n нормальной quoting-командой и сразу исправлю\r\n найденные дубли якорей, если будут.\r\n\r\n\u001b[32;1m•\u001b[0m \u001b[1mRan\u001b[0m \u001b[38;2;137;180;250mrtk\u001b[38;2;205;214;244m git status\u001b[38;2;147;153;178m --\u001b[38;2;235;160;172mshort\r\n\u001b[39;2m └ M .obsidian/workspace.json\r\n\u001b[0m \u001b[2m?? \"90 Library/Programming/Web/Подготовка к\r\n\u001b[0m \u001b[2mэкзамену по веб-разработке.html\"\r\n\r\n\u001b[31;1;22m•\u001b[0m \u001b[1mRan\u001b[0m \u001b[38;2;137;180;250mrtk\u001b[38;2;205;214;244m grep\u001b[38;2;147;153;178m -\u001b[38;2;235;160;172mo\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m'id=\"[^\"]+\"'\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m\"90 Library/\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22mProgramming/Web/Подготовка к экзамену по\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22mвеб-разработке.html\"\r\n\u001b[39;2m └ (no output)\r\n\r\n────────────────────────────────────────────────\r\n\r\n• \u001b[36;22mrg\u001b[0m с шаблоном для атрибутов не поймал HTML,\r\n поэтому проверю через более простые поиски по\r\n \u001b[36mid=\u001b[0m и ссылкам. Заодно вижу, что \u001b[36m.obsidian/\r\n\u001b[0m \u001b[36mworkspace.json\u001b[0m уже изменён вне моей задачи,\r\n его не трогаю.\r\n\r\n\u001b[31;1m•\u001b[0m \u001b[1mRan\u001b[0m \u001b[38;2;137;180;250mrtk\u001b[38;2;205;214;244m grep\u001b[38;2;147;153;178m -\u001b[38;2;235;160;172mn\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m\"href=\u001b[38;2;245;194;231m\\\"\u001b[38;2;166;227;161m#[^\"\u001b[38;2;205;214;244m]+\u001b[38;2;245;194;231m\\\"\u001b[38;2;166;227;161m\" \"\u001b[38;2;205;214;244m90 Library/\r\n\u001b[39;2m │ \u001b[38;2;205;214;244;22mProgramming/Web/Подготовка к экзамену по\r\n\u001b[39;2m │ \u001b[38;2;205;214;244;22mвеб-разработке.html\u001b[38;2;166;227;161m\"\r\n\u001b[39;2m └ zsh:1: unmatched \"\r\n\r\n\u001b[32;1;22m•\u001b[0m \u001b[1mRan\u001b[0m \u001b[38;2;137;180;250mrtk\u001b[38;2;205;214;244m grep\u001b[38;2;147;153;178m -\u001b[38;2;235;160;172mn\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m\"href=\u001b[38;2;245;194;231m\\\"\u001b[38;2;166;227;161m#s-meta\u001b[38;2;245;194;231m\\\"\u001b[38;2;166;227;161m|\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22mid=\u001b[38;2;245;194;231m\\\"\u001b[38;2;166;227;161ms-meta\u001b[38;2;245;194;231m\\\"\u001b[38;2;166;227;161m\"\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m\"90 Library/Programming/\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22mWeb/Подготовка к экзамену по\r\n\u001b[39;2m │ … +1 lines\r\n └ 4 matches in 3F:\r\n\r\n … +11 lines (ctrl + t to view transcript)\r\n\u001b[0m \u001b[2m 300: Class Meta\r\n\r\n\r\n\u001b[32;1;22m•\u001b[0m \u001b[1mRan\u001b[0m \u001b[38;2;137;180;250mrtk\u001b[38;2;205;214;244m grep\u001b[38;2;147;153;178m -\u001b[38;2;235;160;172mn\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m\"id=\"\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m\"90 Library/Programming/\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22mWeb/Подготовка к экзамену по\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22mвеб-разработке.html\"\r\n\u001b[39;2m └ 115 matches in 71F:\r\n\r\n … +237 lines (ctrl + t to view transcript)\r\n\r\n\u001b[0m \u001b[2m... +20\r\n\r\n────────────────────────────────────────────────\r\n\r\n• \u001b[0mНашёл реальный конфликт якоря \u001b[36ms-meta\u001b[0m: HTML\r\n meta-теги и Django \u001b[36mClass Meta\u001b[0m. Исправляю\r\n Django-якорь на отдельный \u001b[36ms-django-meta\u001b[0m.\r\n\r\n\u001b[2m• \u001b[1;22mEdited\u001b[0m 90 Library/Programming/Web/Подготовка к\r\nэкзамену по веб-разработке.html (\u001b[32m+2\u001b[0m \u001b[31m-2\u001b[0m)\r\n \u001b[2m299 \u001b[0m \u001b[38;2;205;214;244m \u001b[38;2;148;226;213m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mhref\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"#s-migrations\"\u001b[38;2;148;226;213m>\u001b[38;2;205;214;244mМиграци\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22mи\u001b[38;2;148;226;213m\r\n\u001b[39;48;5;52m \u001b[2m300 \u001b[31;22m-\u001b[38;2;205;214;244;2m \u001b[38;2;148;226;213m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mhref\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"#s-meta\"\u001b[38;2;148;226;213m>\u001b[38;2;205;214;244mClass Meta\u001b[38;2;148;226;213m\r\n\u001b[39;48;5;22;22m \u001b[2m300 \u001b[32;22m+\u001b[38;2;205;214;244m \u001b[38;2;148;226;213m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mhref\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"#s-django-meta\"\u001b[38;2;148;226;213m>\u001b[38;2;205;214;244mClass\u001b[1X\r\n\u001b[39m \u001b[2m \u001b[38;2;205;214;244;22mMeta\u001b[38;2;148;226;213m\r\n\u001b[0m \u001b[2m301 \u001b[0m \u001b[38;2;205;214;244m \u001b[38;2;148;226;213m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mhref\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"#s-null-blank\"\u001b[38;2;148;226;213m>\u001b[38;2;205;214;244mnull/bl\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22mank\u001b[38;2;148;226;213m\r\n\u001b[0m \u001b[2m ⋮\r\n\u001b[0m \u001b[2m471 \u001b[0m \u001b[38;2;205;214;244m \u001b[38;2;148;226;213m<\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mclass\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"card\"\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mid\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"s-migra\r\n\u001b[0m \u001b[2m \u001b[38;2;166;227;161;22mtions\"\u001b[38;2;148;226;213m><\u001b[38;2;137;180;250mh3\u001b[38;2;148;226;213m>\u001b[38;2;205;214;244mМиграции\u001b[38;2;148;226;213m<\u001b[38;2;137;180;250mp\u001b[38;2;148;226;213m>\u001b[38;2;205;214;244m`makemigrati\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22mons` создаёт файлы миграций из изменени\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22mй моделей, `migrate` применяет их к баз\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22mе данных.\u001b[38;2;148;226;213m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mclass\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"detail-link\"\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mhre\r\n\u001b[0m \u001b[2m \u001b[38;2;249;226;175;22mf\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"#d-django-models\"\u001b[38;2;148;226;213m>\u001b[38;2;205;214;244mПодробно: Django m\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22models\u001b[38;2;148;226;213m\r\n\u001b[39;48;5;52m \u001b[2m472 \u001b[31;22m-\u001b[38;2;205;214;244;2m \u001b[38;2;148;226;213m<\u001b[38;2;137;180;250marticle\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mclass\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"card\"\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mid\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"s-meta\"\r\n\u001b[0m \u001b[2m \u001b[38;2;205;214;244;22m уровне форм/валидации Django.\u001b[38;2;148;226;213m<\u001b[38;2;137;180;250ma\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mcl\r\n\u001b[0m \u001b[2m \u001b[38;2;249;226;175;22mass\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"detail-link\"\u001b[38;2;205;214;244m \u001b[38;2;249;226;175mhref\u001b[38;2;148;226;213m=\u001b[38;2;166;227;161m\"#d-django-model\r\n\u001b[0m \u001b[2m \u001b[38;2;166;227;161;22ms\"\u001b[38;2;148;226;213m>\u001b[38;2;205;214;244mПодробно: Django models\u001b[38;2;148;226;213m\u001b[0m и\r\n \u001b[36m
\u001b[0m. Браузер может воспринять их как\r\n разметку, поэтому экранирую такие примеры и\r\n пересоберу PDF.\r\n\r\n\u001b[32;1m•\u001b[0m \u001b[1mRan\u001b[0m \u001b[38;2;137;180;250mrtk\u001b[38;2;205;214;244m grep\u001b[38;2;147;153;178m -\u001b[38;2;235;160;172mn\u001b[38;2;205;214;244m \u001b[38;2;166;227;161m\"<(doctype|html|head|body|\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22mtitle|meta|link|style|script|div|p|\r\n\u001b[39;2m │ \u001b[38;2;166;227;161;22msection|span|a |img|br|form|label|input|\r\n\u001b[39;2m │ … +5 lines\r\n └ 351 matches in 145F:\r\n\r\n … +460 lines (ctrl + t to view transcript)\r\n\r\n\u001b[0m \u001b[2m... +182\r\n\r\n────────────────────────────────────────────────\r\n\r\n• \u001b[0mЭкранировать нужно не весь файл, а только\r\n примеры тегов внутри учебного текста. Правлю\r\n эти строки вручную, чтобы не задеть настоящую\r\n HTML-разметку документа.\r\n\r\n\u001b[2m•\u001b[1C\u001b[1;22mExplored\r\n\u001b[22;2m └ \u001b[36;22mRead\u001b[1C\u001b[0mПодготовка\u001b[1Cк\u001b[1Cэкзамену\u001b[1Cпо\u001b[1Cвеб-\r\n\u001b[9Cразработке.html\r\n\r\n•\u001b[1C\u001b[2mWorking\u001b[1C(2m 50s • esc to interrupt)\r\n\r\n\u001b[48;5;238;22m \u001b[47X\r\n\u001b[1m›\u001b[22m \u001b[2mSummarize recent commits\r\n\u001b[22m \r\n\u001b[0m\u001b[2X\u001b[2C\u001b[38;2;246;226;183mgpt-5.5 high\u001b[39;2m · \u001b[38;2;171;223;167;22m~/Documents/Vaults/SecondBrain\u001b[1X\u001b[2A\u001b[45D\u001b[0m", "rows": 34, "scrollLine": -1 } @@ -164,7 +167,7 @@ }, "pinned": true, "icon": "terminal", - "title": "Terminal: SecondBrain" + "title": "Terminal: ⠋ SecondBrain" } }, { @@ -267,8 +270,11 @@ "3d-graph-new:Global 3D Graph": false } }, - "active": "3e242b36cec6a5ec", + "active": "27e6486165131cfa", "lastOpenFiles": [ + "99 System/Archive/00_базовые_понятия.pdf", + "99 System/Archive/Подготовка к экзамену по Веб-Разработке.md", + "90 Library/Programming/Web/Подготовка к экзамену по веб-разработке.pdf", "90 Library/Networking/Веб-аутентификация и авторизация.md", "90 Library/Programming/Web/Подготовка к экзамену по веб-разработке.html", "90 Library/Programming/Programming - MOC.md", @@ -295,7 +301,6 @@ "90 Library/Programming/Python/Представления, шаблоны и CBV.md", "90 Library/Programming/Python/Модели и ORM.md", "90 Library/Programming/Python/Базовый синтаксис и основы.md", - "04 Tools/🛠️ Неоконченные заметки.sync-conflict-20260603-110335-23DMR5O.md", "04 Tools/StudyTracker/Courses", "04 Tools/StudyTracker/Books", "04 Tools/SocialBase/04 Другие", @@ -303,7 +308,6 @@ "04 Tools/SocialBase/02 Друзья", "04 Tools/SocialBase/01 Семья", "04 Tools/StudyTracker", - "04 Tools/SocialBase", "99 System/Cache/Pasted image 20260526204029.png", "99 System/Cache/Pasted image 20260526203848.png", "99 System/Cache/Pasted image 20260526203807.png", diff --git a/90 Library/Programming/Web/Подготовка к экзамену по веб-разработке.pdf b/90 Library/Programming/Web/Подготовка к экзамену по веб-разработке.pdf new file mode 100644 index 0000000000000000000000000000000000000000..59a706e189cb9e814005c6f24c3d1de90704d8d2 GIT binary patch literal 160997 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

    o;YeeR8EV|_4-Rg&+0F*G$#X%cFBP9p zcPT3&FCjWPVoH6&m*CuPbLOwm%dM#4w;h(&CfwTX)uDXW(E- z^Imqvl;i-BS4~6iQ`j#s6DJ`Pxx|{C%npd>vTS-S|GZX9|`_0m7@Q=YD9gs_?$vPTu#M zV{I;H99)@8cGhVyQpw_U>lQ?mHFxpzOc6xwi;0X?7`kpNFS4BWIgk12?7NYNR;)wY zacwmEB^a;>`AowV$rUZ8^MV0WA$3}Un$2|{+)>>5&Uy~UJ*MNaZ)me~GjlL-b8~P6 z!#VR+-M2Tl^3~iwtc_joGBJro4smzk8*sA|AXkFaM2A3pmk3(F3!&oO|KS5&_!~zq zbQ?(jG{Ve8AtDTJ>)B|7{|8(;63QxJTIbh^@Psh%jGO_rMf~9h3)e;BlKm#A$S9dQ zR4>8w*IbGGzJ>2Vi;bb>a-FqHExy0&`y>H;=2%B$2-aoAfJ2d|Qm*6wRos<_<&?gE zElR7D5*05-MCo15dzKcvj5UdhL@}bhRHQ|eib2K_4PqvSXw#xpDxzo+?U6M07G*7w z^t(^C(XWS2BaGHK zjH0r}Z;!8Yxg2gBYZ|KIom?^5|CPALYN4N6VYPI$`}m>bCYnl#3d%!o49OUy5;iE- zWGiLrWgo%Jn-?d$+VoD!N&|IAwWr6_j9Zrcu=L66I9aCy4Nu4l#mJTG6DdvGn9iVz z$HP)O)lP4Ewd}oIGu?Y%dLd3RTso)4DUtsQk{ z?1ZVZriQfz-Ys4~PIcNbSwT{&^;l?E%@B=@wN@poL@AwGesvwSU-BNhWhr{C2~JF& zmi}_kDZMY(3qR%7U;i3%NN&U+tr3knSM((pt&v!=Ptj5_^62N^cGwh0PJF(9#z{B1 zE0t%ib#1x&aZ#3KVf^Z%GooP2C@tU5O4*~lZ|GX8duf~+I<$N8#8%I$PIIN#!>_C< z$Ta&rNNVDC>04P&HtQD`M-S7OMlaj4sH8k)QmAreU&+n(rCs;6N2OIAUS@jlYRCKw zt8{J|gym1Ov$h`n#_zb@I$zyG+Vz!!x9VShY}m8Z`*ugCQG!y`sgAA}6*q@O?HM_J zU#6t8193=Oah=3qzTvfwBb1b3oItg{c#O^P$GpZ_q4GLE85(b1Fnr+~=|;QdId-qQ zhlY9CBpUh;dS0FGcQozMuPv`XcFr^Tz39SfUQ0{6v)hA**-n-V*W39nE@)3K_N=m7 z{MgFid}N*5X#SC{b+vo8uMLPRvUL+t^y(uagSJcON@!PEGOg*8x417p@L|}anbfe7 z9*GTF#VtC+_GUd(>DfO`*(D~NeB1lb(?QaN|PpVx2LE1Pg2vwp!7S8-!U&{knUP~EwtJe``foP1^DX?+|DcdgauDSdJ_brO-kO|HN5;?Sz>pWk?nED9}*o3--l zQ%<@N5nW(;$7gc0oRMpsy!C}@*8_uEE0z1S&0?pTCT@^UPgPQl ze6(d^(bk~)%lUJkwznrVkJ`Iw@XJ%S8Xe6>(`f$NhJ4fCdtYtr`(mgaVxjr8gt$62 zFWyikr|n6#j;WOF`?a6X1VuPRSp+A@lrCLzSEAzFPbZGYlly_E~x2ig}T`@n(T2|XK(1Ix%R@m~o+(5gfHL^T%jmeSur-JS#=3Xe> zxLb7ic*@)3%g0sPMr3x+4h{46tsNfKe@uH`6CtlmDMLR5zDH)Cyl9p;bijV z<4wk9lSJ9&(v7!?4~a9}hntg5(gkDPwU))-_p`y2zNVH16ubX^7+H2Yi3onI+kj@IX`%~ky4J5cInebHsc6psRX z>)JeT!-lBGzn^N6D`{JG?akgD4k}8zJ=*qa?e=Q9zuo`PIn~cXUvY}z0gayx53EZq zU3=m5h~YpxbN;-EE8(xa{9jTh;wu0`|w4j_m&HeR_{F7Iq7IZM6N+VM8vh% z?-hJD4hfMd_8yz$mtZy_LFQ9P(gXV`g)6U(t3Q{PW!{nZ?)>}H<-=Z1N!CA8;4;1U zg0L&t@vD};Tb8o+4+Ukm1qF`hol`YJTrzH4nS6O~q;ty64c=2W|1x$|%(Sh~FW63G z3VJR2)SI8_FM4v^IrN}%KQ9yOF3-s@b2aciAgVg zG}_YcOK$2r5FFTh`E=jv3T9dS&Gc(0Vl9476fd~+(Tv=il6qBj))*-=&T7Rzr|1OebC19G za%z%$c=3cpW#ibFqS)EH^jx>+uas)0e-1bqB@$*=>c3Oaw3s&eL`U8G@`^<7mv`@O zT}&_E)t7j#6#&!8t8w>er+}@eVTa7U`N_8dfRh)cjQ4R{v?becaT-OO40uW!!3P0`-J1F6tx% zEw}Dge^GKSz&L01Wwo86V^f_LhfAEXXdQFH^W(_HWAc3Jq)JOaG-_-c9U~iHmVZk% z1=NOsK!G&J$Vgk*_uGAb|V4e_YK2t&PilD;NFTGkh+&0issYju#-Dca` z#ksob1`)STzH4(fHQg_1Jx*7@q|I4f!T!9*$j>FGhd$iA$NqY}RyyVnbUkPsX{~>7)8@e?E{h&| z_E;2r{2^eTVt9J7YNT|V_-d!2-q5iZ%RMbGy?%GbvHIYm>g92C_G5{;(%w?egMM@< z`z5yR;0?8;1^Z$+%-c(6JYSu8xjval5dy zB095Z#H+4=UI%mEYfa7ZN_906@J;cPD@Jb;{`#QJsIoXRn@kg{exPz5#M>pU$}P8k zesTMQ;YmsFdg3pJ$~b%L&nV^Hi3kB(N+zM77S zA#lZwy}#zQ8*66Ee*PhNgv7as_F)ntT@@99Ytt@meZ5g56&^|}@ub%I#+;8#(z7vF zndAIZWQj-53YWXRYKeApws}qUe&>58uBv9$gY1Xe9_m zJo%_MsblvOWo>o$M^<{tZnJ8}MkJmzGjV@aJN$A;9?zP%?AAH>Q|q3ME^kCTJX|NM zd$wFH?^;3)Q+(^GdixC(-a7uRW@gaG)lZXl#$_M2p4(G!^!V3jwQeV3E9_^Nt;i4S z^>vt|_{_*=pM;}cxYyAjsU)Q@n^aokug8WY#$^mMu`y{IG)3dXtsyt_>VK?vFtgbD z>$}vd$c!zKmy2ywd!Ec*U(;yd9Wl)>_4S;Of#r3NwQ}BF%WN|{K2gR@_tx&Snf|7= zt;b8wHFTZI9-l&|zqhgu%U|ibI7}(5sm|=yq27kA`xM<}_ZgJt-wf@RTaqZLWgR_t z!@}JrcF|F)ABL*UHtucwgL*S&v$Ib?iq5eNA6NRo7(Zs~3%N?6yv5$X9(JN{^`?(U7I}R_mJi%;3`OUW58b z+2YKfzUr_2rQw)i!aLc3ds@#fmW|0`XGoE~Rh+ruYeJQK_}k3XuC%rcm*4w{PvK>! zeP4XE*Xo=p46beQ2zwhb@~e7VSMshdMYr=`4)zbvGravJE2Xbb=6R1tD}ET`u|@(u$^8B0);>G~AtRDE zwDj5FW(9B;@c?KMB_QMt=leLgI)TY;blt#%FVtp{KC@JmJDv!zC1gMBhypkepd5Gr|FGi`Ko$#G%oO_{$!FgU zXMqUpda=I)fI|dxz_7MrQoti&5`u<5z)vyBc4PlV3TU3Nf9U{d1V0(kU$no6BLpIt z2yjUKBd|-{KZyVaCPcs>B@)5EfF%~G!xJ+AUxKj#ZUzjnP$u@f&k6dkek_s<5GKG7 zDF7%9LqHo6{%8M6kiZq6m5K${5Da0*6ANKfieZ`p_BnhsKFzm}kFaCYuIpT=>yG zD9!K17+w9XHRT@;51IbzUM;a_wujNemyg%kssgwLl zIUmC)UiUYc)7^6QW$~Iq{nz29xzdkw+HZHgnB>^Bq5VqUzNdyUw-?QlS*dGebmhdF z6K@llgF_g%ytb41r<1&oz2DcJ9r**1Hj8S%SFz1?RqB3b*`=c$#W(%iPU-Widf&$n zaq5}fQ)Q!kVD*(Fs~i_CTw3r<**rzYZRP~aU00>IRY(pOOqgJq{qF3~)s_hvizYOw z&eOB}VWBuX#J_TvJE^?UDIp@aiR=J{Ro@q_A)Zxif6lbi{Uj5^W zg_;XBy)_jS=QYU;D*QU4XGP#E^MI7vMEL5$*ZZ1|KDxL5k6R8OR(|c3O6|NYgWcCR z;Dvvk7x)_Abw2&R3_&XXtCj!HpbFMtIG~Dto%+TL!L9s`@&NQB1@eI9`Ok+(ip5|q zj=XCR{r4f7vjB`Lc_=O;0h1k#E;|YKV z0?z^9&4KNp3kilipfCJF1LBEG0}LLQCg215jnhsbMDp?lA_BK#9SFBCYx-Oo1#W{& zqXF2*p$Xx4L=&*ih5h`!E_}YQ-?4FMB5+aMb^u>PG?L`fD1xTAvWW;GxUzxcQDO** z92z)Bg3B||0945BD`K4``}s!>Qb@5reE^LTldNkUNaK@eUP{b-hd+kl%pu^5`D`Tl zc02(emXE_T&ybI|9og0QfK(4>CVQ>(6`#$}6C-9I(uIJO#ZgX*l-KLJ_hpTF9pB-0=t$D?lTW-=Kvg@&~k#hH{HL9*+C8h|glmIdU)nr03AU zy>RUasu*PFfKA6di{SbQG#<`hXc1cwaOb6vozo(0zqE+{4$l;W2x{fZ`*X2>AmVZr?_BPC$Zy`Vt~c!!eX5#0=6ug8mNA6q~{h+)KcoW1bo855(W` zO=3REOK7nO^DGvkm`p=Sig*URJf@LY@8L!OEC*;gk_`edqA?6wQ^<#q{y`m#_6Vw1 zq~oLruN8^oDoqmD-XQ%$Hb{~v-=LwSK(dkSNeO2!Neb&O$zb0Jxf$AXN+3k?QaF~; z6rA#K=cR;LcVX#~Y!p0mM1667N>gI&cPS|PQC~`c)&NWz&r9RIq#?cKj>iUNL=&P~ zgQf*=^95(^;Wizl8?*@T8%^@j`q5$>Lum@t8Z-?XhvsDuXSlq8b#ZA7+pvOG2GxY(6$(n5Y-Eyk$8_pA~Dhfkr36PU@|C= zW#9k-?HeILc?8^!gKU)%!KFBeXIz6ZB5+RJb_5^Wf(VKn)DD6LqKUA55O6Sn+7VdS z;LsTHOpqv^!?j~5o-<;&&k4;zquQQM7b1X=-B_k_M&xxL=mkEBm>`}VOxM;hSmiFHS&oJoOE&5 z0LnqME)W>dx_|*=8UZ)babgM_45qMsZ^voUIGF z_5n0L*Dj$iB*t8x!Hh5sghTB}?irZ?Qd@3JhQkebSj6oMWdO$(pxt-&oS?XR4+YqF zbW)7+2mwT2BnNmQZmtZci6ZW^1b7<7M}6T%18)8zfV&F0{#gK4j`j_Xc#wUF;rN+r zt8nCjY)dTSf16ABY<6&R-LP5S#Kh3j$$vxtb40^s9v(it{<4C7ZDGE=pHYWf8 literal 0 HcmV?d00001 diff --git a/00 Inbox/00_базовые_понятия.pdf b/99 System/Archive/00_базовые_понятия.pdf similarity index 100% rename from 00 Inbox/00_базовые_понятия.pdf rename to 99 System/Archive/00_базовые_понятия.pdf diff --git a/00 Inbox/Подготовка к экзамену по Веб-Разработке.md b/99 System/Archive/Подготовка к экзамену по Веб-Разработке.md similarity index 100% rename from 00 Inbox/Подготовка к экзамену по Веб-Разработке.md rename to 99 System/Archive/Подготовка к экзамену по Веб-Разработке.md diff --git a/99 System/INDEX.md b/99 System/INDEX.md index c8a7792..5927035 100644 --- a/99 System/INDEX.md +++ b/99 System/INDEX.md @@ -1,6 +1,6 @@ --- -generated: 2026-06-03 -total: 497 +generated: 2026-06-04 +total: 504 --- # Vault Index @@ -9,7 +9,7 @@ total: 497 | Параметр | Значение | |----------|----------| -| Всего заметок | 497 | +| Всего заметок | 504 | ## ./ @@ -472,9 +472,11 @@ total: 497 | [[MAC-адрес]] | MAC-адрес | stable | concept | [networking] | | [[NAT]] | NAT | stable | concept | [network, networking, nat] | | [[Networking - MOC]] | Networking - MOC | stable | moc | [network, networking] | +| [[OAuth 2.0]] | OAuth 2.0 | seed | concept | [web, security, oauth, authorization] | | [[VLSM]] | VLSM | stable | concept | [network, networking] | | [[VPN]] | VPN | stable | concept | [network, networking, vpn] | | [[Базовая настройка коммутатора]] | Базовая Настройка Коммутатора | stable | concept | [network, networking] | +| [[Веб-аутентификация и авторизация]] | Идентификация, аутентификация и авторизация | seed | concept | [web, security, authentication, authorization, oauth] | | [[Введение в сетевую безопасность]] | Введение в сетевую безопасность | seed | concept | [networking, security, infosec] | | [[Витая пара]] | Витая Пара | stable | concept | [network, networking] | | [[Иерархическая модель Cisco]] | Иерархическая Модель Cisco | stable | concept | [network, networking] | @@ -482,8 +484,10 @@ total: 497 | [[Коммутатор L3 vs Маршрутизатор]] | Коммутатор L3 Vs Маршрутизатор | stable | concept | [network, networking] | | [[Модель OSI]] | Модель OSI | stable | concept | [network, networking, osi] | | [[Пример настройки DHCPv6]] | Пример Настройки DHCPv6 | stable | concept | [network, networking] | +| [[Подсети и маска подсети]] | Маска подсети, Подсети | seed | concept | [network, networking, subnet, ipv4] | | [[Режимы передачи данных в сетях]] | Режимы Передачи Данных В Сетях | stable | concept | [network, networking] | | [[Сегментация сети]] | Сегментация Сети | stable | concept | [network, networking] | +| [[Сетевые порты]] | Сетевые порты | seed | concept | [network, networking, ports, tcp, udp, web] | | [[Сетевые устройства]] | Сетевые Устройства | stable | concept | [network, networking] | | [[Утилита Ping]] | Утилита Ping | stable | concept | [network, networking] | | [[Широковещательные и коллизионные домены. Коммутация.]] | Широковещательные И Коллизионные Домены. Коммутация | stable | concept | [network, networking] | @@ -514,10 +518,12 @@ total: 497 |---------|---------|--------|------|------| | [[ARP]] | ARP | stable | concept | [network, networking, protocols, arp] | | [[DNS]] | DNS | stable | concept | [network, networking, protocols, dns] | +| [[HTTP, HTTPS и HTTP3]] | HTTP, HTTPS и HTTP/3 | seed | concept | [web, network, networking, protocols, http, https, http3] | | [[ICMP - Internet Control Message]] | ICMP - Internet Control Message | stable | concept | [network, networking, protocols, icmp] | | [[IP-адрес]] | IP-адрес | stable | concept | [network, networking, protocols] | | [[IPv6]] | IPv6 | stable | concept | [network, networking, protocols, ipv6] | | [[TCP vs UDP]] | TCP Vs UDP | stable | concept | [network, networking, protocols] | +| [[URI, URL, URN]] | URI, URL, URN | seed | concept | [web, network, networking, uri, url, urn] | ## 90 Library/Networking/Протоколы/DHCP @@ -644,6 +650,7 @@ total: 497 | [[Основные команды git]] | Основные команды git | processing | concept | [] | | [[Подготовка Speaking]] | Подготовка Speaking | seed | concept | [] | | [[Подготовка к защите ЛР2]] | Подготовка к защите ЛР2 | processing | lab | [mephi] | +| [[Подготовка к экзамену по Веб-Разработке]] | — | seed | concept | [] | | [[Поздравления с НГ]] | — | processing | lab | [] | | [[Работа с API для проекта Attendance Mephi]] | — | seed | concept | [] | | [[РИАС - база]] | РИАС - База | seed | knowledge | [mephi, study] |