Асинхронное Django приложение - asyncio в Django

Информация о загрузке и деталях видео Асинхронное Django приложение - asyncio в Django
Автор:
Сурен ХоренянДата публикации:
20.04.2025Просмотров:
2.4KОписание:
D Alerts: Смотрим на Python asyncio в Django проекте. Все-все ссылки на все мои ресурсы Код тут:
Транскрибация видео
Так, возможно, уже даже идет трансляция, но это не точно.
Сейчас я проверю.
В ВК, например, снова какие-то проблемы.
Она просто не запускается.
Хотя эфир идет.
Сейчас посмотрим.
Так, на платформе вроде бы все окей.
Сейчас я рестрим в телегу запущу.
Сделаю анонс.
Проверю, что везде все ок.
Сейчас мы сделаем новый стрим.
With copy stream key.
Вставляю новый.
Стартую рестрим.
Говорю старт.
И сейчас еще в телегу должен пойти звук.
Ну и поток вообще в целом.
Видео и звук.
Смотрим.
Пока что в Телеграме пусто.
Опа, Телеграм есть.
Супер.
Значит, Телеграм пошло.
Платформа есть.
ВК есть.
Прекрасно.
Само стартануло внезапно.
Рутуб есть.
Ютуб есть.
Теперь я запускаю... О, смотрите, мы с вами в 17.30 начали.
Потрясающе, по-моему.
Как я и планировал.
Мы запускаем еще окошко с YouTube.
С админкой.
Будет выглядеть так.
Я открываю ссылку отдельно.
И захожу с...
Айпеда.
И еще я открою студию Рутуба.
Так, LiveChat вместо TopChat.
Студия Рутуба рядом.
Конечно, вряд ли что-то будет, но на всякий случай зайду.
Иду в трансляции.
В эфире.
Перехожу к ней.
И тут чат.
Сообщение.
Вот, пока пусто.
Окей.
О, вижу сразу же сообщение в чате.
Давайте смотреть, что вы пишете.
Привет, есть вопрос.
Вот учу в Астапе, буду потом вспоминать Джанго и так далее, но я вот не понимаю, как монетизировать знания.
Почему-то на фрилансе мало заказов по REST.
api возможно надо смотреть заказ разработку приложений полноценных то есть не просто знать арест а прям приложение вот например так как вариант вот значит вы меня уже видите раз так значит я делаю анонс и мы стартуем да по моему отличная идея так единственное что я сейчас еще знаете что сделаю
Я добавлю сюда сцену.
Donation alerts.
Вот так.
И будет видно теперь.
Прекрасных людей.
Которые закинули копеечку.
На.
Мое творчество.
И все.
Сейчас телегу анонс пилю.
И мы стартуем.
Так что буквально одна минутка.
Files.
Сейчас я открою.
открой превьюшка вот превьюшка так вот и копирую текст да вот вот что я не подготовил так это сообщение про эфир и
Так, мы уже в эфире.
Сейчас я ссылки все обновлю.
Ютубовская ссылка.
Скопировать.
Вставить.
Я понимаю, что вы не видите, но я поэтому и озвучиваю.
ВК-шная ссылка.
Так, поделиться.
Скопировать.
Вставить.
Дальше.
Рутубная ссылка.
Поделиться.
Вот тут удобно.
Одну кнопку нажал, сразу же скопировано.
И я вот так вставляю.
И платформа.
Вот с платформой сложнее всего.
Потому что это надо идти... Может в управлении есть?
Нет, в управлении нет.
Надо идти...
на мой канал, там в раздел трансляции, а оттуда уже скопировать.
Вот наиболее неудобно поделиться и потом еще скопировать.
Очень неудобно сделано на платформе.
Все, мы в эфире, отправляю.
В следующий раз, значит, надо на 5 минут еще раньше начать, чем сегодня.
И тогда вот эти все анонсы будут вообще вовремя.
Супер.
Так, теперь я проверяю технически, что все окей.
Это мы можем сделать уже на экране, чтобы всем было не так скучно.
Значит, я открываю какое-нибудь гостевое окошко.
И показываю вам экран.
Вот гостевое окошко, вот я открываю тележеньку и кликаем по ссылкам, проверяем, что везде эфир идет.
Еще бы у меня это открылось на нужном окне, но оно не открылось.
Давайте проверим еще раз.
Я запускаю тележеньку, открываю ссылку, вот раз в этом окне.
Отлично.
Так, эфир идёт.
Я даже себя вижу, но тут задержка, я-то уже экран показываю.
У вас почему-то... О, всё, да, задержка немаленькая, но есть.
Ну, ничего страшного.
Перейдём сюда, проверим здесь.
Да, не очень важно.
Да, всё окей.
И платформа есть.
Ну, главное, ютубчики есть.
Да, всё, везде эфир идёт.
Потрясающе.
Всем спасибо, что подождали эту минутку.
И погнали.
Значит, это я закрыть могу.
И если будет что добавить, то вы пишите комментарии.
Читаю, на все отвечаю.
Спасибо, до целых приложений стейка еще маловато.
Ну, а на фрилансе не хотят заниматься наймом нескольких людей.
Хотят, чтобы один человек взял и выполнил задачу.
Соответственно, если вы не можете сделать задачу, то есть не REST API, а задачу, то, ну, надо еще что-то подучить.
Но если вы лезете на фриланс, просто возьмите, что вы на фрилансе видите, что вам еще не по зубам.
Посмотрите, чего вам не хватает, чтобы подучить и заняться.
Так, сейчас...
У меня микрофон перекрывает планшет, на котором комментарии, я поэтому за подставкой отошел.
Буду подглядывать за вашими комментариями.
Так, привет, можешь подсказать какие-либо каналы, может, англоязычные, где показывают разработку приложений на фастапе полноценно по шагам от начала до деплоя?
Мой?
Ну ладно, до деплоя у меня на канале еще не было, но в программе, если что, давайте я напомню на всякий случай перед стартом, что я активно сейчас...
Что мы делаем?
Мы открываем какой-нибудь... Упс, это спойлеры.
Это, кстати, вот в рамках курса мы проходили сейчас пайтест.
Значит, я открываю еще раз ссылочку какую-нибудь на какой-нибудь из эфиров.
Да, открываю, допустим, вот этот.
Значит, я открываю его.
Неважно, на YouTube, где везде одинаковая ссылка.
Перехожу по ссылке.
на все свои ссылки, да, и тут пока что специально запрятано подальше, потому что там вышло, ну, только процентов 20, ну, как вышло, готово, вот, это пока закрываем, скидочка до конца месяца, и здесь мы разработаем реально приложение и задиплоем его, вот то, что в программа курса, это уже, это уже все отснято, опубликовано до стоп-урока, стоп-урок у нас...
Стоп, урок у нас где?
Вот, стоп, урок.
Вот это я залил уже, то есть оно уже есть, но я еще не сделал задание.
Я все-таки каждому занятию делаю задание, вот тут тесты.
И поэтому пока еще не опубликовал.
Короче, это уже залит на платформу, но еще вот завтра откроется.
Я домашки успею сделать как раз.
Вот, это все, что дальше, оно уже отснято.
Просто я это еще не залил, потому что каждому ролику надо сделать описание и домашку.
Вот.
И здесь в том числе будет диплой скоро, ну как скоро, где-нибудь в серединке на продакшн.
Вот, если вдруг интересно, ссылочки в описании найдете, приходите, если что, я буду повышать цену, потому что я вот эту цену ставил, когда выпущено было всего там 5 модулей, а сейчас уже их много, да, 5 модулей, если посчитаем, ну или 5, сколько там было, посчитаем, 1, 2, 3, 4, 5, 6, 7, ну не считаем, 7, 8, 9, 10 модулей.
11, 12.
Ну, окей, было штук 15, может быть, выложено.
Сейчас пайтест это 29.
Это уже 29, и он еще снимается.
Тут еще 10 уроков будет или... Короче, тут 19 или 20 занятий будет, я еще точно не решил.
Вот.
Так что, если вдруг интересно, приходите.
По всем вопросам отвечу в чате или здесь.
Так, а мы перейдем тогда к теме.
А, еще вопрос.
Предсторен смог найти работу благодаря твоему видео, в том числе благодаря за труд.
Круто, очень рад.
Класс.
Мне прям очень приятно.
В чатик иногда приходят.
Мой чатик в Телеграме.
Я тоже пишу, что удалось найти работу.
Это очень классно.
Синкайо Джанго.
Значит, пару слов про Синкайо и Джанго.
В Джанго есть поддержка асинхронщины технически.
И...
Так, вот, да, и что нам важно?
Django предоставляет интересный инструмент ASGIRef.
Давайте напишем ASGIRef.
Что такое ASGIRef?
ASGIRef — это Asynchronous Server Gateway Interface в ответ на WSGI.
WSGI — это просто Web Server Gateway Interface.
И вот.
Django этот инструмент использует, вот это он в рамках Django проекта, использует для работы с асинхроничной и асинхроничной.
У них есть async-to-async и async-to-sync утилиты, вот, async-to-sync и async-to-async.
Если у нас все запущено в синхронном виде через VSGI, то если у нас вдруг есть асинхронные вьюшки, то они через async-to-sync выполняются, вот, в Subthread.
Если у нас наоборот синхронное что-то,
то через синкту асинк оно вызывается.
И вот это выполняется в тредпуле.
И я еще пока не разбирался, в чем проблема, но прям многие говорят, что вот в джанге асинк неправильный, он через тредпул.
я не вижу, почему он неправильный, потому что в коде-то мы будем писать async, мы сможем использовать какой-нибудь Geyser, TaskGroup, сможем просто использовать синхронные API-шки, и я не вижу проблемы, то есть для нас, для разработчиков в чем разница, оно по производительности сильно хуже, но async нам, ну, хоть дает прирост, если какой-то, то нам уже достаточно.
Насколько концептуально питон обогнал мир по ML?
Что ждать от Rust?
Вот это у вас вопросы разбросанные, конечно.
Насколько концептуально питон обогнал мир по ML?
Я не знаю.
Я не понимаю вопрос.
А что значит обогнал?
А как он гнался?
Что ждать от Rust?
Ну, что его продолжат использовать, внедрять.
Он удобен тем, что он типа безопасный.
Не типа безопасный, то есть якобы, а он безопасный по типам.
Это круто.
Единственный вопрос только, что есть ли у вас время ждать, пока он скомпилируется.
Вот, поэтому, не знаю, будут дальше внедрять, не вижу проблемы.
возьми htmx прикрути к фастапе джинджа и реализуй на каком стеке и фастапе подучишь и сможешь полностью заказ закрыть с фронтовым бэком ну если вам нужно еще фронт делать то иногда просто нужно разрабатывать полностью приложение но оно будет с api то есть это может быть полноценный джанго проект который без фронтенд страничек на html но он с каким-то реактивным например фронтендом отдельно который кто-то другой пилит ну или вам же придется
или там мобильное приложение, например, то есть FrontEnd отдельно, опять же, вот, но это полноценная разработка прям приложения, вам нужно уметь это делать, работать с баз данных, там и так далее, там и тому подобное.
Здравствуйте, да, добрый вечер.
Вот.
Короче, я... Если кто-то знает, почему это проблема, то вы мне расскажите, пожалуйста.
Но пока я не вижу, ну, каких-то бед с этим.
Мы просто, ну, да, с некоторыми там особенностями, но работаем с асинхронщиной в Django.
Раньше говорили, что у Django плохо, потому что асинхронщины нет.
Вот асинхронщину ввели, ну, в каком-то виде.
И это все равно тоже почему-то плохо.
Ну, окей, ладно.
Пока пощупаем вообще, что к чему.
И вот этот ASJRF, он используется теперь вот в комплекте идет с Django, ну, доп.
пакетом тянется.
И вот он Sync2Sync использует для...
вызов асинхронных действий в асинке, чтобы не блокировать асинхронный контекст.
У меня к вам вопрос.
Согласны ли вы с тем, что Джанго делает из Python декларативный язык из-за его суккурной абстракции?
Из Python нельзя сделать другой язык.
Еще скажите, что MyPy делает из него статически типизируемый язык.
Нет, не делает.
MyPy прекрасно проверяет типы, но мы можем городить все, что захотим.
Берем typeignore, ставим, берем union делаем, там будет происходить вообще какая-то дичь, как в Python принято.
Поэтому не вижу проблемы.
Это раз.
Во-вторых, Django готовые всякие Class-based views, про что я тоже эфиры делал, мне кажется.
Ну, у меня запись даже.
У меня есть ролики на канале про Class-based views.
Прекрасный инструмент, и то, что можно декларативно сделать, это, ну, просто объявив классы, указав нужные связи, это потрясающе, по-моему, это очень круто.
Нет, смотрите, нет задачи писать код, есть задача решить какую-то фичу сделать, то есть задачу решить.
Почему сейчас?
популярные вообще нейросетки для того, чтобы помогать код писать, потому что они ускоряют процесс набора, потому что процесс набора не стоит денег, ну то есть он наоборот обратно пропорциональный, чем больше мы пишем код, тем менее выгодно, потому что если за один месяц разработчик сделает что-то, что за другой месяц, что за два месяца сделает там го разработчик, да, на питоне мы сделаем быстрее, чем на го, то возможно эта фича будет выгоднее,
Вопрос только в том, что потом, например, из-за там некоторых особенностей Python и Go что-то может быть легче поддерживать, что-то сложнее, и поэтому тут нужно оценивать, нам важен быстрый старт, быстрая разработка фичи, или чтобы оно там было как-то очень строго затипизировано и так далее.
То есть почему веб не пишут на расте, хоть и можно.
Писали же на плюсах.
Ну, потому что это сильно дольше, чем взять на Python-чике пару строчек написать на Django, и все готово.
О ком HTMX на фронте речь?
Как будете JS рендерить динамически?
HTMX – прекрасный инструмент.
У меня на канале на 4,5, на 4,20 ролик.
Посмотрите, пожалуйста, кому интересно делать динамический фронт.
Спасибо за ответ.
Пожалуйста.
В общем, что нам дают...
В джанго.
Нам дают... Так, здесь что-то не то.
Где здесь async?
Нам... Где async middleware?
Вот я перешел.
Async middleware.
Интересно.
Сохрана support.
Вот это здесь?
Да, похоже, вот здесь.
Короче, middleware мы сейчас с вами...
Делать не будем.
Тут, видимо, есть какие-то адаптации еще, чтобы я синхронно и синхронно работала в middleware.
Но мы сейчас с вами посмотрим на ключевое.
А ключевое это у нас... Ну вот, мы можем любую синхронную функцию выполнять.
И вот, какие у нас...
А декораторы могут быть использованы с синхроничной и асинхроничной.
Ну, CSRF Protect, ну, тут вообще странно было бы, если бы нет.
Require всякие тоже окей.
И вот, запросы в базу данных.
То есть все запросы в базу данных, которые мы делаем, они теперь с...
Ну, смотрите, у нас есть асинхронный тратор, то есть мы можем сделать for async for author in там объекты и идем дальше.
И у нас есть await на получение объекта, вот a first, ну и так далее.
Тут много других асинхронных методов.
вот, a-create, например, a-save, ну, вот так сделали, просто везде префикс a добавили, и вот написано, если у нас есть какой-то синхронный код, лучше его через sync2sync подождать, вот, нам тут рассказывают, как это все классно, так, кстати, смотрите, handling disconnect, меня кто-то на эфирах несколько раз спрашивал в чате и на эфире спрашивал, как вы обрабатываете дисконнекты, может быть, cancelled error и в фастапе вот так можно обрабатывать, я не знаю, надо ли,
Ну-ка, async and consult error По стапе Может быть, есть такое?
Не знаю, может быть Короче, вот в Django есть вот такой способ Значит Так Что у нас еще?
Что у нас еще?
Секунду, если мы запускаем не в IPython, мы можем выключить автоэйвейд, ла-ла-ла.
Если вам точно надо выполнять синхронный код из-за синхронного контекста, можешь выключить Django Allow Async and Save, но нам не надо это сейчас.
Так, адаптер, это мы уже посмотрели, Async to Async и Async to Async.
Все, да, получается так.
Получается так.
В общем, что мы сделаем?
Мы сейчас напишем приложение.
Сейчас у меня есть пара мыслей, но, может, вы докинете какие-нибудь идеи.
Что мы вообще в целом можем сделать?
Сейчас отвечу на вопрос.
Прикольная позиция.
Думаю, зависит от сложности проекта.
Если чуть сложнее, чем круто, начинается уже императивный подход.
Да, абсолютно точно.
В Django вот базовые вещи делаются супер легко, потом начинаем лезть внутрь и становится чуть грустнее.
Мы с вами видели это, например, на предыдущем эфире неделю назад.
Django REST Framework, правда, но он же в духе Django.
И main-to-main отношения менеджить через Django REST Framework
Никак.
Ну, то есть, смотрите, у меня была мысль, как можно сделать.
Можно сделать отдельный ресурс, который будет чисто для ассоциативной модели, то есть, которая through используется.
И вот на ассоциативную модель можно сделать отдельный API-ресурс и там прокидывать нужные параметры.
Но это управление уже связью, а не добавить к фильму жанры.
То есть, вот такого там нет.
Хотя в Django-админке можно money-to-money использовать спокойно.
То есть, в DRF просто не дотащили такое.
так в целом так есть мне лично не очень комфортно писать код на фреймворк когда у него относительно высокий уровень абстракции ну пишите на низком уровне абстракции просто вам за это платят или нет вам платят за то чтобы вы писали на каком-то уровне абстракции или за готовую фичу готовая фича на джанго будет сильно быстрее базово базово потом
начнется дичь.
Я столько дичи встречал на джанго, вообще капец.
Там думаешь, лучше бы фласк взяли, раз вы так издеваетесь на джанго, вам охота не джанго писать, а вообще вообще все свое.
Зачем вам тогда вообще джанго изначально?
Потому что можно было на фласк гораздо проще наградить столько дичи и с алхимией сделать, а не с джангоором.
Было бы классно.
Так, давайте объявим, что мы делаем.
Мы берем...
джанго стартуем проект и в этом проекте нам нужно хоть как-то воспользоваться асинхронщиной мы хотим какой-то плюс от асинхронщины если мы сделаем просто views то есть представление асинхронными мы конечно получим прирост чисто теоретически когда мы будем нагружать приложение но давайте так будем честны с собой когда вы в последний раз писали реально высоконагруженное приложение когда вы в первый раз писали когда вообще писали и поэтому
Давайте сойдемся на том, что асинхронщина нам нужна немного по другим причинам.
Во-первых, это сейчас модно.
Во-вторых, некоторые инструменты нам удобнее использовать в асинке, потому что даже если у нас небольшая нагрузка, но нам, например, нужно подождать две опишки независимые, то зачем нам ждать их по очереди, если мы можем подождать их одновременно?
То есть мы делаем, ну, конкурентно, да, не одновременно, а конкурентно.
Делаем запрос на первую API, делаем запрос на вторую API и с этим работаем.
То есть давайте на этом сойдемся.
Я поставлю сразу же себе парочку инструментов.
Это Django и я создаю данный проект.
Это у нас будет Django Sync.io.
Что мы будем делать?
А что за проект у нас будет?
Вот, кстати, что-то я не придумал.
Так, есть ли у нас какой-нибудь Movies API?
Нет.
Ищем.
Не хочу API key.
Free movies API.
Free movies API.
И я хочу какую-нибудь API.
Так, опять API key.
Что это нам вообще дает?
Вот.
Так.
Free, но с ключиком, да?
Movie.
Прекрасно.
The Movie DB недоступен.
Мне, считай, хотелось.
Сегодня маленькая нагрузка, завтра проект взлетит, нагрузка большая будет.
Что мы будем делать?
Масштабировать горизонтально.
Соблюдаем 12 факторов.
У меня на канале есть ролик «12 факторов».
И если соблюдать 12 факторов, даже если первые 6-7 соблюдать, 12 factors, 12 factors, то мы просто масштабируем это горизонтально, то есть делаем второй экземпляр, и все, у нас нагрузка распределена.
Все.
Это на любом синхронном приложении работает.
Так что не надо говорить, что асинхроничное — это вот спасение.
Так, переходим на русский, чтобы всем было понятно.
Русский.
И...
Читаем.
Так, код веб-базы.
Одна код веб-база, следующая стим-контроль версии.
Понятно, да.
Зависимость явно объявлять, изолируйте.
Ну, ладно.
Можно скипнуть, это не влияет в данном случае.
Конфигурация, ладно.
Ну, env, это environment variables.
Дальше, сторонние службы.
Это подключаем ресурсы.
Окей, ладно.
сборка релиз выполнения да окей не влияет процессы запускайте приложение как один несколько процессов не сохраняющих внутреннее состояние stateless вот stateless это шестое правило шестое правило tell factor app и если вы соблюдаете это правило то вы можете горизонтально масштабироваться и дальше мы экспортируем через привязку портов параллелизм вот масштабируйте с помощью процессов запускаем два процесса отдельных stateless и у нас все прекрасно работает
Что тут еще?
Аппаритет разработки, да, чтобы у нас одинаковое окружение было.
Так что, ну, не аргумент, ваш вопрос не аргумент.
Ну, в смысле, вопрос, я на него ответил, тут нет сложного ответа какого-то.
Вот просто масштабируем горизонтально.
Так, ну как раз асинхроничный решает проблему конкуренции межшими усилиями, так что не сказал бы, что модно скорее полезно там, где это надо.
Я как человек, который на асинхроничный пишет с 17-го года, то есть если 17-й тоже считать, а этот еще не считать, то это сколько, 3 плюс 4, 7 лет.
более семи лет, пишу на Async.io.
Я чуть-чуть навиделся, насмотрелся.
Я не согласен с тем, что решает проблему конкуренции меньшими усилиями.
На моих тестах, на приложениях, с которыми я работал,
точнее как на моих примерах которые я делал и кстати это сравнение async async у нас тоже в курсе будет прирост 20-30 процентов в лучшем случае 50 процентов только учитывайте что это прирост не всего это прирост если у вас есть долгие запросы это я делал нарочно очень долгие запросы в сеть и
Это экономия на сервере, который стоит, например, 200 рублей в месяц, а будет вам стоить, допустим, пропорционально он дороже, 300 рублей в месяц, если вам надо, ну, то есть если вы не получили прирост от асинхронщины.
Ну окей, а сколько стоит ваше время как разработчика?
Так что нет, я все еще не считаю, что асинхронщина в данном случае решающий фактор.
Не значит, что асинхронщина вообще не нужна, есть от нее смысл, и в том числе это удобство разработки в некоторых случаях, хоть и усложняет разработку тоже.
Так.
Сколько-то еще.
Movie API.
Давайте.
Fake User API.
Вот так.
Так, JSON Placeholder нет.
У нас есть Random User Generator.
Вот.
И мы можем сюда сделать запрос какой-нибудь... Какой-нибудь запрос...
Так, API, тут мы получаем полностью информацию, а если я хочу получить что-то конкретное, я хочу просто какой-нибудь прикол, вот асинхронично, что-то мне в голову ничего не приходит, а тут ничего больше нет, да, а нет, email, ну да, тут все просто приходит разом, да, тут подробности есть какие-то, documentation, вот, пожалуйста, how to use,
А вот gender female, вот password, upper, lower.
То есть мы можем передавать дополнительные параметры.
Нет.
Что я хочу сделать?
Давайте, знаете, что сделаем?
Возьмем occurrences API.
И возьмем... Что я хочу сделать?
Смотрите, у нас есть Яндекс.
Заходим на Я.ру.
И давайте представим, что мы на бэкэнде все это рендерим.
Рекламу мы, конечно же, всовывать не будем.
Но вот здесь есть погода, курс валют.
Ну, биржа, не так важно.
И сделаем, например, запрос погоды и курса валют для того, чтобы отрендерить в шаблон.
То есть у нас будет преимущество от асинка, что мы их через асинка.io гейзер можем подождать.
Все, в общем-то, весь прирост...
с базы данных, а, и получить еще из базы данных текущего пользователя и отобразить его информацию, то есть мы засовываем кучу задач, вот так, делаем их не по очереди, а конкурентно.
Можешь подсказать темплейт, репозиторию, структуру, которую используешь для новых проектов?
Нет, ну, есть мой, если вам нужно что-нибудь интересное, как базовый проект...
то посмотрите на фастапе BaseApp, который я делал в ролике.
Базовое приложение фастапе на канале тоже есть.
Давайте я закину в чат, если у меня сработает с компьютера.
Так.
так вот это мой репозитории ну вот так более-менее прям так я как-то вижу проект так значит что мы делаем дальше мы берем тогда создаем просто наш home page давайте персонал и
И у нас будет Personal Site наш Django проект.
И Homepage сделаем наше приложение.
Значит, я открываю терминал и пишу uv init.
Дальше мы делаем uv add... Нет, подождите, давайте мы сначала gitignore заполним.
Напоминаю, что gitignore мы заполняем так.
Пишем python gitignore.
Игнор, переходим на GitHub, gitignore, копируем отсюда, переходим в gitignore, заменяем все содержимое, говорим PyCharm, тоже игнорим ID, и теперь мы коммитим только gitignore, говорим, что это initial commit.
не шел комит крейт гид игнор пометим все отлично благодарю пожалуйста а так дальше мы project да ладно давайте напишем просто и нет нет юви project теперь
Я иду в терминал снова, пишу uvadd django и я возьму httpx для запросов опишек.
Все, есть.
Так, активируем black.
Black у меня глобально настроен, поэтому я иду просто в...
black говорю глобально пожалуйста вот его мне все всегда применяй и погнали что мы делаем мы инициализируем джанго проект для этого мы пишем python минус m джанго старт project personal сайт да надо с underscore конечно же каждый раз ошибаюсь
А что для RedLimit предпочитайте?
Пишите сами, используйте что-то готовое, ставите на уровне инфры.
На уровне инфры предпочтительно, чтобы приложение не занималось этим.
На уровне приложения тоже можно, кстати, вот по Telegram-боту выйдет ролик, ну как, я его еще не снял, но он уже запланирован, будет, короче, летом, давайте без точных сроков.
А может не будет.
Вот давайте так, чтобы не было, что я обещал.
Короче, не будет, но если вдруг будет, то про rate limit поговорим.
Можно и в приложении хранить, но это нарушение шестого фактора в fail factor app.
И желательно складывать все-таки не в память, а в Redis какой-нибудь хотя бы и оттуда брать.
Вот правила, ну, текущие там кэши по rate limit.
Так, мы делаем дальше что?
Мы переходим в personal site.
И пишем, да, пометим сразу же его как mark directory s, sources root.
Давайте мы сразу же скажем, что мы установили зависимости.
Обязательно отмечаем как группировка p directory.
Кстати, наверное, надо покрупнее сделать, 150%.
Окей.
UV lock.
Вот я говорю, что install django and...
int httpx дальше мы инициализируем джанго проект то есть у нас будет вот это добавить джанго проект просто проинциализировали менедж пай туда же и нет джанго project и теперь теперь хочу такое и
Почему он меня несколько раз пропускает?
Теперь мы стартуем новое приложение.
Значит, я пишу python managepy startapp, например, home page.
То есть это будет у нас главной страничкой.
Ну, почему нет?
Сейчас начнем с этого.
Может, что-то интересное сделаем еще.
Добавляю, говорю, что мы проинциализировали приложение, только сразу же в настройках укажем apps, копирую, правой клавишей мыши, копия, референс.
Ну, знаю, что у вас там немного не видно было, но ладно уже.
И подключаем.
Все, сохранили.
Да, нам надо будет потом Django еще запустить в асинхронщине, но сейчас проверим просто в асинхронщине.
Так, и для этого мы напишем commit для того, что мы сделали уже.
Развернем, посмотрим, что мы в settings указали.
Да, нагенерировались стандартные файлики.
И я говорю create new app.
И теперь... Так, у нас есть user.
И мы будем его...
А, он у нас подгружается уже в авторизации, то есть это неинтересно.
Пользователь текущий у нас подгружается в авторизации, но, например, профиль пользователя, давайте у нас будет на homepage профиль пользователя, мы сделаем связку с пользователем.
Тогда я говорю о homepage, у нас тут есть, ну давайте здесь же в models, мы скажем class profile, профиль пользователя.
Мы связываем сразу же с...
текущем пользователем, то есть говорим user у нас, one-to-one field.
И, кстати, мы можем сделать сигнал ловить на создание нового юзера и создавать ему новый профиль.
Давайте мы это сделаем.
Для этого мы делаем pre-save, post-save.
И говорим.
Так, пусейф это сам сигнал.
Сейчас, секунду, как мы его используем.
Пусейф джанго.
Что-то вылетело из головы.
Примерчик, можно мне?
Прессейф, может здесь?
Можно мне пример, пожалуйста?
Сигнал я знаю.
Я знаю, что этот сигнал есть.
Я хочу пример.
Пример.
Инстанс, референс, модуль референс.
Сигналы, вот.
Callback, connect, бла-бла-бла.
Я не хочу setting changed, я хочу...
Сигнал.
Вот я беру сигнал.
Connect.
Но я хочу его как декоратор.
Вот ресивер.
Вот ресивер нам нужен.
И потом сюда сигнал.
Вот.
Значит я говорю ресивер.
Сюда передаю по сейф и сендер.
Вот у нас аут юзер.
И мы говорим Create User Profile.
В общем-то, тут нам подсказывает внезапно хорошо.
Если только что созданный, то мы новый профиль пользователя создаем.
Все.
Нам говорят, что PyCharm сожрал слишком много памяти.
Ну, ладно.
Что мне сделать?
Так, нужно ли здесь что-то еще?
Так.
И...
Мы делаем... Так, Analyze.
Нет, давайте я посмотрю просто у себя в системе, что жрет столько.
Нельзя же столько жрать.
Я перезагружал комп.
Ну, не сегодня, вчера.
У меня в патчарме ничего не открыто.
Тележка открыта.
Мало ест.
Патчарм.
ОБС-ка прям очень много выжрала.
Но это же просто стрим.
Раньше нормально было.
Ну ладно.
Так, значит, когда у нас сдаётся пользователь, ему сразу же сдаётся профиль.
Но нам пустой профиль неинтересно.
Давайте мы сделаем... Что?
Burst City?
в ноте birthdate, null, true, blank, true, ok, давайте city просто, char field, то есть где живем, null, false, default, поставим пустую строчку, так, жрать жрью, да, он жрет, так, и bio, например, да, будет text field, null, false,
Default тоже пустая строчка.
Вот так.
То есть мы говорим, что есть профиль пользователя, и мы его будем как раз-таки подтягивать на нашу страничку.
Окей, профиль пользователя создаем, и давайте мы сделаем новую миграцию.
Для этого мы пишем python managepy.
Для начала, кстати, да, нам нужно синхронное взаимодействие с базой.
А нам для этого синхронный движок нужен, или оно все будет и так работать?
Очень интересно.
Здесь синхронно сработает.
А про синхронный движок ничего не сказано.
Ну, PSI-KPG поддерживает Async.
Джал кушать просит.
Пусть кушает.
Памяти-то достаточно.
Так, Django Async.
Давайте, Django IOS QLite.
Сразу же пойдем туда, что меня интересует.
Django IOS QLite.
Джанго.
Мне надо джанго.
Почему джанго не включено?
Где?
Где?
Окей, асин кайон, асин кпг, давайте так, может никто не делает, где у нас джанго, я не понимаю, а почему джанго это ничит, мне нужно джанго, его в кавычки надо брать или что, плюсик раньше был на обязательный
Синг ПГ, но это вот тогда, когда-то.
В далеком... Вот, плюс один.
Что плюс один?
Поселилась алхимия.
Зачем нам анти...
Псайк ПГ-3 уже асинхронично поддерживает.
Ну вот, если я сейчас захочу асинхронично, то как у меня это будет работать?
Мне надо Псайк ПГ-3 поставить.
Он поддерживает асинк.
Но я не понимаю.
Ну, давайте, давайте.
Асинк Айо, Ди Би, Псайк ПГ.
Так.
Еще есть psqlpy, а зачем, если есть psycpg и asyncpg?
Так, и functions cause...
Я не понимаю.
Да, блин, мне не важно, что тебе интересно.
Я хочу понять, нам нужно асинхронный движок подключать или нет?
Почему этого в доке нет по Django?
Давайте еще раз.
Нет, просто давайте асинхронный саппорт.
Еще раз.
Дейта бейс.
Коннекшнс, коннекшн макс.
Нет.
Нет.
Все равно синхронный используется движок.
Я не понимаю.
Серьезно?
Не понимаю.
Реально синхронный движок используется?
Я думал, асинхронный надо подключать.
Типа, асинхронный, ну, сэкпг, да, третий, вот, работает.
Давайте Python ManagePy.
Мы же в прошлый раз подключали Postgres.
Давайте мы подключим снова DRF.
У нас был Movie Catalog.
Возьмем отсюда данные.
Ну как данные, а конфиг.
Это Docker Compose.
Вставим сразу же сюда.
Да, добавить, пожалуйста.
И Movie Catalog был Settings, где мы указывали подключение...
Вот такое.
Databases.
То есть мы используем PsychoPG.
Надо только его поставить.
Здесь Binary у нас был.
Да, поставим Binary.
Да.
PsychoPG Binary.
Да, тоже поставим сейчас.
Значит, нам нужно пойти в Settings.
Сказать, что у нас тут Database.
так getenv мы импортируем и берем psycpg binary устанавливаем значит я делаю uv add psycpg binary все поставили вот здесь у нас будет работа с postgres надо только его запустить docker compose up-d pg мы вот pg почему пуленка мы же его запускали не так давно
странно ну ладно вот мы его запустили все сейчас будем работать с подкосом где-то кстати встречал что под капотом джанка просто async в sync переводит и дальше на трейдах видимо поэтому нет сохранных движков под джанку но да и мы это в самом начале эфира смотрели что там как раз таки происходит async sync но взять ту же алхимию там другой инструмент там гриллент гринлет используется для запуска но
Там асинхронный движок нужен для асинхронных действий.
Я не понимаю, здесь синхронный движок все равно нужен для асинхронных действий.
Тогда как будто бы еще меньше прикола от асинков джанга.
Ну ладно.
Так.
Что мы делаем?
Мы запустили.
Давайте мы все это закоммитим.
Я скажу, что мы... Давайте поставили PsychoPG.
Install...
install psych.pg дальше мы говорим docker compose for pg
for p.g.
дальше у нас models не трогаем вот конфиг settings for p.g.
settings for p.g.
дальше models это мы сейчас проверим перед тем как мы моделька вообще мигрируем нам надо мигрировать все основное python-manage-py migrate основное мы мигрируем и
Все, окей.
Так, хорошо.
Дальше что мы делаем?
Мы проверяем подключение к базе.
Идем в movies-каталог.
Ой, это я зря.
Давайте дропнем.
Я сделаю так.
docker-compose down-v То есть мы дропнем и volume тоже.
И у нас предложение будет personal-site.
Все, запускаем заново базу.
Заново делаем миграции.
Он еще не подключился.
Смотрите, вот сейчас подключился.
Нет, еще инициализируется.
Первый раз база долго стартует.
А вот сейчас нет.
А, потому что у нас сама база-то failed.
Вот мы из каталога, да, это я гоню, гоню просто так.
Вот, и теперь...
Все, успех.
Значит, подключаемся.
Базу данных.
Давайте вот так сделаю.
Здесь создаю новое подключение.
DataSource.
Пишем просто Postgres.
Выполняем подключение.
Database у нас PersonalData.
сайт паспорт указали приложение app try this connection все окей сохраняемся говорим до после с дефолтный закрываем потому что мы не закрылась здесь мы разворачиваем public tables вот таблички есть погнали теперь делать свои значит для этого для того чтобы делать свои мы делаем новую миграцию смотрим да давайте обновим сначала что мы тут успели сделать и
Models не трогаем, Settings трогаем, Add трогаем, Update, DB Name.
Вот у нас есть табличка новая.
Ну, мы какую-то табличку придумали.
Делаем python managepy makemigrations.
И да, давайте, пока мы это не сделали, сразу же мета укажем.
Класс мета.
Ordering.
Ну, на самом деле, это только нам нужно будет для админки.
Ну, пусть вот будет по ID.
makemigrations.
Смотрим на миграцию обязательно.
Homepage, Migrations, Initial.
И мы видим, да, действительно, у нас профиль ID, Biotate, City, ну да, City Bio и User121.
Все окей, мы с ним связались.
Да.
Так, окей.
Это сделали.
Угу.
Вот он.
Да.
Все.
Все устраивает.
Делаем migrate.
Окей.
И у нас теперь должна быть табличка новая.
Смотрим.
Homepage.
Профайл.
Вот мы видим.
Бац.
Табличка есть.
Погнали.
Согласны с тем, что у нас все окей.
Сохраняйте в git.
Историю.
Мы пишем create profile model.
Теперь я хочу создать новую запись.
У нее должна сразу же создаться профиль.
Давайте мы проверим.
Идем.
Давайте только в админку сначала засунем.
Идем в админ.
И говорим админ.
Да, давайте, кстати, скажем, что у нас джанго проекта.
Потому что мы можем Django.
Вот, enable Django support.
Только нам надо project root указать.
Вот у нас project root.
Copy path reference.
Absolute path.
Указываем project root вот здесь.
А вот тут указываем путь к settings.
Почему-то вставить не дает.
Ну-ка, если apply, не дает вставить.
А если я открою, вот можно здесь выбрать settings.
Окей, выбрали.
Почему вставить не дает?
Непонятно.
Сохраняем.
Все окей.
Вот отрезал все Django.
Мы видим моделька даже уже видна.
Все окей.
И мы идем в...
админ пишем админ пару файл лист дисплей что стал в профайле да давайте возьмем профайле у нас юзер бюджет ну короче все выведем юзер и
дальше у нас бердейт сити и bio указываем эти свойства лист дисплей лист дисплей links
Да, пусть так и будет.
Пока остальное не настраиваем.
Все.
Окей, есть.
Если мы теперь хотим попасть в админку, нам нужно сделать python managepy create superuser.
И нас спрашивают, а как будем звать?
Говорю, админ, email нет, пароль супербезопасный.
Мы говорим, что мы согласны на супернебезопасный пароль.
И можно запускаться.
Запустим сейчас просто в dev-режиме Django без учета асинхронщины.
Для этого мы пишем python managepy run server.
запускается девелопмент сервер не используя продакшн я говорю ладно и перехожу все здесь все окей у нас даже призумлено и я делаю переход на админку мы здесь заходим от админа и видим что у нас есть профайл у админа есть профайл есть у админа есть свой профайл можно ему завести что он 1970 0101 то есть старт эпохи просто по приколу сейф и вот у нас сохранился вот у него 1 января
70-го года ну соответственно сети можно указать сервер bio админ of the project ну не обязательно заполнять но просто сейчас для примера нажимаем save все есть
окей сити кстати можно было бы и foreign game сделать ну ладно кто там что напишет да единственно что не хватает string метода для профайла string метод для профайла будет string например от юзера может ли его не быть может но мы сделаем просто dev string возвращает string и мы делаем так мы делаем return string от self user вдруг юзера еще нет мало ли хотя должен быть но вдруг еще вот нет
Окей.
Мы можем пройти в админку и перейти к админу и сказать, что мы обновили ему био.
Сохраняем.
Бац, нам говорят, да, profile-admin was changed successfully.
Все, окей, работает.
Мы пока что ничего асинхронного не сделали, но пора бы.
Что нам надо сделать, чтобы стало асинхронно?
Нам надо добавить какой-нибудь view, в котором будет асинхронично.
Давайте только мы текущие изменения сохраним.
Мы говорим, что мы...
говорим add strmethod for profile-model и add profile-model to admin теперь теперь мы делаем view представление как мы сделаем view мы сделаем это через
TemplateView.
А у нас асинхронный getContextData есть.
Класс.
TemplateView.
И я хочу сделать def a getContextData нет.
Ну-ка.
Нет.
А где асинхронщина?
View is async.
Подождите, давайте пойдем внутрь.
Ммм.
Давайте мы возьмем... Что-то... Интересно.
Что-то я думал, что будет проще.
View.
Говорю, View, Джанго.
Что тут у тебя внутри?
Методы такие-то.
View из Async.
Есть автоматическая проверка.
Он проверяет, если хоть один метод в... Да, вот такой.
То false.
То есть, если есть такой метод, то...
А, то если коррутин функция есть, почему options не считается?
Ну ладно.
Если коррутин... А, ну то, что мы ее сами вручную не обрабатываем.
Если коррутин...
А, то есть здесь проверяет, если либо все синхронные, либо все асинхронные.
Вот и все.
То есть должно быть, если есть какие-то хендлеры, то либо они все асинк, либо все синк.
Сравниваем с первым.
Почему первый берет за основу?
Ну, потому что так получилось.
Так.
Значит, у нас есть асинк методы, которых здесь нет.
Это методы типа get.
Агет.
И вот такое вот.
А, нет, гет сам по себе асинхронный.
Нет, агет.
Просто гет делаем asyncdef.
Окей.
Asyncdef.
Как идея называется?
PyCharm.
Единственная нормальная среда разработки для Python разработки.
Такс.
View, Setup.
Я не понимаю, GetContextData будет... Так, TemplateView, переходим к нему.
Давайте мы посмотрим Views, TemplateView.
Get здесь синхронный, и, соответственно, GetContextData синхронный.
А давайте, знаете что, начнем не с класса, а с функции, с View функции.
Вот так.
Нам же можно сделать View функцию асинхронную.
То есть это у нас AsyncDef.
get home page request принимаем подсказываем себе что тысячи request вернемся переспонс значит мы делаем return рендер передаем сюда request как request дальше и
Template name.
Ну, укажем.
Homepage.
Home.html.
Контекст сейчас подготовим.
Вот у нас будет контекст.
Контекст.
Давайте начнем с этого, а потом пойдем смотреть, какие там встроенные нам позволяют творить всякое.
Значит, начнем с того, что мы просто отрисуем этот шаблончик.
Значит, нам надо его сделать.
Мы идем в текущий ап, текущее приложение.
Создаем папочку templates и в ней папочку homepage, то есть делаю directory.
Templates.
А home page.
Templates пометим как mark directory s.
ArcDirectRest Template Folder.
Template Folder пометили.
Ну, должны быть Django-шаблоны, но на всякий случай проверю.
А то, я помню, я вот записывал, когда курсы еще там для других площадок, я... Короче, вот здесь вот иногда все равно выбиралось Jinja, хотя, ну, в старых версиях по Charm, хотя мы в Django-проекте.
По Charm у меня по-другому выглядит, кстати.
Переключить на новый вид, возможно, вы давно не обновляли.
Либо я давно не обновлял, но у меня версия, которая выходила в феврале, по-моему.
Как же NoVim?
А что NoVim?
Мне надо код писать, а не заниматься настройкой.
Если вам охота заниматься настройкой, берите хоть VS Code, хоть NoVim.
Версия 2025 года.
Версия 2025 года, но версия 2024.
Что-то там.
Точка там 4, не помню.
То есть она выходила уже в феврале или в марте, но с номером 2024.
Видимо, кто-то коммитился успеть притащить в 2024 году фиксы, профукал сроки, но выпустил 2024 версию, все равно то, что запланировал, не знаю.
Home.
Говорим, что Home у нас будет.
Шаблончик базовый нам нужен тоже.
Давайте Base HTML.
Да, добавляй, пожалуйста.
И сразу же говорим Home.
Home.
Home HTML.
И Base.
Как у нас будет выглядеть Base?
Ну, окей, давайте мы здесь укажем по... Так, мне вот это превью не надо.
Я указываю...
Здесь блок Title.
Блок Title.
Base.
И здесь будет блок Body.
Какой-нибудь навбар надо быть.
Ну, не знаю, может, если у нас будет время, еще притащу Bootstrap.
Так.
И здесь мы пишем Base Body.
Ну, это не обязательно, но я так себе помечаю, чтобы если я вдруг забуду, переопределить, то сразу же увидеть, что я забыл.
Используем Homepage Base HTML.
И я делаю блок Title.
Это у нас будет Home.
Просто Home.
Блок
body.
И здесь у нас будет h1 hello home.
Такс.
И если юзер у нас не залогинен, надо будет его налогин.
А если залогинен, то мы можем его сюда пустить.
Ну, давайте проверим пока так.
Значит, нам надо url этот создать.
Идем... Так, это пока лишнее.
Идем в...
так давайте просто так urls идем вставляем здесь говорим об об name home page url паттерн вот у нас будет home называться это мы берем views .
ну давай подсказывай from home page импорт вьюз от вьюз и
get home page name home так и назовем все значит объявили road маршрут и мы подключаем к основному urls идем сюда говорим что у нас home page path на корень просто ну получается нам даже здесь указывать ничего не надо это include нет не тот include
Homepage URLs, вот так Приложение у нас запущено Запущено, можем перезапустить на всякий случай Так, запущено, переходим Home, бац, нам говорят, слушай Что-то про home непонятно Возможно, я не прав, вот здесь надо слэш поставить А вот там, вот здесь слэш не ставить Вот так, скорее всего Обновляем, бац Говорит, слушай Корень не знаю А что такое?
Давайте мы просто проверим, что синк сработает.
Так.
Бац, бац, бац, бац.
Нет.
Так, здесь указать слэш и там указать слэш.
Фигня какая-то.
Ух, что-то я сломался.
URL patterns здесь указано.
Указано URL patterns.
Корень есть, есть.
Name есть, есть.
Вот здесь тогда тоже убрать.
Template doesn't exist.
Вот.
Это уже интересно.
Темпалет.
Ну, понятно, молодец.
Rename.
Refactor rename.
темп лейтс вот так будет лучше и запускаем заново надо перезапустить джангу запускаем до холлом есть справились дело не в осинке было дать убедим что дело не в осинке дело было в этих путях async dev сохраняем обновляем бац-бац-бац-бац-бац давайте мы в контекст что-нибудь закинем типа например items и
1, 2, 3.
И мы в homepage сделаем, например, h2 items.
И здесь мы сделаем div.
Хотя ul это и есть.
div ul for
Ты что, не подсказываешь?
Подсказывает.
Так, у нас это list item.
И здесь мы выдаем item.
Так.
Все.
Обновляем страничку.
Баз, да.
Async view работает.
То есть у нас все срабатывает.
Мы не...
Ну, не видим проблем с тем, что у нас async Все окей Так, давайте сохраним это Посмотрим Что нам надо сохранить Читаем внимательно
Значит, мы сделали шаблончики.
Давайте начнем с этого.
Create pages templates.
Опять, смотрите, темпалец.
Что ж такое?
Давайте перейдем в git.
Fix up templates.
Так, дальше.
urls view сначала вот create create async homepage view дальше urls create homepage urls urls и у нас дальше происходит connect
Connect Homepage URLs.
Потрясающе.
Что мы делаем дальше?
Мы начинаем дергать асинхронщину.
Идем в Views.
И...
Я хочу асинхроничную, я хочу, значит, давайте начнем с синка, да, давайте синк.
Значит, что мы делаем в синке?
Нам нужно получить юзер профайл, то есть, давайте так, мы не пускаем сюда юзера, если он не залогинен, надо пометить ausrequired, или как там, from django-contrib.
house, login required что ли, decorators, import, login required, вот, login required, и login required, login url у нас называется, да, кстати, надо подключить, о, сейчас это мы из доки сделаем, потому что это делается раз в жизни, ну, раз в жизни проекта, и это каждый раз надо заново вспоминать, django, house urls, connect, вот, django authentication system, подрубаем,
там десна что шаблончики придется сделать но мы сейчас быстренько сделаем мы хотим подключить urls сейчас аккаунт вот аккаунт ну и чё и где и
вот, using views вот, application views, то есть тут есть сток комплектные формочки, я не понимаю, почему меня кидает куда-то не туда все время вот, я перешел на built-in ausforms, вот где они, ausforms ausforms вот, где они, не понимаю короче, подключаем, значит мы подключаем, например, в аккаунт то есть в наш корневой urls идем, не понимаю вот, идем в корневой urls
просто чтобы не через админку логиниться каждый раз, да, не всем пользователям же в админку надо.
Вот сюда мы подрубаем аккаунт, говорим Django 3 Pulse URLs, то есть вот здесь у нас готовые логин, логаут и так далее, и вот имя у нас уже установлено.
Логин, логаут, password change, ну, короче, они на верхнем уровне у нас без своего namespace, то есть тут нет namespace никакого.
Тут единственный момент, что у нас вот этих вот папочек нет никаких, я так понимаю, но это мы сейчас быстренько порешаем.
Так, проверим.
Значит, я хочу попасть сюда, и мне говорят «Login required».
Я хочу из админки выйти сначала, потому что я-то выполнил вход, значит, меня пустят.
Я говорю «Logout».
Теперь «Home».
Я помечаю «Login required».
Идем в «Views».
Да, «Login required» хочу.
«Login required».
И «Login URL» у нас «Login».
То есть это куда нас перекидывать.
Вот.
«Login URL».
«User possess».
Нет, фигня.
«User possess».
Короче, redirect to login, вот логин URL, вот resolve URL, то есть он берет ее, а, или логин URL, ну тогда вообще даже указывать не надо, давайте лишний раз не париться, проверим только что в настройках действительно есть логин URL, логин.
но он есть где-то внутри по-моему да ну давайте мы укажем явно логин url равно логин вот так то есть это имя она будет резолвиться все логин required я повесил здесь значит я сюда перейду меня кинет на логин обновляем бац темплей данных здесь да то есть не кинула на аккаунт логин но нет шаблончик registration логин ну окей мы сделаем такую папочку
Давайте, знаете что, это касается не хомпейджа вообще, поэтому я прям здесь делаю в проекте что ли.
Прилично ли делать в этом проекте?
Нет, давайте общие шаблоны...
Так, давайте так.
Настройки у нас BaseDeer говорят где.
BaseDeer — это родитель текущего, то есть это папка, и это еще вот эта папка.
Ну, давайте здесь сделаем Templates.
Темплатес.
Правильно написал.
Помечаю mark directory as template folder.
И говорю, что теперь у нас в template.dir есть еще base.dir.slash.templates.
То есть добавляю не только app.dir, но еще и в base.dir.
Все, вот templates.
И я говорю, что здесь у меня будет как раз-таки новая папочка.
Вот я отсюда скопирую, чтобы не перепутать.
Registration.
И, по-моему, мы можем что-то админское переопределить.
Ну-ка, давайте найдем какой-нибудь registration login.
Давайте Django registration login.
Прям самим писать, по-моему, не нужно.
Так.
Да, вот extends-admin-login, вот-вот.
Вот, мы можем так сделать, поэтому я говорю здесь «login.html».
А внутри на самом деле делаю вот этот админский.
Его потом можно переопределить.
То есть по стилям там дотянуть что-то.
Но это хоть и будет выглядеть как Django Admin.
Кстати, а здесь будет написано Admin.
Если да, то надо будет это поправить.
Но это мы найдем.
Кстати, надо бы Django Debug Toolbar поставить еще, чтобы было легче.
Ну ладно.
Вот, давайте так сохраняем.
И теперь обновляем страничку.
Просто обновляем страничку.
У нас шаблон подтягивается.
Вот, Django Administration.
Да, нам надо поменять вот это.
Где оно написано?
Django Administration.
Где-то оно написано Base Site, может быть.
Нет, Base Site вряд ли.
Давайте просто здесь напишем Django Administration, поиск.
Django Administration, вот.
А, Site Header.
Site Header это что?
Это если мы сюда передаем...
Это мы где находимся?
Сейчас мне... Бейсайт все-таки.
А, это в админ бейсайт.
А, у админа свой бейсайт, понял.
Админ бейсайт.
Ну окей, просто сайт хедер укажем.
Мне не сложно.
А, нет, мне сложно.
Потому что...
Так, блок брендинг.
Где он заканчивается?
User Anonymous, Include and If.
Да, просто копируем и все.
Что мне?
Что мне стоит?
Я иду сюда.
Просто я не могу это передать отдельно, потому что в Urls, вот здесь Personal Site, Urls, вот тут у нас уже есть логин USU.
Мне либо надо самому коннектить и сюда кварги всякие прокидывать, ну, либо просто сейчас я в шаблончике переопределю вот так.
Не знаю, да что быстрее, но ладно.
Окей, отформатируем, чтобы было прилично.
Admin, Index, Url.
Вот, это у нас будет просто на хомпейдж.
Кстати, давайте это будет у нас ссылка на профайл на самом деле.
Сейчас, я вас запутаю.
Значит, homepage.urls.
Вот у нас home будет.
Это home.
GetHomePage.
Да.
GetHomePage.
У нас будет просто GetHomePage.
Даже можно TemplateView сделать, кстати, здесь.
Давайте сделаем класс HomePageView.
TemplateView.
HomePage.
HomeHTML.
Все.
Ничего больше не надо.
А мы на LoginRequire сделаем GetProfile.
GetPersonalPage.
Давайте Personal.
Хотя... Зачем мне это надо?
на главную, давайте, ладно, нет, все, нафиг, это я усложняю, это я хотел, чтобы у нас была страничка, на которую можно всем, и страничка, которая только для залогиненных, мы сейчас проверяем чисто асинхроничную, потом, если надо, это сделаем, наперед и не пытаемся оптимизировать, поэтому возвращаемся вот сюда, логин, админ индекс, урл, ну, давайте просто на корень пока что, и сайт хедер, у нас вместо сайт хедера здесь будет просто логин, вот так,
Все, готово.
Обновляем, бац, логин.
Опа, все.
Никто даже не догадается, что это из админки взято, правильно?
Вот.
Значит, после логина нас куда-то еще кинет.
Куда нас кинет?
Нас кинет на корень.
И там мы отобразим?
Да, отобразим.
Давайте сделаем вход под админ пока что.
Бац, да, все, нас кинуло на хоум.
Все, прекрасно, логин работает.
Логаут, страница не будет работать.
Кстати, надо добавить где-то здесь кнопку логаут.
Хотим ли мы этим заниматься?
page все-таки холм надо сделать прям холм дэшборд вот мы сделаем дэшборд все я придумал дэшборд значит мы идем обратно в views и обратно возвращаемся что я успел сделать в
В обратную сторону.
Как мне это вернуть?
Никак, да?
Ну ладно.
Class.
Home.
Page.
View.
Наследник.
Template.
View.
И еще раз Template.
А здесь у нас будет GetDashboard.
Ну или просто Dashboard.
То есть моя панель управления.
И вот здесь получается Context.
Давайте это будет у нас ExtraContext.
ExtraContext.
так вот а вот эту часть мы пока что никак не трогаем у нас будет дешборд дешборд html значит нам надо homepage view подключить сюда тоже это у нас будет значит дешборд дешборд и
а здесь у нас будет homepage view as view.
Вот так.
Значит, здесь будет слэш дэшборд, ну, дэшборд слэш.
Вот так.
Окей, это указали.
Значит, homepage view у нас не требует логина, дэшборд требует логина.
Все, значит, на homepage view мы можем добавить еще logout.
Значит, я добавляю здесь где-нибудь navbar.
Так и хочется уже засунуть сюда
Ну ладно, давайте у нас тут будет пока костыли на костылях.
Будет кнопочка ahref на url logout.
И мы напишем здесь logout.
Тут надо будет нам тоже страничку отрисовать.
Мы идем на главную.
Вот у нас logout.
Нажимаем.
Бац.
Не работает.
Почему не работает?
Смотрим в терминале.
У нас что-то не запустилось.
45.
Нет, not allowed.
А, потому что на logout надо сделать пост.
Это должно быть формой.
Мы делаем формочку.
Мы делаем action.
Это куда?
Как раз таки вот url.
URL.
Logout.
Method.
Post.
Здесь должен быть ssrf-токен.
Значит, мы говорим ssrf-токен.
И здесь будет кнопка.
Так, мне не нравится PyCharm.
Мне в шаблоне spaces в HTML ставят большие отступы.
Мне очень сложно с этим жить.
Поэтому...
editor дальше код style дальше html дальше вот 22 и здесь два все не надо мне ну типа зачем мне тратить время на лишние отступы так и я говорю что у меня здесь будет батон type submit логаут и
Так, ну можно было и ссылкой отобразить, но неважно сейчас.
Смотрим на главную.
Вот у нас логаут.
Да, кстати, логаут мы не всегда отображаем, а только если мы анонимы, не анонимы.
То есть if user is anonymous, то кнопку логина.
Да, мы делаем здесь url, логин,
и пишем а href вот сюда и пишем логин else что-то мы досинхронично пока никак не доберемся фигурная скобка процентик else и берем вот это все смотрим обновляем а да и давайте напишем из anonymous логин если это то мы здесь напишем welcome давайте div welcome
user давайте first of возьмем нет нет нет нет нет first of
юзер .
first name юзер .
юзер name если нет first name то юзер им отображаем вот welcome админ все окей лугаут бац да все окей ну здесь джанк администрейшн отобразилась странно что он стал в лугаут но нас это сейчас устраивает урус урус главный
здесь кантри пауз логаут логаут что говорит говорит регистрируйся логд аут то есть решишь налог out существует где-то у джанги давайте посмотрим у джанги где у нас тут вот вы сайт был логин вот давайте админский бейс сайт бейс бейс сайт и
А, это все в админе.
Templates, админ.
А, registration существует.
Ага, то есть logout существует, а вот логин не было.
Все, все окей.
Значит, мы здесь ничего дополнительного не делаем.
Мы можем переопределить со своей стороны.
Мы можем сказать, что у нас здесь, чтобы не было тоже админ.
Да, что у нас тут?
Да, вот это на админ ведет.
Home ведет на админ.
Login again ведет на админ.
То есть нам бы вот это поменять.
вот это мы поменяем home и у бэйс сайта у нас мы уже знаем как переопределить давайте мы вернемся в наш код идем сейчас чтобы уже чуть более менее прилично было и мы укажем тут логгд аут получается и
тогда лог out да так лог out html значит мы наследуемся от админского локдаут html на у нас админ до локдаут
extends admin slash logged нет где ты лежишь registration registration logged out и мы здесь переопределяем парочку штук во-первых брендинг да и
Да, это тот же самый брендинг.
Я говорю брендинг переопределить.
Можно было бы макросом, но ладно.
Логин... Нет, здесь на хоум просто.
Давайте хоум.
Дальше.
Урл вот здесь тоже на корень.
Home и логин again на логин.
Потрясающе.
Сохраняем.
Обновляем страничку.
Вот эту страничку можно мне?
А, да.
Resubmit.
Continue.
Invalid block.
Translate.
Expect end block.
Ой, я забыл end block.
Конечно же.
Давайте мы возьмем отсюда.
Где тут translate?
Вот.
End block.
Вот он у меня.
Да.
Block.
Breadcrumbs.
Да.
Нет.
Смотрите.
Кого я забыл?
Онлайн 11.
Онлайн 11.
Ну да, Брэд Крампс.
Транслейт закрыли, а...
Все, запутался.
А, translate.
Нам надо load tag сделать.
Все-все-все, туплю.
Sorry.
Ну, это как бы стандартное состояние.
Обновляем.
Continue.
Бац, все.
Locked out.
Home ведет на главную.
Home ведет на главную.
Login again ведет на админ.
Почему?
Потому что login again.
URL login.
Не понял.
Не понял.
Почему логин резолвится как... Подождите, а если я перейду еще раз на главную?
Вот здесь логин как резолвится?
Accounts.login.
Значит, у нас здесь с home все окей.
URL.login.
Еще раз смотрим здесь.
Ровно то же самое.
Он, будучи в контексте админа, берет админский.
Так мне нужен корневой без namespace.
Да, один в один.
Login again.
Вот я захожу в логин.
Вот нас кидает наш логин.
Я захожу с админом.
И он говорит, аккаунт профайл.
Зачем мне профайл?
А, ну это хомпейдж.
Да, если никуда не сказано, то куда по умолчанию редиректить?
Я не хочу про файл.
У нас такого нет.
Да.
Я хочу указать, куда редиректить после входа.
Это логин редирект URL, по-моему, называется.
Давайте посмотрим.
Я начинаю писать, мне подсказывают.
Логин редирект URL, да.
Мы говорим на хомп, да и логаут редирект.
URL тоже на home.
Давай, что мне там?
Это логаут пейдж.
Все, потрясающе.
Смотрим еще раз на главную.
Мы все еще до синка не добрались.
Логаут.
Бац, все.
Логин.
Говорит, представь себя.
Я говорю, окей.
Нажимаю логаут.
Все, даже не нужна та страничка.
Можно это грохнуть.
Давайте мы это и сделаем.
Идем в патчарм.
Грохаем вот этот логаут.
И теперь сохраняем все, что мы наделали.
И, наконец-то, делаем асинхронщину.
Значит, дешборд мы сейчас отдельно добавим.
Что-то у вас давно комментариев не было.
Все нормально?
Ну-ка, как тут обновить страничку?
Пока тишина.
Ладно, будут вопросы, пишите.
Dashboard, Home.
Так, Home мы изменили.
URLs пока что не трогаем.
Нет, трогаем.
Потому что у нас... Ой, блин.
Ладно, пока только шаблончик меняю.
Settings...
Да, это есть все.
Сохраняем.
Дальше у нас идет изменение.
Значит, хочу дашборд увидеть.
Давайте ссылку на него добавим, кстати, тут.
Где у нас тут...
home вот здесь будет ссылочка дешборд еще давайте здесь break какой-нибудь добавим ну верстка это не мое дешборд у нас будет url то есть
href мы пишем дэшборд все супер отлично и пишем url вот странно то он подсказывает то не подсказывает я пишу вот если я ставлю фигурную скобку то у меня тут уже url ну ладно и я говорю мне нужен дэшборд но он будет в homepage homepage дэшборд вот сохраняем обновляем логин давайте залогинимся
админ 123 вот и дэшборд нажимаю дэшборд бац попадаем на наш дэшборд только надо сказать что это дэшборд здесь уже мы напишем что это дэшборд дэшборд items ну пока мы не прокидывали и не надо вот дэшборд есть все окей то есть мы проверили что у нас это работает здесь дэшборд тоже написать
Готово, готово.
Все, давайте это сохраним.
Асурен, Джан, привет.
Насколько, по твоему мнению, использование асинхронного джанга нужно, если чаще всего его используется в SGI или можно как-то использовать SGI сервер с ним?
Мы сейчас будем подключать SGI сервер, тоже запустим UVCorn, но пока что из того, что удалось найти, что даже асинхронный движок для баз данных не нужен, я, ну...
Вообще, мало представляю смысла.
Единственный плюс — это вот именно сделать асинхронные вью, даже если это VSGI, но просто воспользоваться приколом, что мы можем сделать гейзер или таск-группу.
То есть вот как будто бы только ради этого.
Типа вот мы понимаем, что вот нам бы здесь, конечно, было бы удобно сделать await.
Мы просто делаем асинхронный метод get и все.
Вот сейчас что мы и сделаем.
Но это я делал тут как раз таки, чтобы был какой-то дешборд у пользователя, более-менее настоящий.
И мы подключаем дешборд.
Home у нас вот так меняется.
Create.
home page and и дэшборд и да давайте мы дэшборде кстати отобразим типа привет чувак сюда же welcome и надо на холм сделать ссылочку лишь два давайте давайте кнопку и
Баттон.
А как у нас там кнопка делается?
Я, конечно, привык через классы это все решать.
Type.
Submit.
Да, просто форму сделать.
Вот так.
Форм.
Ну, это дичь, конечно.
Лучше просто ссылочку.
H2.
A. Href.
URL.
Home.
Просто Home.
И вот мы говорим Home.
Вот, чтобы отсюда можно было перейти.
Смотрим, да, Home, перешли сюда.
Дешборд, перешли сюда.
Ну, хоть какая-то навигация.
Понятное дело, что там с Bootstrap было бы гораздо-гораздо более прилично.
Welcome Admin.
Все окей.
Говорим Commit.
И у нас тут есть наш дешборд, то есть Create Homepage and Dashboard.
Все, есть.
И наконец-то, наконец-то нас интересует уже работа с залогиненным пользователем внутри Vue.
То есть у нас здесь логин required, пользователь залогинен.
И мы хотим вывести этого юзера для начала.
В контекст мы добавим инфу по погоде, по курсам валют.
Сюда мы заходим и говорим... Что мы говорим?
Мы говорим welcome... Дальше здесь будет профиль.
HR...
Очень хочется Bootstrap.
Очень хочется Bootstrap.
Давайте... Ой, даже не знаю.
Просто мы еще на это время потратим.
Ну, давайте сейчас быстренько, как обычно, и это two hours later.
Давайте мы засунем Bootstrap.
Getbootstrap.com Потому что не могу на это все очень больно смотреть.
Docs.
Quickstart.
Берем базовый шаблон.
Вставляем сюда.
Меняем здесь только body...
и title тут добавляется на самом деле надо было просто metatext копировать но я для того чтобы наверняка вот можем сравнить что поменялось делаю так вот utf-8 ну регистр тут не важен да и все и подключаем css и js мы их подключаем вот link js нам даже сейчас не нужен пока не подключаем css подключаем вот да
Самый конец, кстати, этот линк предлагают ставить.
Ну, давайте.
Head.
Только надо тогда не потерять, что это у нас здесь голова вот тут.
И... Я вспомнил фильм... Легенда...
Как там?
Короче, очень такое кино, как там, артхаусное.
Про легенду, где рыцарь без головы.
Такая хрень.
Там просто про фразу «И не теряй голову».
Я вот это вспомнил.
Ужас.
Я с трудом домучил этот фильм.
Мне было интересно, типа, ради чего я это все смотрю.
И понял, что не ради ничего.
Просто хрень полнейшая.
Это было когда-то лет 5 назад, 4, когда он там выходил.
Так, окей, у нас теперь уже страничка будет более приличная, просто из-за того, что мы добавили базовый шаблончик, смотрим на home, бац, и уже чуть, ну, иначе, давайте так, иначе у нас, конечно же, будет body в контейнере, поэтому пишем div, говорим класс контейнер.
контейнер и мы засовываем в этот div все и бац у нас тут уже будет отступ вот прилично стало значит лугаут у нас будет уже просто кнопочкой нормальный мы для этого идем в home вот этот лугаут у нас будет класс button и button secondary и
обновляем секундарий обновляем бац вот кнопочка есть логаут отлично логин давайте тоже сделаем красивой кнопочкой это будет a class button button primary обновляем логин есть да говорим ну здесь форму логина кстати можно уже свою сделать раз уж мы взяли bootstrap но не будем тратить на это время дэшборд делаем какой-нибудь зеленой кнопкой пусть у нас будет здесь класс
Button.
Button.
Success.
Обновляем.
О, потрясающе.
Только нам надо отступов побольше.
Чего у нас не работают эти отступы?
Welcome Admin.
Все, есть дешборд.
Home.
Вот.
И здесь Home.
Ну, ссылка, ссылка.
Ладно.
Все, окей.
Хотя это в навбар лучше засунуть.
Как я не люблю, что мне надо, чтобы было нормально.
Нав.
Смотрим.
Навбар.
Вот это я просто копирую и меняю ссылки там.
Все, не трачу на это время.
Только... Очень хочется подключить это как include.
Давайте мы скажем, что это будет навбар.
Сюда воткнем.
Вот чисто как есть сначала воткнем.
Затем мы перейдем в Base.
Здесь мы воткнем навбар вот сюда в контейнер.
Над контейнером.
Include.
include home page navbar сохраняем обновляем бац есть navbar но он тут да без javascript не сработает значит надо javascript подключить ну начинается как обычно
Так, берем JavaScript, подключаем в базовый шаблон.
После, в div его надо, да, правильно я помню?
Да, нет, фу, в div, в body его надо, а в body у нас тут дальше.
Все окей, вот так мы делаем.
И теперь у нас navbar будет еще и разворачиваться, когда мы обнимем страничку, бац, нажимаем, да, разворачивается.
Теперь мы делаем его не lg, а md.
ЛГ.
Вот где у нас ЛГ.
Мы делаем MD, то есть expand MD и размер.
И дальше у нас поиска.
Тут никого не будет.
Экшены.
Ладно.
Поиск убираю.
Вот этот форм.
Search.
Да, это все disabled, но теперь на MD хотя бы будет видно, да, если вот так отзумить.
Вот.
А search что, не пропал?
Вот, пропал.
Теперь если я сделаю панельку разработчика, то все равно скрывается.
Странно.
Что-то у нас это на SM тогда тянет, не на MD даже.
MD, SM.
смотрим, бац, вот, все, вылезло, дропдаун нам не нужен, линк, вот, home у нас есть, мы в home, а вместо линка у нас будет дешборд, все, вот сюда мы засовываем дешборд, и здесь мы вставим url, дешборд, все, обновляем, вот у нас дешборд, переходим, все, тогда вот это, так, active надо ставить еще,
Значит мы делаем так Как же я не люблю With As Links Ну смотрите, короче, опять на полчаса With Мы создаем переменную Мы же можем здесь создать переменную
так джанго template create war и
Скажи, пожалуйста, есть твои контакты?
Помогаешь вопросам коллегам?
Помогаю, конечно.
Во-первых, в чатике я отвечаю.
Но если не я, то кто-нибудь ответит.
Контакты, ну вот ссылку внизу.
Кликайте в описании, ссылка на все ссылки.
И там находите чатик, находите ссылку на мой профиль.
Все открыто, все есть.
Так что, если есть вопросы, пишите.
Так...
with name равно а я а я делаю с ну ой блин with links равно и вот здесь мы делаем да вот так че так можно а списочек нельзя create variable list да нет вот as list а его еще сплитить ооо блин
джанго как же я люблю такие ограничения которые оставляют страдать что проще всего сделать template т.к.
он вот началось началось template так фильтр template
И фильтр Фильтр Ой, блин Так, идем в актуальную джангу Говорим make list И что мы с этим делаем?
Вот если мы передадим так, то у нас будет так Окей, и что?
А толку?
А толку?
А сплит?
Сплит тут нет.
Как мне сделать-то?
Реально делать свой тег.
И...
Ну да.
Ай, блин.
Я, конечно, хотел просто про синхроничную посмотреть.
Ну ладно.
Значит, мы создаем template tags.
Template tags мы создадим где?
Это у нас на homepage.
Окей, значит, мы homepage делаем.
Template tags.
Значит, мы здесь делаем имя template тегов.
Значит, это у нас будет home page meta.
Вот так, home page meta.
То есть дополнительная информация.
И мы делаем здесь тег.
То есть мы делаем register library.
И мы делаем... Это фильтр, нам нужен тег.
тег но идиотизм просто чтобы я вернул нормальный питания че списочек мне надо вот вот так вот делать кастом ты плейтекс вот simple т.к.
вот возвращаем отсюда что-то тег принимает либо ничего либо одно что-то правильно т.к.
нам прав аргумент strings or template variables
резалт автор но они могут ничего не принимать правильно а нет либо одно либо два это возвращая это фильтр а здесь у нас совсем был тег navbar navbar links вот и мы здесь значит возвращаем вот так уже парочки из холм и вот так вот у нас будет холм page холм и
И дальше Dashboard.
Но здесь подсказок нет тогда.
Dashboard.
Ну окей.
Homepage.
Homepage.
Угол вниз и для ответа.
Ну, когда знаешь, что ищешь, то, конечно, проще в доку зайти.
Так, мы берем Novbar Links, подключаем Homepage Meta вот сюда.
Идем в Novbar.
Подключаем здесь...
на лод на нет, хомпейдж мета и вот здесь я говорю for, тогда вот здесь for просто, for in navbar links да, и у нас тут будет интересно сейчас работает или нет name и link
И я говорю, вот это вот Мы сюда засовываем И сюда я пока что засуну просто URL Ну да, что тут еще?
Link А здесь name Ну, можно было бы label сделать, но ладно Name И link, он говорит Your name is not being quotes Так у меня здесь переменная
URL не принимает переменную или что?
Принимает... Что такое?
Мне обязательно именно строчка указывать?
Блин, ну идиотизм какой-то.
Не, могу реверс вызвать там тогда.
Тогда еще проще.
Окей.
Я говорю вот так.
Линк.
А к линку мы перейдем вот здесь.
Навбар линкс он не понимает.
Что значит?
Мне надо сделать with.
Ох, обожаю.
Навбар линкс.
Да, мы можем так сделать хотя бы?
Нет, я не понимаю.
Хомпейдж мета.
Навбар линкс.
Подождите.
Сейчас мы же...
Lot tag to list as my list.
Не, фигня какая-то.
А!
Tag as.
Все, здесь наоборот.
New with.
Tag navbar links.
Давайте еще раз.
Давайте так.
Navbar links.
Вот.
As links.
И мы дальше вот здесь делаем...
Да, с этой переменной работаем.
Вот.
Что-то я это давно не делал, и так больно стало.
Значит, здесь можем пойти вот так.
Да.
Линк.
Единственное, что нам надо из navbar-links вернуть... Да, только мы идем вот здесь по links уже, да?
Мы идем вот здесь тогда реверсить.
Что нам остается-то?
Реверс.
Давайте, знаете, что укажем?
navbar...
links равно вот это мы сюда вынесем это будет теплым они списком чтобы точно ничего не менять на ходу и мы здесь вернем пусть будет список for name
url.inavbarlinks.name.reverse.url.
Вот так.
Реверс.
Импортируем.
Django.utils.reverse.
Возвращаем парочки.
Все.
Готово.
Проверяем.
Ой, наворотили.
Сейчас active только проверим.
Смотрим.
Дэшборд.
Бац.
Ага.
Home page method is not registered in the tech library.
Must be one of.
В смысле?
может перезапустить надо идем в run перезапускаем запускаем заново обновляем не это обновляем вот это обновляем да о
дэшборд работает home работает неужели накрутили нам понадобится на это еще миллиард лет примерно окей все сейчас делаем чтобы светилась нужная вот нас а да все все это старое это новое значит мы убираем лишнее вот это убираем дропдаун окей оставляем пусть будет единственное что надо актив сказать что у нас active active у нас будет только если
У нас там же есть фильтр какой-то?
TemplateTag, точнее.
Или if-else использовать.
Сейчас, Django template filter if-else.
else if else это я умею а вот по-моему был какой-то фильтр который тоже мог по условию сделать вот типа вот first join вот yes no yes no вот value yes no то есть если у нас по
true и false, то у нас yes, no.
Вот нас это интересует.
Вот.
Yes, no.
Да, вот так.
Нет, это у нас наоборот.
Это у нас значение.
Я что хочу сделать?
Я хочу if else сделать коротко.
Я пишу, значит, request path равно
А что?
А, equals надо, EQ.
Ой, здесь свои приколы, да?
Нет?
Ну-ка.
Или только в if можно это?
Только в if, понятно.
Окей, if, так if, if.
Нет, давайте так.
Просто if.
Нам даже else не нужен.
if request.path равен link, то мы выводим здесь еще active.
Все.
Точка.
Смотрим.
Обновляем страничку.
Я всего лишь добавил Bootstrap.
Все.
Home.
Подсвечивается Home.
Дэшборд.
Подсвечивается дэшборд.
Прекрасно.
Мы сделали все, что нам было не нужно.
Убираем вот эту кнопочку с главной.
Home.
Убираем вот эту кнопочку.
Беры убираем.
Логаут засунем вот туда.
Значит, эту форму тоже нам надо туда.
Логин, логаут тоже в этот... Ой.
В навбар.
Чего не нравится?
If user else and if.
Вот.
Идем в навбар.
Короче, у нас в итоге занятие не про асинхроничную, а про разработку на джанго.
И вот здесь у нас справа будет... Справа напомните, как делается.
Вот, search у нас был справа.
Так.
Как у нас справа делается...
Вот.
Inline элемент с pen в bar text.
А чё, как он направо-то?
Ладно, давайте сейчас вставим, потом разберёмся.
UL.
А, после UL-а просто воткнуть у нас, да?
Будет так.
Да, давайте проверим.
Да, после UL-а воткнуть.
Окей.
Значит, формочка.
И...
Ну да, либо такая ссылка, либо другая.
Все.
Тут можно даже просто URL сделать, даже, наверное, не ссылку такую красивую, большую.
Ой, не кнопку большую.
Logout.
Вот мы нажимаем Logout.
Бац.
Логин.
Welcome.
Только надо вот это убрать.
Welcome под... Вот сюда тоже, наверное.
Давайте.
Зачем все нужно?
Так удобно для синхронщика.
Нет, просто мне скучно.
Ну как, я хотел сделать сайт, на котором... Это все не нужно для синхронщика.
Sorry.
Я просто хотел сделать, чтобы было прям похоже на приложение, в котором нам может пригодиться синхронщика.
Ну точнее, где нам может пригодиться что-то сделать.
И я в итоге ушел, как обычно, в другую сторону.
Вот так.
Вот такой я человек.
Это во всех моих материалах я рассказываю про одно, а в итоге там куча всякой дополнительной информации.
Logout, значит, вот здесь у нас будет без br, просто welcome, без welcome, админ, запятая, logout, вот так, обновляем, логин, мы заходим, админ, zinv3, админ, logout, ну здесь только надо сделать на bsp
НБСП.
Вот так.
Обновляем.
Бац.
Все.
Админ.
Даже запятая не нужна.
Обновляем.
Вот.
Все.
Админ.
Логаут.
И... Можем выйти.
Welcome.
Почему не убралось отсюда?
Потому что я не убрал.
Hello, вот, дешборд, вот, говорит, зайди-ка.
Я говорю, захожу.
Все, и вот здесь мы сейчас будем тестить асинхронщину.
Время 19.13, то есть почти 2 часа мы болтаем, и я еще не дошел до асинхронщины.
Но сейчас перейду.
Сейчас перейду к синхронщине.
Все, мы сделали отображение.
Просто какое-то отображение.
Все, у нас есть какая-то информация.
Я могу на дешборд зайти.
И вот здесь у нас будет сейчас то, ради чего мы собрались.
Только знаете что?
Рекламная пауза.
Я напомню просто для всех, что я... Если перейти в описание к ролику, то будет ссылка на все мои ссылки.
И я просто напомню, что про веб-разработку я рассказываю гораздо более структурированно в программе, на которую если перейти, то здесь можно почитать, что у нас будет.
Про синхронщину, кстати, тоже будет, но сильно больше.
никак сейчас с джангой.
И это вот то, что здесь есть в программе, то есть то, что вот именно отображается в программе курса, это все уже записано.
То есть это не то, что я планирую сделать, это уже записано и выложено до стоп-урока.
Стоп-урок мы находим где-то сейчас в докере.
Вот у нас докер.
Вот стоп-урок.
Докер уже выложен, но без домашек, поэтому здесь стоп-урок.
После стоп-урока, точнее, после того, как завтра, в общем, я выложу домашки, я стоп-урок перенесу дальше на следующий блок.
То есть эти ролики уже записаны.
То есть если вы вдруг присоединяетесь к программе, то...
вот этот материал он уже существует то есть вы по сути оплачиваете вот этот материал а новый который выходит он будет вам бонусом просто в подарок без допплаты а будет вот все что здесь написано вот все что написано мы с вами задиплоим реальное приложение разработаем на фастапе приложение задиплоим будут дипломные работы я буду их проверять будете защищать дипломные работы ну проекты точнее диплом как будто один будут курсовые работы давайте так скажем которые вам надо будет защищать
Отвечаю в чатике, постоянно отвечаю, там вопросы бывают, подсказываю.
Уже есть счастливые участники, которые учатся, и вы можете тоже присоединиться.
Это скидка, если вы просто с главной покупаете, но если вы переходите по моей ссылочке, то у вас будет еще вот тут доп.
скидка.
Вот, поэтому спешите.
В фастапе про Django тоже поговорим, по E3 UV, работа с зависимостями, про HTML-шаблон тоже поговорим.
Black Roof настраивали, MyPy уже с ним работаем, Pre-Commit работаем.
Вот.
С Redis уже поработали, скоро будем с баз данных работать.
И тесты, вот на тесты уже довольно много времени ушло.
И будет еще больше.
Вот у нас Unit Test, покрытие и PyTest.
Вот половина модуля по PyTest записана.
Там еще 10 у меня расписаны.
Я, может, еще один добавлю.
Будет в сумме 20 по PyTest, потому что очень классный модуль, там есть что рассказать.
Вот.
Так что присоединяйтесь.
Так, мы переходим наконец-то к асинхронщине, только перед этим мы закоммитим, что у нас тут происходило в нашем проекте, и тут уже у нас страшно много изменений.
Значит, смотрим.
Так, давайте connect, напишем connect bootstrap, заметьте, кстати, питон кода могло бы вообще не быть, если бы там не этот прикол с шаблонами, bootstrap create navbar, navbar.
Окей, сохранились.
И теперь, наконец-то, переходим к асинхронщине.
Значит, мы идем в views.
И вот этот дешборд я хочу сделать асинхронным.
AsyncDef.
И вот здесь мы будем брать асинхронщину.
Значит, нам нужен профиль пользователя.
Значит, здесь нам надо подгрузить профиль.
Мы говорим, что у нас будет профиль user, ну, просто профайл.
Равно.
Профайл objects get.
Request user.
Но, но, я хочу сделать, чтобы это было асинхронно, и поэтому я делаю a get.
То есть я асинхронно получаю его.
Также мы хотим сделать получение, например, курса валют и отобразить курс валют.
Давайте мы пойдем на GitHub Exchange API.
Есть классная API, она в виде static файлов лежит на GitHub.
Мы просто дергаем нужную API и получаем...
Получаем.
И, допустим, мы отобразим... Ну, сейчас захардкодим, да, не будем опционально для пользователей делать.
Что там, какой-нибудь курс к йене, например.
Почему нет?
Мы идем в...
Так, это currencies.
Нам нужно по евро, например.
Мы хотим по рублю.
Нет, по ене.
Ну да, рубль к ене.
То есть мы говорим rub.json.
Вот.
И здесь мы ищем ену.
Это jpy.
Вот.
Вот столько-то.
Ну, просто мы хотим отобразить.
Допустим.
Значит, нам нужно будет получить.
Я пока что здесь объявлю функцию.
Потом мы ее вынесем, конечно же.
asyncdef get...
давайте getExchangeRate мы принимаем сюда currency это строчка и мы вернем отсюда словарик дикт из строчек и децимал кстати говоря очень важно чтобы мы парсили такое как децимал для этого мы
Для этого мы что сделаем?
Да, мы сделаем получение.
То есть у нас будет для даты, да, latest у нас будет.
Мы говорим, что occurrences api url равно... Пока что здесь в одной строчке, в одном файлике делаем, потом перенесем.
Значит, бла-бла-бла, сюда-сюда, occurrences вот здесь мы будем делать currency.
И я говорю...
url равно currencies api url format currency currency.
Подставили.
Дальше нам приходит ответ.
Откуда?
httpx мы делаем запрос.
Могли бы сделать синхронный get, но нам нужен асинхронный.
Мы делаем async with httpx async client, as client response get.
А не надо делать async with я не помню, просто async
wish client get response да надо мы делаем так и response у нас есть теперь текст равно и выйдет response текст и мы его почему так потому что его джейсон чекам мы не сможем его нормально прочитать вроде когда response response .
джейсон сюда можно перекинуть параметры для вычитывания а что такое так давайте теперь assassin client поищем
Всем привет.
Да, добрый вечер.
Мы как раз дошли до синхронщины.
А, слушайте, просто await client get.
Окей.
Окей, response.
Response равно await client get.
Смотрим дальше.
Так, async client is client, бла-бла-бла.
Да, можем стримить, но нас это сейчас не интересует.
Логинг, нет-нет-нет, JSON.
А где про JSON что-нибудь?
JSON.
Сендинг, нет, я хочу вот вычитать JSON, вот.
Значит, helper functions, request.
Что, где JSON?
Нет, не хочу отправить, я хочу его вычитать.
Тут есть метод вообще?
Response.json, есть.
Смотрим.
JSON.lib.lots.
Ага, мы можем в lots засунуть свои параметры.
Значит, тут есть parse.float.
Прокидываем.
И говорим, что мы хотим использовать decimal.
Вот тут прям так и сказано.
Слушай, читай decimal вот так.
float numstring.
И вот он по умолчанию делает float, а нам нужно сделать вот так.
Сюда закидываем quark и говорим.
Значит, data равно response.json.
parse.float равно decimal.
Вот, пожалуйста.
И...
это мы уже можем сделать контент у нас
То есть он вычитывает его уже заранее.
Ну ладно, тогда можем вот здесь сделать.
И делаем return data по currency.
Очень важно, кстати, что мы currency на входе делаем currency lower.
Давайте проверим, как это сработает.
Получим сейчас мапу на всех и ее отобразим.
Притепринт у нас тег существует, поэтому мы укажем currencyS, двоеточие, await.
getExchangeRate на rub.
И смотрим, вот этот керосин отобразим в профиле.
Ну, пока что у нас там профиль сам никак не отображается, но мы сделаем так.
Здесь div, дальше у нас есть тег.
Нет, prettyPrint, у нас был какой-то тег.
Может, это фильтр Ну-ка, occurrences Pretty print, да Вот, и посмотрим Идем на дешборд, бац Ага, you can't call an async contest User thread sync to async А че?
Кого?
Synchronous only operation Может, мне надо уже запуститься If user is anonymous, это Ох Так, давайте думать
Каренси.
Может быть, так проще.
Какой-то пакет используется для типов?
Нет.
Чтобы ставить редактор, перестать ругаться.
Типа в джанге, я имею в виду.
Просто включил поддержку джанга в PyCharm.
Поддержка джанга есть, и я просто ее включил.
Так.
You can't call this from an async context.
You...
Context.
Use thread tossing.
Давайте, if user is anonymous...
В шаблончике.
Async Django.
Как это проверить?
How to check users anonymous 14 лет назад.
Ну, извините, 14 лет назад у меня была синхронщина.
Request user, ла-ла-ла.
Нет, не понял.
Если мы здесь в шаблончике, в navbar, сделаем if request user из Anonymous.
Вот так сработает.
То есть у нас еще и юзер подтягивается на ходу, да?
Request user из Anonymous.
Но нам тогда придется просто подтянуть его в middleware, получается.
Нам надо, может, включить middleware, как-то асинхронную поддержать.
Сейчас давайте проверим, так сработает.
Нет, говорит, тоже нельзя так сработать.
Окей, давайте смотреть, какая middleware добавляет нам этого юзера сюда.
Мы идем в house middleware, settings, session middleware, да, и смотрим.
Process request, session store, process response.
А что это такое?
Это его интерфейс.
Process response.
Где он юзера нам навешивает сюда?
User.
User.
Нет, это session не то.
Common authentication.
Вот, authentication все-таки.
User.
Где он навешивает user?
Вот он делает request user.
А, simple lazy object.
Ну, понятно.
Вот у нас и происходит вот эта вот фигня.
А, user.
Вот у нас асинхронично.
Опа.
То есть за нас подумали, уже здесь это сделали.
Просто почему-то на главной странице, блин, нифига нормально не написано.
Вот я говорю, вот я хочу работать асинхронично.
И что мне надо начать делать?
Где а-user?
На этой странице нет а-user.
То есть, ну, типа, это вообще надо догадываться.
Django пока не френдли...
В плане синхронщины.
Окей.
А юзера мы, пожалуйста, запихнем.
Без проблем.
Идем в шаблончик.
И смотрим.
Здесь мы делаем, хорошо, iUser.
Окей, у нас будет iUser.
Кстати, он будет так доступен или только через реквест?
Давайте мы на всякий случай через реквест сделаем.
То есть вот здесь оно на реквест навешивается.
Мы сделаем iUser на реквесте.
Вопрос, а оно сломается на синхронном view?
Давайте проверим.
Идем вот сюда.
Где у нас тут?
Давайте я закрою кучу лишнего и вот сюда зайдем.
Обновим.
Ага, значит, это отобразилось.
Ну, притепринт не случился, может, надо сделать пре.
Давайте посмотрим.
Это дашборд.
Вот здесь мы сделаем пре.
смотрим нет pretty print не случилось ну каждый на новой строчке но я думал что он прям еще переноса добавит стану что не добавил ok это есть переходим на холм ссылку надо убрать сюда работает здесь мы юзера проверяем ну в на в баре то есть реально нам это важно ok
Готово.
То есть мы можем уже асинхронщину использовать в джанге.
Но пока что преимуществами асинка мы не воспользуемся, только испытываем боль.
Так.
И мы идем обратно в view.
И я говорю, что у нас тут будет еще одна функция.
AsyncDev.
GetExchange.
И сюда мы будем принимать currencies.
Это будет string, но каждый из элементов.
Вернем мы отсюда list из decimal.
Нет.
Вернем мы отсюда list из type.
Нет, мы вернем отсюда type dict.
Вот.
Мы отсюда вернем dict.
dict, где строчка и decimal.
Вот так.
И я говорю currencies
Нет, currency rates.
Давайте rates.
Равно await getExchangeRate.
Но source currency у нас строчка.
И two currencies.
Вот так.
И я говорю getExchangeRate source currency.
И возвращаю просто...
currency rate for currency in rates и в currency in two currencies.
Да, только что тебе не нравится?
Двоеточие здесь.
Да, вот так.
Только two currencies у нас будет в set превращено для красоты.
Two currencies равно set two currencies.
Вот так.
Потрясающе.
По типам, конечно, это криво, но ладно.
И вот мы их отображаем.
Например, мы ищем
Из RUB в JPY.
И, к примеру, еще я хочу отобразить... Ой, что-нибудь там модное давайте найдем.
Тут есть и биткоин.
Может, мы его отобразим?
BTC, да?
BTC.
Или его отдельно по этому надо?
BTC.
Есть BTC.
Вот отобразим BTC.
Я хочу BTC отобразить просто потому, что я модный молодежный.
Yen и Bitcoin.
Как на маке работает?
На маке работает прекрасно, исключение того, что он иногда тормозит, и еще недавно, ну как недавно, в начале года, в феврале, наверное, пришлось переустанавливать систему, причем у меня с перерывом в пару недель случилась проблема с двумя разными маками.
И оба меня перестали пускать в систему.
Один я смог сбросить, потому что у меня там был отключен безопасный режим.
Я смог сбросить пароль через костыли и страдания через пару дней на личном ноуте.
Вдруг просто перестал приниматься пароль.
Короче, сломалась система.
Я тоже через боль и страдания смог там за пару вечеров скинуть пароль
На своем пользователе Зашел, но перестал работать iCloud То есть он не хотел выходить из iCloud Я Не помню как-то через Я удалил Конфиги какие-то или что-то такое Короче как-то я смог выкинуть меня из iCloud И войти больше не мог, то есть я ввожу все данные Ввожу одноразовый пароль
Просто не пускает.
Пришлось перестанавливать систему.
Ну, все, вот такой прикол.
Мак три года работал нормально и перестал вот так внезапно.
Даже два, может, работал, не помню.
Ну, три, три, три было.
Единственное, что важно отметить, я не обновлял систему после первого крупного обновления, потому что мне хватило, хватило.
Вот, может быть, мак пытался что-нибудь обновить, и он просто...
Короче, я его просто перезагружал в очередной раз, когда он начал тормозить, и он больше не пускал меня в систему.
Все, я ввожу пароль неправильно.
Я пробовал другую клавиатуру, я пробовал набирать посимвольно и считать, что я вот нажал, и оно нажимается.
Кстати, я несколько дней пытался пользоваться им после сброса пароля, и клавиатура перестала нормально реагировать.
То есть я набираю текст, и некоторые буквы пропускаются.
Особенно неудобно, когда пароль набираешь.
Короче, Mac классно, надежно.
У меня с Windows тоже были приколы, но другие.
Так, мы говорим, керосин нам руб, к, руб.
Из ROOP, точнее надо в JPY и BTC.
Обновляем страничку.
Бац, вот у нас тут теперь BTC и JPY.
Порядок нам не гарантирован был.
Что мы можем сделать?
Мы можем сделать вот так.
Я хочу тот же порядок.
Я хочу тот же порядок, поэтому...
я сделаю так, res равно, это мы закомментируем, return res, и у нас словарик в питоне, он ordered, если добавлять for currency into currency, тогда нам тут не надо, мы говорим, это даже, кстати, быстрее будет один проход, а, и там один проход, и тут, ну ладно, неважно, не быстрее, потому что у нас не comprehension, to currency rates, to currency, все, и мы возвращаем, смотрим порядок теперь, какой я хотел, нет,
Это притепринт, наверное, сортировку делает.
Я понял.
Притепринт делает сортировку, но мы сделаем без притепринта.
Идем вот сюда, убираем притепринт.
Отображаем.
Вот, да.
Теперь мой порядок нужный сохраняется.
Все окей.
Значит, это работает.
И мы хотим это красиво отобразить.
Мы идем в Bootstrap и делаем какую-нибудь табличку.
Даже группу просто.
Лист группа.
Есть тут... Вот.
Вот, лист группа.
И я говорю, что здесь у меня будет currency rates.
H3, например.
Currencies, currencies.
И мы сделаем вот так.
Но, конечно же, мы сделаем по-своему.
ListGroup.
ListGroup.
Horizontal.
Да.
На каждую строчку у нас будет horizontal.
И два элемента.
То есть у нас будет цикл for.
Currency.
Currency.
Name.
То есть name и value.
In currencies items надо сделать.
Это же словарик.
Мы идем items.
И мы говорим, что каждый из них это один элемент.
UL.
И здесь у нас будет name А следом у нас будет value Вот так И все И мы можем pre убрать Нам надо только цифры, кстати, красиво отформатировать Но сейчас посмотрим Обновляем страничку Dashboard О, currencies Почему так?
Ладно, сделаем тогда row.
Что, мне жалко, что ли?
Значит, это div class row.
И внутри каждый элемент это div class call.
А row у нас calls row calls
Нет, просто calls 2, две колонки.
Все, делаем здесь то же самое, только value.
Обновляем.
Бац.
Ну, здесь надо сделать, наверное, adjust, как там, justify right, justify right, по-моему, так.
Нет, не работает justify, ну, left не подойдет.
Нет, write.
Просто текст write, значит.
Текст write обновляем.
Нет, смотрим.
Так.
Ладно, табличка-то, табличка, чего вы?
А, нет, ну это rose, это же grid, это же есть табличка уже.
Что такое только?
Ммм.
Как бы сделать это посимпатичнее.
Еще раз давайте тейбл.
Сделаем тогда тейбл.
Раз уж такое дело.
Проволочный MX.
Давайте.
Да, они нормальные абсолютно точно.
Знаете, что мы делаем?
Мы пишем сурен хоринян
Находим ютабчик, если он загрузится Ну или идем в ВК-шку Кто быстрее загрузится Ну, видимо, ВК Ищем вот здесь вот Видео, show all Поиск HTMX И я HTMX, алло Вы че?
Вот это обидно было Не понял Не может быть, что я сюда не загружал
Очень обидно было сейчас.
Неужели?
Если я сюда не загружал, то это просто косяк, что я сюда не загрузил.
И надо, конечно же, это сделать.
Но я... Неужели я пропустил загрузку HTMX сюда?
Короче, с HTMX я знаком.
И я делал по нему большой ролик.
А его реально тут нет?
А куда я загружал HTMX?
Вот это, вот это косяк.
Это я зря.
Надо загрузить, значит, в ВК по HTMX ролик.
А так мы пишем тогда, Сурен Харинян, HTMX.
Опа, на ютабчике, пожалуйста, 4.20 длится ролик.
Так что я почти прошел HTMX.
Не целиком, конечно, но все же.
Слушайте, в ВК нет, надо это исправить.
Это очень странно.
Может, я его залил и не сделал отображение.
И я, типа, не заметил этого, но это классно, если так.
Сурен Хоринян.
Вот я иду в группу.
Сейчас я открою это в виде... Сейчас, секунду, я покажу.
Показать все.
Так, сейчас, секунду.
Ну, короче, нет, тоже не находит, точно так же, все то же самое, просто не буду показывать сейчас.
Но то же самое, если залогинится, то же самое.
Короче, нет, почему-то htmx.
Очень странно, а если я сейчас открою Telegram и найду у себя пост про htmx...
Смотрите, давайте проверим.
Давайте в живом, в прямом эфире.
Значит, пост выглядит вот так.
View.
Как тут можно?
Context.
Context это типа посмотреть браузер.
Вот.
То есть я выкладывал этот ролик в июне 24 года.
Скоро год будет.
YouTube.
Мы с вами видели, что есть.
RootTube.
Давайте посмотрим.
Open link.
Да.
Говорю открыть.
Вот.
HTML.
Есть.
То есть есть.
Теперь я открываю ВКонтакте.
Открыть.
Нет такого видео.
А в чем прикол?
Видео was removed?
Копирайт?
Холдер?
То есть у меня... Подождите.
У меня ВК забанил мой авторский ролик за то, что копирайт прилетел.
И мне даже не сообщили?
Мне не сообщили, что копирайт?
Подождите.
Сейчас, подождите.
Давайте я открою кабинет автора.
Может, у меня там какой-то прилетал страйк?
У меня там нет музыки.
Это все мое авторское.
То есть кто мог копирайт прислать?
Сейчас я зайду в кабинет автора.
То есть видео существовало, я его точно выкладывал, я вот был уверен, что он тут есть.
И меня не предупреждали никак.
То есть мне пришло бы, например, сообщение в ВК, пришло бы на почту.
Нет, просто нет.
Так, давайте смотреть.
Давайте смотреть.
Я открываю личный, вот, ВК.
Мои видео.
Да, здесь же открывается, вот, соревнования на программирование.
Теперь мы ищем... А тут есть поиск?
Тут нет даже поиска.
Окей, это было в начале июня.
Или в конце июня.
Ну, короче, это был июнь 24-го года.
Ищем.
Ищем.
Ищем.
Ищем.
Ищем июль.
Смотрите, реально, вот он, вот он ролик, 8 июня загруженный, вот он, с крестиком, и мне ничего не сообщали, просмотров ноль, то есть он даже не был отображен ни разу в ВК, и мне даже, смотрите, насколько ВК видео не нужно людям, которые, ну, именно вот меня смотрят, понятно, что есть люди, которые смотрят ВК видео, что мне в комментариях никто ни разу не написал, что этот ролик не работает, причем я не знаю, куда он забанен, может он не обработался, знаете, может быть ролик такой большой, там 4 часа 20 минут, что его ВК не обработал просто.
И поэтому он в таком виде, потому что ноль просмотров, даже одного нет.
И я об этом не в курсе.
То есть, например, Рутуб, когда он не может загрузить видео, он пишет, при обработке видео произошла ошибка, присылает письмо.
YouTube, я не знаю, не сталкивался ни разу с проблемой, что YouTube не может обработать.
Подождите, давайте я открою телегу.
Комментарии.
Сейчас, секунду.
Значит, мы открываем Telegram.
Вот, Telegram открываю в отдельном окошке.
И мы, вот, в htmx-приложение.
Вот ссылка, которая не работает, которую мы сейчас убедились.
А, кстати, давайте я зайду сюда от своего профиля, посмотрим.
Мне что-нибудь скажет?
Нет.
Нет.
Видео взято по обращению правообладателя.
Какого правообладателя?
Если это заглушка, если это заглушка просто, что вот написано «видео взято по обращению правообладателя», если это заглушка, окей, это косяк, который меня заставляет нервничать, но если это правда, то, во-первых, почему меня не проинформировали, а во-вторых...
Какого правовладателя, если весь ролик, это мой авторский контент полностью, полностью, код написанный мной, монтаж, ну, не лично я, но монтажер, которому я оплачиваю работу, мы вместе пересматривали ролик, я полностью вложился в этот ролик, и он здесь написан изъято по обращению правовладателя, и меня не проинформировали.
У снесенных видео все по нулям стоит, даже если смотрели.
То есть этот ролик когда-то смотрели.
Сколько-то просмотров было, но снесли, и здесь нули.
И меня не проинформировали.
Меня не проинформировали.
Сейчас, секунду, я открою почту.
Сейчас, подождите, давайте комментарии проверим.
Вот комментарии.
И смотрим.
Так.
Хотя в ВК все ок.
То есть в ВК работал ролик.
Я проверял.
В ВК работал ролик.
Вот, два просмотра.
Вот, это реально вот ролик в ВК видео.
Видим, написано ВК видео.
Ролик работал 4.20.
То есть мои просмотры были.
Вот, два просмотра было.
На ютубе.
да вот кстати на ю тубе нельзя было больше 100 глав сделать vk нормально было то есть на ю тубе у меня слетели главы просто потому что было там 115 110 глав я не помню я стёр некоторые главы то есть просто для ю туба я подсократил деление то сделал менее детальные главы тройной лайк за такой контент спасибо большое ой какие то были не знаю шутки или спам или что так снова слетели да пришлось еще там меньше сотни сделать удалил главу вот короче в итоге в ю тубе
И это я контору про YouTube говорил, что он мне главный отображает.
А в ВК удалили мой ролик.
было круто, видите, небольшим проектом, бла-бла-бла, короче, во, ВК, самокурс вперед, а, это YouTube, это YouTube, он еще и с таким объемом все равно был первым у меня на канале вот, ну, вот, вот там, капец, и никто не писал, что в ВК видео пропало, то есть я даже не знаю, когда, секунду, я сейчас открою почту и посмотрю сообщение от ВК, может, я пропустил вот так невинный вопрос по почтению, да идиотизм просто, это мой авторский контент, и меня никак не проинформировали, меня вообще никак не проинформировали,
Извините, там был вопрос выше, сейчас встречу.
Привет, с какого веб-фреймворка начать лучше, джанго, фастап или фласк?
Джанго, если вообще не писали ничего в веб, то джанго будет проще.
А фастап, если вы чуть-чуть в вебе разбираетесь.
Еще был выше вопрос.
Django, увы, вообще совсем не френд, это действительно асинхронщина, я пробовал и забил, в итоге выношу асинхронщину куда-нибудь налево в фастапе, допустим, вот, ну, короче, как я вижу, да, реально не надо заниматься асинхронщиной в Django, но сейчас мы разберемся, подождите, я напишу htmx в поиске в gmail, я не буду ничего показывать вам, потому что это gmail, нет, уведомления только от ютуба, я пишу в поиске вк видео
Так, Алиэкспресс, монетизация контента, реклама.
Чем отличаются блогеры, разрабатывающие... А, это вообще от спонсор, который... На котором, кстати, опять же, на спонсор.ру ни одного человека у меня нет.
Флотбонус.
Зачем?
Мне ВК-видео надо.
Это, видимо, везде кто-то пишет ВК-видео.
А, просто новое видео.
Бусти.
Монетизация контента.
Опять спонсор.
Ну, я вам показывать письма не буду, потому что это письма.
Но... Ну, в смысле, это почта рабочая.
Ну, в смысле, личная.
Ну, короче, почта.
Команда спонсор опять.
Я не читаю письма от команды спонсоров.
За март они прислали мне пять писем.
Ну, у них, видимо, еженедельная рассылка.
А в марте было как раз вроде, да, пять раз.
Можно было успеть.
Рутуб.
Так, февраль, рутуб.
То есть я даже не знаю, когда.
Не знаю, когда это произошло.
Сейчас, секунду, я зайду в ВК.
Я зайду в ВК, просто зайду в ВК и посмотрю сообщение.
Вот просто сообщение.
Мало ли, вдруг я пропустил какое-то служебное уведомление от ВК.
Я захожу.
Иду.
Значит, оно должно быть не раньше 8 июня и не позже, чем сегодня.
Значит... Так, 29 июня...
1 июня, 3 июня, техподдержка ВК 5 июля.
Я общался... Ой, нет, извините, это не то.
Это другая техподдержка.
Вот, команда поддержки ВКонтакте.
Ладно, есть ли у ВК видео саппорт свой какой-то отдельный?
Давайте сейчас я напишу htmx еще раз.
Нет, заблокировано.
Давайте, правообладателя.
Правообладателя.
Нет.
Давайте я напишу заблокировано.
В поиске в почте пишу заблокировано.
Нет.
Нет.
Я не понимаю.
Сейчас, секунду.
Секунду.
Я просто хочу понять.
Давайте, хорошо, поддержка.
поддержка в к видео ничего себе блин тут огромный ролик он он ну он стоит внимание это просто весь htmx вот если вы хотите что-то в htmx сделать там все есть и его нет просто вот его здесь нет и все он поддержит контакте хорошо вот я пишу команда поддержка контакте значит обратиться здравствуйте сейчас давайте
к диалогу сейчас не буду вам диалог показано что там были проблемы у меня другие я напишу просто здравствуйте у меня в vk видео пропал ролик сейчас ссылку приложу и
Мой ролик, мой ролик Так, и название вещь htmx с нуля Здесь я использовал фласк, чтобы был в комплекте сразу же джинджа Хоть и в фастапе есть тоже джинджа, но фласк он как бы сразу про джинджу Почему я не могу это выделить, блин?
Вот сделаю, чтобы нельзя было выделить.
Я все равно выделю.
Просто зачем мне лишние клики делать?
Так, мой ролик с названием... Названием... Я обнаружил...
Это сейчас, когда искал ролик, так как меня попросили... Скинуть у него ссылку.
Ну, тут чуть утрируем.
Так, попросили скинуть ссылку на ролик.
Я не смог найти.
Казалось, что его...
Нет.
Почему?
Дальше.
Вижу.
Вижу.
По ссылке на ролик.
Визит по обращению правовладателя.
Вопросы.
Почему меня не уведомили?
Давайте так.
Почему меня никак об изъятии ролика не уведомили?
Вообще никаких уведомлений, никаких уведомлений, ни в... А, слушайте, в ВК еще есть уведомления, вот в этой шторке уведомлений.
Сейчас я туда зайду и проверю, что у меня там.
Но у меня там обычно просто в вашем сообществе там поставили лайк.
Давайте я посмотрю.
Показать все.
Уведомления.
Так, уведомления профиля.
Нет, это личные.
Вот, соревнования, программирование.
Вот, программирование.
Я хочу увидеть все уведомления...
Я не буду показывать, потому что там люди ставят лайки и просто, ну, типа лайки.
Я здесь делаю сейчас поиск по странице.
Показаны последние новости.
Ну, вот с марта, да, тут последние, тут больше нет.
HTML, то есть за две недели ничего.
То есть, ну, не дают.
Нет, окей, нет информации.
Ладно.
Возвращаемся в чат, значит, кстати, даже при возврате сохранилось сообщение, значит, у них тут реактивный был фронт стоит, сохранил.
Вопросы, почему меня никак об изъятии ролика не уведомили, вообще никаких уведомлений ни в ВК сообщениях, ни на почту, ни в колокольчике.
В колокольчике.
Ок.
кто правообладатель моего ролика это мой авторский контент авторский контент я полностью этот ролик написал записал там только моё
ее лицо там нет других людей там совсем нет музыки кто правообладатель моего ролика
И скриншоты сейчас закину им.
Значит, вот скриншот.
Давайте сразу же с ссылкой, чтобы было видно.
ВК-видео для авторов.
Вот я автор, и как вы вот со мной обошлись.
Но это просто дичь.
Это дикая дичь.
Вот правообладателя.
Вот я, чтобы ссылку было видно, прикладываю ссылку раз.
Ой, скриншот раз.
И вот, чтобы было ссылку видно.
Сейчас на страничку.
Скриншот.
Два.
Все.
Значит, написал, отправил сообщение.
да отправил отправилась ну это просто дичь это дичь я такого не ждал у меня на ютюбе есть я не помню там это был strike или забрали монетизацию но у меня там был проблемы с видео так сейчас ответили давайте сейчас я открою уже этот чат короче на ютюбе я первый эфир когда проводил я включил видос чтобы отойти поставил видос с ютюба тоже и этот видос
был с музыкой, и вот эту музыку забанили.
Ну, короче, забрали там монетизацию или что-то такое, хотя у меня монетизации не было.
И я просто скрыл, по-моему, этот эфир или что-то там, кусок этот скрыл.
В общем, там были с этим проблемы.
Сейчас я подготовлю экран с сообщением.
А чтобы у меня просто удалили ролик, просто ни за что, вот это новый прикол какой-то.
Так, чаты могу свернуть?
Могу свернуть как-то.
Почему я не могу как в телеге сейчас сделать?
А, я знаю, как я могу сделать.
Я могу просто браузер открыть не на весь экран.
Вот так вот.
Да.
Сейчас я верну ФБС.
Вот так показываю.
Вот.
И, значит, я написал вот сообщение.
Ну, все, что я писал, вот ровно оно и есть тут.
Дальше.
Бла-бла-бла.
Здравствуйте, чат-бот.
Выберите следующий вариант.
Если вы нет, переформируйте ваш вопрос.
Например, жалоба на нарушение авторских прав.
Проблема с видео.
Проблема с видео.
Его нет.
Вот это проблема.
Так.
Так.
А какая проблема с видеообладателем?
Ролики открываются в ВК-видео, это не проблема, нет звуковидео, нет, недоступны из-за правообладателя.
Так.
Интересно.
Ну вот, это же так, но они сейчас скажут, ну мы для безопасности, вот, я правообладатель, вот.
Мы для материала только по запросу правообладателя, не благодаря каким-то товарным знакам, бренду, бла-бла-бла.
К нам требуем изъять те иные, то есть меня не уведомили, меня волнует, что меня не уведомили, то есть мой первый вопрос, почему меня не уведомили?
Может быть, там я что-то нарушил, может, у меня логотипчик какой-то отобразился, который именно в ВК защищают, но я правообладатель, я правооблад
капец просто капец вот и они тратят мое время на это если вы дать исходниками скопировался материал хотел и хотите совсем удалить копию способом пожалуйста помните дим сей нет и сомнительно чужих авторских прав моих авторских прав моих публикуют вописано отношения в моей группе узнать правообладателя и
Я сейчас, если отправлю им ссылку на правоподателя, а, ну вот, сейчас агент поддержки ответит, так что мы с вами еще, наверное, часик потусуемся, если ответ поддержки будет приходить, мы с вами в живом эфире разберемся, а как мой ролик за моим авторством, полностью моим авторством, то есть не то, что я с кем-то делал, этот кто-то решил, что, пожалуй, я кину тебе страйк.
просто удалили и не уведомили меня, ладно, допустим, допустим, там, не знаю, какая-нибудь иконочка, какой-нибудь, вдруг там музыка, хотя музыку я не ставил точно, но вдруг там что-то, допустим, случайно подумали, что музыка, то прислать мне уведомление, ваш ролик заблокирован, типа, отреагируйте, нет, вообще ничего, когда это произошло, неделю назад, месяц назад, полгода назад, сколько времени прошло уже, почти год, ролику, и он, ну, выходил год назад, а вот сколько, ну, 8, 9, 10 месяцев назад, а сколько времени его не смотрят сейчас,
если это еще и кто-то представился, что это его ролик, то это вообще идиотизм, потому что весь ролик мое видео, ой, мое лицо во всем видео, и канал называется Сурен Харинян, профиль Сурен Харинян, все с галочкой, ну, этой галочкой, которая через госуслуги делается, то есть это мой подтвержденный профиль, имя написано, я там представляюсь, сопоставить просто, ну, один плюс один сделать вообще не проблема, то есть вообще идиотизм какой-то, идиотизм,
Так, значит, я включу звук с экрана, чтобы если пилик будет из ВК, мы с вами услышали бы ВК.
Кстати, а эфир на ВК идет, а то, может, его тоже заблокировали по авторским правам.
Давайте проверим, но, по-моему, там все работало.
Мы вот это пока... Давайте уберем вот здесь.
Да, вот эфир идет.
Так.
Просто прикол.
Просто прикол.
Капец.
Этот эфир, наверное, не может стать еще интереснее.
Только если мне сейчас в прямом эфире начнут отвечать.
Просто капец.
так, что мы с вами делали, давайте вернемся, сколько времени мы этим уже занимаемся, минут 10-15, значит, я думал, что мы закончим с вами за пару часов, но тут такое происходит, что капец, просто, и что, а сколько еще роликов ВК мне заблокировал, во сколько он мне заблокировал, а есть ли там еще какое-то заблокированное есть, ну вот что, как мне это узнать, ну нет, смотрите, тут пока все нормально, вот мы уже до начала добираемся, это прям начало-начало, это вот первый год, что этим занимался,
Да.
Все нормально.
Все, все окей.
Все окей.
Кроме... Подождите, нет, почему 13 января 2024 года?
Почему 13 января 2024 года?
Почему у них идет сначала 23 год, потом 24 год?
Потом снова 24 год, потом 23 год.
Что за идиотизм?
Так.
Так.
капец ладно что мы с вами делали значит мы идем на да кстати приходите телеграм-канал мы тут это болтаем в чатике постоянно и и вообще там классно так табличку верстали до табличку точно точно спасибо большое значит мы идем до поставьте лайки мне за мои страдания кстати пожалуйста нажмите лайки и мы идем в
Джанго.
И, наконец-то, занимаемся асинхронщиной.
Вот что мы делаем.
Значит, у нас есть страничка Dashboard.
Вот здесь у нас... Да, я хотел сделать табличку из этого.
Точно, спасибо.
Вот табличка.
Я хочу ее сделать стрипт.
Вот такую.
TableStript.
И мы сейчас сделаем просто табличку.
Просто добавим еще TableStript.
Да, валюта.
знаете что нафиг я сделаю вот что я сделаю calls 6 вот это будет кол 1 а это будет кол авто сохраняем и
И вот так все приемлемо.
Вот это, кстати, можно upper сделать и code.
Давайте сделаем для красоты.
Значит, у нас есть фильтр upper.
И мы еще можем из этого сделать code.
Code.
И, значит, col2.
А, ну да.
Нет, подождите.
Col2.
Ну, нормально.
Странно, конечно, что... Ну, окей.
Я все-таки хочу write.
Text write.
Write.
right to left нет текст просто текст вот это самое все от центра водив перенести текст направо вот как текст райтон называется текст вот текст alignment вот вот он же справа может быть а
Текст end, точно, у них же right to left, и у них теперь нет, точно-точно, у них же right to left, и весь, теперь все направления, это start и end, вот в этом прикол.
Обновим страничку, бац, во, все, теперь, ну, приемлемо, я считаю.
И вот на эти недоплощадки вливают огромные деньги.
Да это, блин, стыдоба, что вливают.
Просто позорище.
Мне бы дали денег.
Просто так.
Но у них есть какая-то тактика.
Единственный вопрос, что они там работают на KPI, а не на реальные какие-то достижения.
Потому что купить 100 разных программ у одного и того же комика...
я рад за комика, я бы с удовольствием, я бы, если мне предложили денег, давайте так, я не осуждаю комика, мне если предложили денег, я бы хоть 100, хоть 200 программ сделал, я бы из студии не выходил, просто приезжал бы раз в неделю, ладно, раз в пару дней хотя бы увидеть семью и уезжал бы обратно на съемки, вот, чтобы заработать все деньги, чтобы решить вопросы все обычные бытовые, классические, с там жилье, автомобиль и так далее, но
Если мы смотрим на это... То есть, еще раз, я не осуждаю.
Я сам с удовольствием пойду на такие программы, если мне предложат.
Но мне не предложат, потому что я без аудитории.
Вот вы сколько тут сейчас... Сколько у нас сейчас в эфире человек?
Так, пока молчат.
Боятся.
В эфире у нас...
20 человек, да?
Вот 20 человек.
Вот это мой потолок.
Опа, звук был.
Ну-ка.
Вопрос в заботливых руках.
Сейчас мне нужно долго отключиться, чтобы уточнить информацию.
Пожалуйста, запустите с терпением.
Иногда на решение вопроса может идти время.
Я вернусь к вам с ответом в этот же диалог.
Честное сообщение нужно всегда рядом.
Короче, он поставил галочку, пошел исследовать.
надеюсь он сможет прочитать что я здесь написал вот я написал еще раз к видео пропал мой ролик ссылка на ролик с названием такое-то я дружу сейчас когда искал ролик так меня просили скинуть алла почему вижу по ссылке на ролик или взят из обращения вопросы почему мне никак об изъятии ролика не уведомили вообще никак никаких уведомлений в к и на почте не в колокольчике кто правообладатели моего ролика там авторский контент была была вот все ждем
их ответа.
Так вот, да, вопрос-то в том, что эти шоу с сомнительным количеством просмотров как будто бы нужны только для отчета, отчета выше куда-то, вместо того, чтобы делать какие-то реальные успехи, потому что привести... Смотрите, это правило вообще распространения информации.
Сильно, сильно дороже, сильно интереснее, сильно выгоднее
одного рупора с миллионом слушателей будет 100 рупоров с 1000 слушателей или 1000 рупоров с сотней слушателей при том что 100 на 1000 умножаем это не миллион это 100 тысяч сильно эффективнее потому что один человек услышав из одного места и из другого скорее поверит этому чем услышав из одного более авторитетного чем вот эти два мелких ну несколько мелких это просто основы распространения информации ну пропаганды там все дела и если просто взять не двух-трех
пятерых блогеров-миллионников, а за те же деньги взять в 10, в 100 раз больше мелких блогеров, которые так готовы выкладываться на ВК, просто вы им там, ну, какой-то бонус там поощрение дайте, они будут активнее выкладываться, другие будут тоже приходить.
Ну, я ничего в этом не понимаю.
Ничего в этом не понимаю.
Но как будто бы там есть какое-то там...
взаимное согласие по этому поводу, не могу никого ни в чем обвинять, потому что у меня нет никаких доказательств, да, я там ни за какую клевету ничего не хочу никуда отъехать, меня сейчас ВК вообще полностью заблокирует за такие слова, может, ну, посмотрим, как свобода слова работает здесь, потому что на Ютубе единственный страйк, который я получал за музыку, открытую на том же Ютубе, то есть я на Ютубе открыл ролик
Please Stand By из Fallout.
И там была музыка, я не знаю, можно ли её напевать, за это тоже страйк будет, и тем более я напою так, что вы ничего не поймёте.
И вот в этот кусок кода, ой, кусок кода, кусок видео меня...
короче, то ли там страйк был, то ли там ограничение какое-то на ролик было, я не помню уже, но я такой, ладно, все это, типа, убрать, там вырезать, скрыть, не помню что, и все, это было, вот первый эфир я проводил, я такой, а, такой нельзя, понятно, окей, вот такая свобода слова на ютубе, но в ВК меня забанили, мне забанили ролик, мне забанили ролик просто без объяснения причин, и если перейти по ссылке, то изъято по обращению правообладателя, но я правообладатель, и ролик работал в ВК, мы с вами убедились, что были скриншоты, у меня в телеграмчике были скриншоты, что ролик,
я закрыл уже, да, что ролик был на ВК, и я его там, ну, чекал, там были просмотры, вот, короче, дали бы мне тех денег, не знаю, процентик хотя бы, потому что столько денег на эти, как их звать там, спецшоу тратится просто капец, просто капец, это там такие денжища, которые на монетизации Ютуба не было, таких денег, сколько ВК платит, ну, вот,
чтобы притащить.
А сделали бы монетизацию, например, и все.
Так, что у нас тут со страничкой?
Нормальная монетизация, потому что у меня, например, нет монетизации в ВК.
потому что там какие-то правила, у тебя должны быть там тысячи подписчиков, у меня даже одной тысячи в ВК подписчиков нет, а откуда у меня тысячи подписчиков, если я сюда, например, ничего не выкладываю, хотя вроде как мои ролики уже продвигаются, потому что откуда-то, ну, приходят просмотры в ВК, вот это старые, да, вот год назад, да, 27 просмотров, раз новые, вот 160, 140, 190, то есть откуда-то есть, вот это у нас вообще успех, да, 500, вот здесь 700 просмотров, то есть реально какое-то продвижение случилось,
Возможно, алгоритмы уже начинают работать, это хорошо, но, блин, капец, капец, вот это, вот это полная хрень.
Так, вернемся к теме, вернемся к теме.
Dashboard.curences.
Да, мы хотели асинхроничную сделать.
Sorry, я так из-за этого взбудоражен, что мне, конечно... Сейчас чуть уже не до асинхронной джанги, до которой у меня в целом дела-то не было.
Ну, мне было интересно, но как бы... Так, давайте мы профиль отобразим тоже.
А то чего это у нас тут?
Закинем в контекст профиль.
Профиль.
Профиль.
И давайте, чтобы контекст был поприличнее, я получу curences вот здесь просто вот так.
Curences равно...
А еще знаете, что я люблю делать?
Я люблю словарик не вот так объявлять А я сейчас делаю так словарик Через дикт некрасиво, зато можно вот так сделать Я профиль получил, керенсис получил И теперь контекст не объявляю здесь заново А делаю контекст апдейт
Update.
И пишу profile равно profile, currency равно currency.
То есть мне не надо кавычки ставить лишний раз.
Красота, красота.
Хотя толку от этого никакого.
То есть это технически такой... Вот.
Обновляем.
Профиль надо отобразить как-нибудь.
Давайте мы отобразим... Давайте мы посмотрим, что у нас в профиле.
Еще раз.
Профиль.
Вот у нас.
Update.
City.
Bio.
И мы сделаем карточку с этими полями.
У нас есть карда.
cards example, вот, и, ну, у нас картинки не будет, но у нас будет card, ну, title, subtitle, сделаем, например, full name и, full name юзера и card subtitle, кстати, кстати, вот здесь, давайте мы подтянем objects select related,
юзер вот и делаем агент чтобы у нас был юзер прямо на профиле можно юзер конечно с request .
а юзер обращаться на уж лучше через профайл .
юзер обращусь ничего страшного что мы там из базы лишний раз юзера вытащим значит это беру и я не буду это даже в отдельный компонент выносить давайте дэшборд отобразим карточку пользователя то есть это у нас будет давайте в вид давайте у нас будет div row div будет класс
Давайте 2, и мы в одну колонку сделаем из 2.
Но calls, давайте calls md 2, а calls 1.
Вот так.
И колонка у нас будет...
Class call 1.
И вот сюда мы засунем вот эту карточку и уберем.
Это я просто, чтобы не делать вот этот видс, который всегда на любом размере будет одинаковый.
Я не хочу так.
Вот.
Кар.
Давайте проверим, что он просто отобразится.
Для начала обновляем.
Очень плохо.
Очень плохо, потому что видс 100.
100%.
Нифига.
Так.
если сделаю так call1 если call auto
Ага.
Ладно, тогда без вот этого всего, без rows.
Сейчас проверим здесь, пока мы в заботливых руках.
И давайте мы сделаем только здесь margin y, то есть по вертикали 2, чтобы больше отступов было.
Больше отступов стало чуть-чуть.
Окей.
Cart title у нас будет.
Значит, здесь имя.
Профайл.
Точка user, точка first name.
А давайте, кстати, мы возьмем так, с профайла.
А что ты не знаешь, где это?
Это же вот здесь.
Ой, это же вот здесь.
Профайл, вот он.
Давайте мы на профайле сделаем метод dev full name.
И мы вернем просто вот так.
Да, у юзеров first name есть же.
Abstract user.
First name, last name.
Email, stf, active, date joined.
Ну да.
Но может быть пустой blank true.
Поэтому только если оба есть.
Вот так сделаем.
If.
Это и это То вернем вот так В ином случае мы вернем Это или это А может ничего не будет Or То есть может вообще пусто быть Вот
user или a user, а вот на профайле у нас user вот так, и я его подтягиваю специально вот здесь, кто-то следит за джанго темой, я думал, что я это все, уже все внимание ваше на другое перебросил, так, я здесь подгрузил его, видите, вот профайл, я его говорю загрузить, и вот этот агент должен, по идее, загрузить его вместе сразу, и мы тогда профайл full name сейчас можем взять, как пропорти даже, а не метод будет, а пропорти,
property и давайте закроем все он модифает и лишние вот эти чужие тоже закроем profile да это не с реквеста да да да вот поэтому profile full name и только мы сделаем здесь first of вот так потому что может тоже пусто прийти first of profile full name или profile вот здесь мы возьмем .
юзер .
юзер name
Еще у нас может быть email, но может его не быть, но мы сейчас добавим сюда subtitle.
Это будет code.
И мы code закрываем.
И мы сюда, давайте перенос добавим только.
И здесь, наверное, перенос надо сделать.
Мы здесь email пользователя выведем.
Профайл.
Странно, что не подсказывает.
Профайл.
Юзер, наверное, контекст надо в виде словарика объявлять.
Тогда он будет подсказывать.
Давайте проверим.
Кстати, смотрите, мой трюк вот этот, может быть, он мне стоит таких страданий.
Ну-ка, вот это мы сейчас закомментируем и сделаем контекст равно и укажем все заново в виде вот так ключей.
и смотрим, я здесь пишу, то есть если PyCharm это не выкупает, то PyCharm стыдоба должно быть, хотя с другой стороны, почему он в рантайме, не в рантайме должен это узнавать, смотрим, пишем про файл, подсказывает, вот это да, вот это открытие, я такого не знал, я не задумывался, то есть вот, ну реально придется вот так делать, ну придется, придется, как бы не то, чтобы сильно сложно, просто мне кажется идиотизмом, что в PyCharm это не учитывается, очень странно,
Наверное, если бы я сделал контекст, давайте проверим, сейчас проверим, при создании, то есть мы не обновляем, а вот если я при создании скажу контекст равно дикт, просто не надо вот так делать, но ради экономии, допустим, допустим, экономии кавычек, допустим, я так сделаю.
Смотрим, пишу здесь профайл, подсказывает, реально при создании, то есть обновление не учитывает, создание учитывает.
Ладно, давайте так оставим, мне не нравится использовать так дикт, литерал, точнее наоборот, дикт, а не литерал, но окей, обращение к билтыну.
User, да.
А что не подсказываешь?
Карутина.
Почему карутина?
Потому что я не сделал await.
Слушайте, подсказывает.
Пайчарм подсказывает.
Вообще красиво.
Await.
Да, абсолютно точно.
Давайте, чтобы я не запутался больше.
Так, я сделаю вот так профайл.
И мне скажут, слушай, ты забыл, что это карутина.
Давай-ка сделай await.
Я делаю await.
Теперь все прекрасно.
Да, давайте я еще сделаю вот так.
Нет.
Так.
Нет.
Ладно, нет и нет.
Окей.
Значит, select related, бла-бла-бла.
Мы идем в дешборд, пишем profile.vo.
User.
Слушайте.
Окей, ладно, работает.
User.email.
И мы... А что такое?
User.email.
Это что за свойство?
Это свойство на уровне класса.
Понятно.
Ладно, тут дальше подсказок не будет.
Окей.
Так, дальше описание.
Это будет bio.
Это будет bio пользователя.
Мы здесь укажем profile.bio.
profile.bio.
Дальше card link нам не надо.
Что у нас там?
Есть год рождения.
Давайте так проверим.
Admin.cvproject.
Есть это.
Нам нужно теперь какую-нибудь подпись сделать.
Эвейд забывается вообще всегда, мне кажется.
Да, поэтому важно ставить аннотации.
Прям хоть мы и догадываемся, что питон и так поймет аннотацию, но очень важно поставить аннотации, и тогда вот нам будут подсказывать.
Так, смотрим.
Вот давайте перечисление какое-то сделаем.
Лист групп item вот так.
Flash.
И я здесь вставлю пункты.
Да, проверим.
Вот здесь обновляем.
Бац, да, пункты.
И вот здесь у нас будет date of birth.
Да, у нас что там на модельке.
Birth date.
City.
Вот мы укажем.
Birth date и city.
Мы говорим, что здесь будет profile.birthdate и city.
Но мы добавим, конечно же, сюда текст.
Я напишу здесь city.
И давайте мы сделаем здесь bold.
Кто у нас будет bold?
City сам.
Давайте сделаем его strong.
city и здесь мы сделаем без дэйт красиво дату отобразим кстати кстати кстати но если он есть а если нет то скипнем поэтому мы сделаем давайте и то и другое и в профайл без дэйта отображаем и если то же самое с profile city и
И в Profile City, то мы его отображаем.
Вот так.
Единственное, что у нас будет пустая лист группы, если ничего из этого нет.
Но ладно.
И мы хотим здесь указать Birth Date.
Тоже Strong.
Strong.
И единственное, что я хочу, фильтр сделать.
DateFilter.
Так, здесь пока заботливо ждем.
DateFilter.
Так.
Django DateFilter.
ну понятно дэйт и так какой у нас там есть формат даты f по моему да f это все отобрать нет f что другое сейчас там был давайте откроем там был какой-то дефолтный типа формат который можем использовать f это месяц там были какие-то готовые шорткаты и
типа в виде одной строчки сделать, типа short просто написать, вот short, ну-ка, short, вот, short, а, вот, вот так, да, ладно, значит, в now запишем вот так что-нибудь, да, ну, не в now, в смысле, а в этот date, где date, еще раз,
Пожалуйста, примерчик.
Вот, да, date.
Говорим date, ну и дальше как-то отобразим.
Значит, здесь у нас будет вот такой.
Делаем фильтр date и указываем.
Сохраняем.
Смотрим.
Дэшборд.
Отображаем time-related format specifies.
Form for date objects.
А, тут дата.
Нам не нужно часы-минуты, конечно же.
Дата только.
Обновляем.
Вот, birthdate 1 января 1980 года.
Все, окей.
City server.
Все, работает.
Мы отобразили информацию по пользователю, по валютам.
И я хотел еще отобразить...
Я забыл, что.
Типа трафик.
Так, можно использовать дефолт.
А, да, там есть такое.
Давайте проверим.
Сейчас.
Дефолт.
Давайте напишем дефолт.
И смотрим.
Бац.
Дефолт requires two arguments.
Давайте посмотрим, как работает фильтр дефолт.
А, это если ничего нет.
Все, все, все.
Дефолт для пустых.
Все, сори, я подумал.
Да.
Я подумал, что вы про это.
Да, вы абсолютно правы.
Но тогда у нас будет вот этот лист item, birthdate и пусто.
А я не хочу вообще ничего указать.
Но можно минус поставить.
Да, слушайте, давайте так и сделаем.
То есть мы if уберем.
Вот так сделаем.
Мы сделаем вот здесь так.
Значит, если у нас есть оно, birthdate, то нам date.
Иначе default, ну-ка, прокатит.
Вот так.
Двоеточие.
Минус просто.
Вот так.
Ну-ка.
Смотрим.
Бац.
First January.
Теперь я иду... Залогинимся от другого пользователя.
Нам надо сделать ему учетку.
Мы идем в админку.
Админ.
Пока что будет Джон без данных.
Мы идем в юзера.
Просто будем на нем тестить.
Пустое всякое.
Вот.
Мы хотим создать нового юзера.
Вот.
Add.
Я пишу здесь Джон.
У него будет...
Я не хочу заново это набирать каждый раз, поэтому я сейчас иду в настройки.
Settings.
Можно программно было создать.
Ну ладно уже.
Вот.
Password validator.
Все.
Вот это нафиг.
Обновляем.
Вот.
John.
password-based authentication есть.
Дальше password 123 123.
Save.
Успех.
Все.
И сделаем сразу же Сэма, с которым будет то же самое, просто мы над ними будем издеваться отдельно.
123 123.
Есть.
Все.
У нас есть пара юзеров новых.
Вот Джон и Сэм.
Мы возвращаем вот эти, потому что это очень важно, чтобы были такие пароли.
Но теперь у нас в профилях есть еще для Джона и Сэма, но у них пусто.
Теперь я зайду от Джона.
Я сделал просто инкогнито здесь.
Мы переходим
Вот сюда.
Дэшборд.
Но вот в инкогнито.
Я захожу от Сэма.
И мы что видим?
Мы видим birthdate, да.
Минус.
Сработало.
Спасибо за подсказку.
Все, тогда вот так и оставим.
City, ладно, пусть будет с if.
Это сейчас не важно.
Окей.
Сэм, давайте мы Сэму добавим имя.
Или фамилию.
Давайте сначала фамилию.
Пусть у него будет фамилия White.
Будет Sam White.
Мы от Сэма зашли, да?
Да.
Мы идем к нему в юзера.
Sam.
Здесь напишем last name, только last name.
White.
Отобразится ли фамилия нормально?
Сохраняем изменения.
Смотрим, обновляем.
Бац.
Да, White есть.
Если мы здесь напишем... А давайте тогда...
скучных юзер на им хотел сделать ну ладно а кстати вас еще почта не отобразилась пока потому что у нас ее нет но давайте мы тоже сделаем вот нас сэм здесь будет давайте сэм white email сэм white dot com наверно такой адрес даже в реальности существует но а может нет смотрим обновляем бац вот сам white почта есть билдает все прекрасно работает
Окей, это мы с вами все к красоту наводим.
Ждем, пока заботливая поддержка в заботливых руках мой вопрос донесет до ответственных.
Самое дурацкое будет, если они просто «Ой, разблокировали».
Я буду пытаться узнать «А почему?» Они скажут «Ну, так получилось».
И все.
И не ответят мне на ни один другой вопрос.
И типа «А какие еще ролики тогда у меня могут быть так заблокированы?»
по требованию какого-то правообладателя, какого права, ну, каким правом обладает тот человек, который на мой контент, который забанил мой ролик.
Ох, так, значит, мы идем дальше, и мы делаем еще один запрос, а что я там хотел, давайте random joke просто у нас будет, random joke api, вот у нас есть random joke api, вот jokes api, нет, не этот, вот этот,
И тут есть single line, мы сейчас двусрочной не будем, только single, и давайте программистки и любые, меня устроят любые, так, запрос send отправляем, вот, и вытаскиваем отсюда joke, все, просто чтобы какие-то опишки мы дернули
Да, и нам надо будет причесать.
Кстати, давайте сначала причешем, что мы тут сделали.
Значит, во-первых, нам надо из views вот эту убрать в какие-нибудь утилитки, например.
Можно в сервисы.
Давайте назовем это services.
Идем в homepage.
Я создаю новый Python package.
Services.
Сейчас не буду прямо сервис изобретать, но я сделаю currencies.
И вот сюда перенесем...
Сюда перенесем.
Все, что касается Currencies.
Refactor.
Move.
GetExchangeRates.
Да.
Переносим.
Бац, перенесли.
Все, теперь GetExchangeRates вот здесь живет.
Отлично.
И мы идем в Commit.
Давайте создадим отдельно.
Create currencies API service.
Create currencies API service.
Дальше.
View.
Давайте add.
Для начала add.
Full name property to profile model.
Дальше.
Да, upgrade dashboard to show.
Да, это у нас тогда и тут.
Да, подождите, async.
Так, support, ну не support, как там, поддержка, как поддержка будет.
Короче, async, request.
user ok дальше у нас вот дашборд и
Так, implement user-dashboard.
Ну, пока так.
Вот.
Интересно, как Django осуществляет асинхронные вызовы к базе с учетом, что стоит обычный PSI-KPG.
Так вот, мне очень интересно.
Во-первых, обычный PSI-KPG третьей версии умеет в async.
Но, я так понимаю, вызывается sync-метод просто в ThreadPool.
И все.
То есть даже не используется асинхронная поддержка.
Я так понимаю.
Может быть, это работает иначе, но вот если мы зайдем сейчас в aget...
Бенчмарк сегодня будет.
Я боюсь, что не успеем.
Уже 20.22 по моим часам.
20 часов 22 минуты.
Я бы не позже 9 закончил, потому что мы уже довольно давно с вами.
Мы начали сегодня вовремя.
Давно общаемся.
Вот, поэтому бенчмарка, наверное, не будет.
Так, вот я захожу в агет.
Захожу в агет.
И что происходит?
Синк-туа-синк, он вызывает тот же самый гет.
Ну, окей, алхимия также делает, ну, там она гринлид вызывает, но этот синк-то-синк, он просто делает, вот, синк-то-синк, вызывает, вот, где у нас тут колл, вот, вызывает, берет ранг-луп и засовывает вот это в луп и ждет.
Ждет.
Вот ExecCore.
Run Executor.
Вот в Executor выполняет ThreadHandler.
То есть, я так понимаю, там обычный синхронный движок все равно используется.
То есть, если мы попытаемся поставить iOS QLite, то не сработает.
Более того, а вообще есть способ в Django указать движок явно?
Вот скажите мне.
Engine.
db.backends.postgreSQL.
И где это?
Давайте зайдем внутрь и посмотрим.
db.backends.postgreSQL.
там же ну типа мы не указываем это писать pg или что он автоматически discovery то есть db бэкэнд вот после сквель что дальше происходит и нет ничего client это бэйс client executable name psql options бла-бла-бла паспорт сервис файл ссылки и дебин им юзер паспорт где движок и
Не здесь.
Дальше.
Компайлер.
Давайте так, здесь просто PsychoPG.
Используется как-то PsychoPG.
Да, Django BKS, Backend, вот, PsychoPG Any.
Сейчас, Django DB Backends.
Вот если я хочу MariaDB.
Что надо сделать?
То есть, MariaDB uses MySQL backend, which is shared between the two CISO MySQL nodes.
MySQL nodes.
Jungle spec DB information schema database.
Так, я не понял.
То есть, если я вот здесь просто открою MySQL, то здесь будет...
Тоже понятно, что угодно.
Так, PsychoPG Any.
Вот мы смотрим.
Значит, как он пытается PsychoPG... Вот, он пытается из PsychoPG импортировать.
Если не получается... То есть это PsychoPG 3 уже.
Это PsychoPG 3 принудительно.
Если не получается, он такой, ладно, возьму PsychoPG 2.
Все, конец.
То есть он даже не дает мне возможность поставить какой-нибудь async.pg.
Он говорит, либо третий использую, ну, либо так уж и быть, я буду второй использовать.
Вот где из async.pg используется?
Поиск, все места.
Алло.
Вот.
Смотрите, вот это, кстати, кнопка pin, а на деле это open tool window, то есть это не pin, потому что оно запинено не будет.
Смотрите, видите, PyCharm показывает иконку pin.
Нажимаю.
Это не pin.
Потому что если я нажму правой клавишей мыши, вот здесь pin есть отдельно.
Нажму pin, и вот она pinned.
Если я unpin сделаю, вот закрою.
Смотрите, нажму еще раз.
Здесь уже будет нормальная кнопка.
То есть это bug.
Вот это open into window.
Это bug.
Видите, иконка поменялась.
Только что была другая.
Запускаю.
Значит, импорты нас не интересуют.
Мы импорт убираем.
Value read.
Где мы проверяем?
Connection.
Ммм.
Ну, короче, нет у нас каких-то, вот курсор, да, создается, вот идем туда, у нас нет каких-то способов вообще другой движок взять, то есть джанго нас в этом плане очень сильно ограничивает, чего я не ожидал, я думал, что мы псайкопг сейчас возьмем и асинк начнем использовать, но нифига, вот давайте напишем псайкопг асинк.
Incarnate Operations.
Так, у Джанги свои бэкэнды, которые под капотом используют драйверы, их уже не поменять, синтепогей не вкрутить, короче.
Ну, я думаю, что мы можем заменить на свой, сделав копию вот этого, то есть сказать на бэкэндс, вот копировать в PostgreSQL, вот этот клиент свой определить и вот здесь использовать, ну где там, где у нас там было компайлер, где мы только что были?
Вот здесь.
Нет.
вот здесь base, да, это base frapper, да, postgresql, вот у нас тут, вот base, вот здесь мы к psycpg обращаемся, ну, к там свойствам psycpg, да, и здесь начать обращаться к своему чему-то, но это будет прям переделывание, то есть вот у нас никакого асинхронного, хотя могли, то есть здесь вот ничего не мешало сделать вот этот async connection, да, тут у нас async connection не существует, проверяем postgres, async connection не существует, просто connection существует,
Да, давайте, case sensitive, да, вот, connection pool, вот, psycpg pool, вот, берем connection pool, все, он берет connection pool, ну, connection там, неважно, сейчас в данном случае, то есть async вообще не используется, хотя могли бы, то есть оно в комплекте идет, оно даже не надо ничего дополнительно ставить, очень странно, очень странно мне это видеть.
Обидно.
Ну, типа, недораскрыт потанцевал.
5.2 LTS будет джанга.
То есть в нее уже новые фичи не придут.
Она уже все LTS.
То есть могли бы сказать, вот у нас еще в 5.2 вот финал.
Это прямо асинк работает.
Но нифига.
Не знаю, может есть какие-нибудь мерч-реквесты.
Джанга.
Гитхаб.
Давайте.
Пул реквестс.
Асинк айо.
Кстати, ну ладно, кто-то просто рефакторит код ради рефакторинга Вот был гейзер
Вот ТАСС-группа.
Ну, это нормально, но это... Use Cache Connections?
Нет.
Fix?
Нет.
Supporting Database Connections and Coursors?
О-о-о!
Июль 24-го года.
Год назад это было.
Без пары месяцев.
Без трех.
Сколько?
Май, июнь, июль.
Без трех месяцев.
Девять месяцев.
То есть уже висит.
Что тут не хватает?
Эхо вытащит скриншот с InBoss.
То есть он скриншот не добавил.
Смотрим, работа велась девять месяцев назад.
Что говорят?
Короче, это могло приехать в 5.2, но не приехало, потому что обсуждение, обсуждение.
Кстати, тот мирчий квест, который мы с вами делали в FastApp и JSONAPI, до сих пор не приехал, там кое-что надо поправить, до сих пор не поправил.
Может, на следующей неделе у нас будет эфир, очень интересный, но чуть позже скажу.
Ну, мне интересный, да, вам не знаю.
Отлично, то есть две недели назад все еще работа ведется.
так, во-первых, во-первых, я открою это в браузере, где нас тут теплая поддержка ждет, как там заботливые руки поддержки, агента поддержки, и нажму здесь watch, потому что мне очень интересно, subscribe, очень интересно, что здесь будет происходить, и бла-бла-бла-бла-бла, бла-бла-бла,
Ну, короче, работа ведется, смотрите.
Реально работа ведется.
Возможно, в Django 6 мы увидим реальную работу с синхронщиной, с базой данных.
Слушайте, ну, ждем.
Там есть уже планы на Django 6?
Давайте посмотрим.
Django 6.
Ой, Django... Ну, короче, вот Release Notes.
И вот здесь у нас есть Dev.
Вот Dev-версия.
Нет, не пятый.
Вот Dev.
Нет, это все равно пятый.
Опять два.
Эм...
Так, Django Next Version Dev Notes.
Release Notes, вот где у нас тут?
5.1 Release, а где 5.2?
А это 5.1, блин.
Ммм...
Нас на 5.2 кидает.
Но вот я хочу сейчас... Вот я если укажу 5.2, но мне же это ничего не даст.
Я хочу, что у нас готовится.
То есть следующее, что будет.
Вот релиз 5.2.
А как мне увидеть, что будет следующим релизом?
Final releases.
То есть это вот завершенные.
Security releases.
Нет, неинтересно.
Где грядущие?
Где грядущие релизы?
Как там?
Coming releases.
Джанго.
О, релиз нот.
А, вот, underdeveloped.
Вот, почему нельзя было мне... Ладно.
Короче, что нас ждет в декабре 25-го года?
Слушайте, в этом году уже.
Крутяк, жду.
Несовместимости некоторые будут.
Backend API, что нам тут дают?
Create SDB неинтересно.
Drop support MariaDB старый, Python старый дропается.
3.12, такой уж старый.
Ну ладно, будет 3.14, сейчас выйдет скоро.
Или осенью выйдет, не помню.
Короче, скоро будет 3.14, вот 3.12 уже дропнут.
Ну окей.
Что тут еще?
Так.
3.12, 3.13.
Подождите, так написано же «дроп» будет.
3.12 «дроп» будет, а здесь написано «поддерживает».
«Django 6» будет поддерживать.
Подождите, еще раз.
«Incompatible changes».
А, менее чем 3.12, то есть 3.12 это минимум.
Все, все, все.
3.11 дропнули, окей, все, сори, я неправильно прочитал.
3.12, 3.13, и может быть потом 3.14 будет.
Сетпайт, саппорт, фолдер, версия джанго, бла-бла-бла.
Так, что здесь меняется?
Майнор фичерс.
Что-то в админе поменяется.
Паспорт 4.
Интересно, контреп аут.
Усиляют безопасность, окей, неважно сейчас.
Месседжес, давайте, что касается базы данных.
Что касается базы данных, migration, модулс.
Чек, агрегейт, ордер бай, пейджинейш, сервизация, темплейс, тест, вальдейт, резбекус, инкопетабл, дейтбейс, бэкэнд, апи.
Нет, дроп нет, миссиланс нет.
Короче, пока, давайте, асинг.
Давайте посмотрим, что они тут нам предлагают.
Опять, вот я не понимаю.
Не туда браузер меня тыкает.
Что у нас тут из методов?
Метод account.
Все?
То есть async paginator, а get page И здесь вместо get page А внутри что?
Внутри вызовы синхронные?
Синхронные Что, Django 6 станет версией?
Где синхронично случится или нет?
Request templates Все, да?
Все.
Не надеемся.
Не надеемся.
В 6.0, похоже, не будет.
Либо пока, пока не планируется.
Окей.
Жаль.
Ладно.
Значит, за этим следим.
Следим.
Может быть, наконец-то будет.
И давайте мы... Сейчас.
Мне показалось?
Да, показалось.
AsyncConnectionHandler.
Вот.
И как он делает, например, async.pg или что?
Псайка ПГ, но у нас есть... Вот, Псайка ПГ, вот.
Вот.
Он PostgreSQL, то есть вот у нас реально... А, смотрите, к 6.0, он планирует к 6.0 это сделать.
Крутяк, крутяк, все.
То есть, смотрите, вот у нас готовится релиз ноут.
Только, только для этого?
Блин.
Или это просто... Я думаю... Короче, это только для курсора асинхронного или прям будет async работать?
Вот, это raw SQL queries, а просто асинхронно с базой будет работать или нет?
Так, это алхимия.
И чё?
Что-то еще, ладно Короче, короче Я рано радовался, похоже, только пока курсор будет дергать Ну ладно, хоть что-то, хоть что-то ждем Может оно выльется наконец-то в асинхронную работу Реальную Окей, так, возвращаемся к нашим задачам Sorry, я тут что-то распыляюсь Так, пока мы ждем Пока мы ждем
Это, кстати, было 40 минут назад.
Ждем и все ждем.
Значит, мы возвращаемся к joke-апе.
Идем в наше приложение и делаем jokes...
jokes и мы делаем так jokes api url опять же параметры сейчас никакие не прописываем мы просто делаем вставляем jokes api url делаем async def get single joke и мы отсюда вернем строчку то есть мы возвращаем отсюда
string мы делаем async with io нет httpx async client is client response client get jokes api не проверяем ответ никак делаем просто return response.json только не value а joke
Все.
Странно, кстати, что здесь JSON не асинхронный, то есть контент у нас что, уже синхронный, то есть он вычитан уже.
Это мы в get делаем и вычитываем сразу же ответ.
Мне странно, в IHTP сделано как будто круче.
Там данные надо ждать отдельно, вдруг мне не надо было их ждать.
Окей, jokes мы дергаем тоже, get single joke, идем в views и мы делаем...
joke получается joke равно await пока что да у нас нет сейчас гейзер таз группы ничего но пока так значит мы делаем joke равно joke и отобразим joke сделаем какой нибудь quote да или как там
Alert, alert он называется.
Вот, alert.
Просто шутка дня, шутка минутки текущей.
Вот куда-нибудь вот такой вот.
Alert light.
Alert light.
Идем после currencies.
Делаем еще какой-нибудь HR.
Horizontal, это прочерк.
И вот сюда мы joke засунем.
Joke.
Все, готово.
Обновляем страничку.
Нету.
Вот эту.
Бац.
Но заметьте, нам пришлось подождать То есть у нас уже какое-то время на загрузку есть Ну у нас тут каждый раз новый текст, да Но какое-то время на загрузку есть Чтобы не быть голословными, мы все-таки возьмем Django Debug Toolbar, проверим быстренько скорость Кстати, Django Debug Toolbar работает с асинхронным Django Debug Toolbar работает с async view Debug Toolbar async view
Неужели нет?
Так, add async tests.
Так, смотрим.
Давайте релиз ноута посмотрим просто.
Кстати, с JustBand переехали в Django Commons.
Классно.
Идем вот сюда, в документацию.
И change log async.
Угу, wrap in async to sync, короче, поддержали, поддержали, поддержали, значит, мы его можем поставить, значит, мы идем в installation, пишем install jungle debug toolbar, делаем это так, для начала мы закоммитим то, что мы это вообще в целом добавили, для этого мы сделаем...
Так, давайте create jokes API, create jokes API service, дальше show joke on dashboard, show joke on dashboard.
Так, здесь все окей, да, commit.
Теперь мы идем в терминал, пишем, давайте остановим вообще пока, uv add-dev, это только для dev, junk debug toolbar, и выполняем настройки.
У нас там вообще супер легко в последних версиях junk debug toolbar это делается.
Мы идем в settings, кстати, files есть, templates у нас junk используются, install app.
Вот, debug toolbar, идем в settings,
Идем сюда.
Здесь у нас будет third party.
Third party.
И my.
И вот здесь у меня third party.
Jungle debug toolbar.
Затем, почему-то, они вместо того, чтобы в настройках продолжить работу, говорят, урлы добавьте, а потом добавьте middleware.
Но middleware-то у нас тут же, поэтому я, не уходя далеко, здесь вставляю.
Его только нужно добавить в самое начало или в самый конец.
После... Сейчас.
As early as possible.
На самый верх.
Вот, добавляем.
Internal IPs.
Вот, опять же, мы все еще в настройках.
Идем, Internal IPs добавляем.
Вот здесь Allowed Hosts, Internal IPs, Local Host, 4.0 тоже сделаем.
Вот.
Так, Disable Toolbar для тестинга.
Не важно сейчас.
неважно неважно вот и теперь мы добавляем вот здесь urls url patterns идем в urls и вот здесь добавляем вот toolbar urls и там вернется пустой список если у нас дебаг вот если дебаг то вернется пустой список все потрясающе мы настроили junk debug toolbar давайте проверим сработает ли он или я что-то еще забыл в докере у нас не в докере все окей должно работать смотрим дешборд обновляем бац потому что я остановил запускаем заново смотрим давайте проверим home page
Грузится здесь окей.
Дэшборд.
Ага, грузится.
И что мы видим?
Мы с вами видим, что грузится медленно.
Теперь мы можем убедиться, что грузится медленно, посмотрев на цифры.
Вот у нас 573 миллисекунды тайм.
Мы можем посмотреть 4 запроса.
Ну ладно, окей.
Resource usage нет.
Давайте мне подробнее, что происходит.
Профайл.
Тут есть профайл.
Вот профайлинг.
Вот, я говорю, теперь давай-ка мне заново загружай, и теперь я могу зайти в профайлинг, и он мне скажет, слушай, ну вот, например, у тебя тут вызовы эти, где они?
Ничего не скажет.
Где мои вызовы?
Где вызовы моего кода?
Нифига.
Ладно, ну и не очень-то и хотелось.
Общее время видим.
Давайте так.
Time 484 миллисекунды, 400 миллисекунд, 530, 386, то есть в районе 400, 450 до 500.
работает окей 380 самое маленькое что получилось просто повторными запросами теперь во первых мы к митинг что мы джан где бакту бар установили значит мы смотрим settings здесь вот эти только строчки лишние есть поставили здесь поставили urls да и то есть все и стал джан где бакту бар чтобы написать с ошибками ставлю и идем теперь в
вот наше тестирование, только не нагрузка, но просто замеряем, и вот это все в таз-группу, просто пользуемся асинхронщиной, то есть ради чего мы это делали, вот мы могли бы написать в синхронном виде ровно так же, то есть мы делаем запрос профиля, запрос currency, запрос joke, все это складываем и рендерим, но я хочу этим воспользоваться в синхронном виде, и я делаю async with, ну конкурентно, да, with таз-групп,
Ну, я называю ее TG обычно.
И мы делаем так.
Значит, TaskGroup.
CreateTask.
Вот это получить.
Create task.
Здесь профайл мы сейчас отдельно получим.
Значит, вот, task group.
Create task.
Передали.
Дальше.
Мы это записываем как profile.
Давайте get profile task.
Или profile task, да, чтобы короче было.
Дальше.
Joke и currency то же самое.
Currency task.
Currency task.
Таск.
Я почему не делаю гейзер, потому что это более явные, без распаковки, там, без передачи позиционной распаковки.
Здесь прям явно происходит, что нам нужно.
То есть, эвейты все снова исчезают.
У нас асинки только, асинки with случаются.
И я вставляю сюда эти значения.
CurrentSysTask мы получим отдельно.
Joke.
То же самое мы делаем.
JokeTask.
CreateTask.
GetSingleJoke.
Вызываем обязательно.
Создаем коррутину.
Все, мы сделали.
Теперь мы при выходе из TaskGroup получим эти значения.
Значит, профайл.
ProfileTask.Result.
Вызываем этот метод.
CurrenciesTask.Result.
И joke.
JokeTask.
Мы ожидаем прироста, ну, хотя бы там на 50%, ну, хотя бы на 30%, ладно.
Даст ли это нам прирост?
То есть мы теперь самый медленный ждем, ну, дольше всего, а остальное, ну, как и было.
Значит, мы идем в...
на эту страничку, да, у нас тут была история, там 380 самое медленное, 500 с копейками самое долгое, то есть 380 пока было самое быстрое, 500 с копейками самое длинное, обновляем, бац, 153 миллисекунды, в три раза быстрее, 380, как и было, обновляем еще, 285, ну, то есть, если усреднять, вот, меньше 300, 200, да, 215, 260, то есть уже не 450-500, а 250-300,
Вот, видим, что действительно мы получили прирост от асинхроничной.
Вот 210 держится, 204, 218, 265, 264, 187.
То есть мы получили реальный прирост.
производительности наша страничка реально стала ну либо не быстрее то есть ну не медленнее точно да либо не быстрее 389 то есть у нас даже на синке было 380 но в хороших случаях даже в полтора два раза быстрее то есть 180 мы видели в сравнении там с 450 и так далее это сильно сильно быстрее 230 вот мы в районе 200 с копейками держимся класс по моему класс то есть мы вот видим
Что это работает?
Кстати, здесь у нас переносы строк не случаются, да?
Давайте мы скажем ему line breaks.
Вот здесь у нас есть line breaks.
Line breaks, вот.
Line breaks.
Line breaks.
Мы идем в шаблончик.
Здесь говорим joke line breaks.
То есть наши питанячьи... Давайте посмотрим line breaks.
Наши питанячьи новые строчки становятся bear'ами.
Вот, давайте проверим, что у нас теперь некоторые ответы, некоторые jokes будут.
И давайте, кстати, вот сэма проверим тоже.
Некоторые jokes будут у нас...
с переносом строки.
Так, обновляем пару раз.
Ну, здесь перенос случился, но в конце нам не нужен.
Давайте мы сделаем стрип.
Стрип.
Стрип.
А как стрип у нас делается?
Ладно, понятно, стрип у нас делается на стороне нашего кода views.
Вот здесь joke task.
Вот здесь мы делаем стрип.
Вот.
И обновляем пару раз.
Нет, слушайте, перенос внизу, это... Ну, короче, переносы мы видим.
Honey, go to store and buy some eggs.
Окей.
Короче, пока ты там, возьми молока.
Все, он никогда не вернулся.
То есть, пока ты там, возьми молока.
Но пока ты в магазине, возьми молока.
Ты в магазине, взять молока.
Короче, работает.
Давайте посмотрим только source.
Меня волнует source.
Почему здесь у нас лишний перенос появляется в конце?
Смотрим, div alert, paragraph.
А, потому что у нас paragraph.
У нас тут paragraph появляется из-за line breaks.
Да, и вот это ровно что нам и предлагали сделать в force escape.
То есть дело было не в...
Например, если вы хотите поймать элементы P, созданные байлайн брейксом.
Фильтр.
Ээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээээ
А, HTML, HTML отобразить.
Все, я понял, не то.
Так, по HTMLX пока что молчат.
Ну, по ролику.
Вот здесь почему у нас после параграфа такой отступ жирный.
Видите, какой отступ после параграфа?
Если не хочу здесь параграф, как мне быть?
Как мне быть?
Как мне быть?
Нам просто в html отдастся, да, отображение?
Да, вот он paragraph делает.
Если я не хочу, если я хочу line breaks, но without paragraph.
Так.
Django line breaks without paragraph.
О!
А что за... Был звук вк?
Да.
Так, мне пришло уведомление от ВКонтакте.
У вашей трансляции критично низкий битрейт.
Это влияет на ее качество.
При соединении с интернетом оно должно быть стабильным.
Мне прислали ВКонтакте.
Мы идем в кабинет автор нет видеозаписи.
Мы идем еще раз в дешборд Сурен Харинян.
идем в трансляцию нет я хочу просто вот сюда видео и идем в эфир смотрим 8000 килобит битрейт это слишком мало
при том, что я отдаю 9 или 10, но вот так оно доходит.
8000.8, 9000, 9000 килобит у меня, 9000 килобит, то есть 9 мегабит я отдаю, из OBS уходит 10, дальше рестриминг у меня видит типа 8.9, и вот VK видит 8.
Привет!
Вы к самому концу приходите, но, короче, с битрейтом все нормально, а вот по поводу...
По поводу... Моего очень важного вопроса.
Пока что тишина.
Так, значит... Избавиться от... Так.
Стриптекс, вот он.
Ха-ха-ха!
Почему нам Джанго об этом не подсказывает?
Почему вот здесь нет примера стриптекс и потом... В смысле, этот, line breaks, потом стриптекс.
Джанго... Фильтерс.
Еще раз.
Нет, tags, filters вот здесь.
Вот, strip tags, пожалуйста.
Есть же ни одного примера со strip tags.
Хотя вот здесь он как раз-таки очень даже уместен был бы.
Line breaks, strip tags.
Стрип это убрать с краев, да?
Давайте посмотрим, что будет.
Мы возвращаемся на эту страничку.
Здесь, ну, сейчас должно... Да, вот лишнего отступа нет.
Все, значит, вот тот стрип можно убрать.
Смотрим.
Вот здесь get single jog.
Вот этот стрип мы убираем.
Он не нужен, потому что была проблема не здесь.
Вот.
И обновляем страничку.
Бац.
400, 370, 290, 500.
Смотрите, кстати, как будто вы не делали async.
Ну вот 200, 200.
Вот не случалось.
Вот.
Стоп.
А переносы у нас случаются теперь?
Ждем какую-нибудь многострочную шутку.
Угу.
Так, подождите.
Стриптекс это вообще убрать?
Я думал, стрип это как с краев убрать.
Ну-ка, force.
Escape.
Line breaks еще раз.
Обновляем.
Вот, здесь br-ы случились, но я хочу убрать strip p... ... ... ... ... Короче, вот если value вот такое... А, то есть он реально убирает все теги.
Есть что-нибудь типа Strip Text, но убирающая с краев.
Django... Подождите, Line Breaks.
Как работает Line Breaks?
Давайте мы посмотрим.
Вот, как он работает.
Auto Escape, бла-бла-бла, Save Data, Mark Save, Line Breaks.
Вот.
Что он делает?
Он сюда вставляет вот это вот.
Параграф.
Но мне не нужен параграф.
Мне не нужен параграф.
Телефонный разработчик?
Нет, я бэкэнд-разработчик.
Так, как ты участвовал в джанго?
А, привет, он читает чат, да, я читаю чат.
Как ты участвовал в джанго?
Я пилил проекты, пилил проекты просто, какие-нибудь проекты.
Кстати, на бусте планирую, когда 100 подписчиков будет, там сейчас 74, сделать разбор моих там первых 10 проектов, вот прям самых первых.
У меня есть код, я его нашел.
И я хочу показать, у меня там, я его не смотрел, у меня там явно будут проблемы с кодом.
Я помню, в какой-то момент я писал в CamelCase, потому что я увидел, что кто-то во втором питоне так пишет, а я на третьем так тоже начал делать.
Но там мне просто интересно посмотреть, какие решения я принимал, типа, 7-10 лет назад.
нет, десяти нет лет, я в семнадцатом, шестнадцатом-всенадцатом начинал писать на питоне где-то так, шестнадцатом-всенадцатом, в семнадцатом я уже работал разработчиком, в восемнадцатом я перешел на новую полноценную работу в семнадцатом я работал full stack, в восемнадцатом я перешел на полноценную новую работу чисто Python backend короче, вот этот line breaks но только можно мне без p вот без этого p как мне это сделать?
О, line breaks bear, вот.
Вот он.
То есть я до него не докрутил просто.
Becomes a paragraph, вот.
Потрясающе.
Короче, все, решается гораздо проще.
Хорошо, что я в сорс люблю лазить, и там все это нашел.
Потому что док не дает мне ответа, даже такой рефлоу тут не подсказал.
Значит, то есть вот тут был ответ, смотрите.
А, ну это совсем убрать, ну ладно.
Значит, обновляем страничку еще раз, бац.
Во, переносы есть.
Как ты можешь отличить HTML от HTML5?
Попробуй на интернет-эксплорере.
Да, сработало?
Нет, значит, это HTML5.
Все, сори, я тут отодвигаю iPad, на котором комментарии.
Так, я сейчас закончил курс по тому, что дальше делать.
Фигачить проекты, фигачить проекты и искать в чатах фриланс.
То есть кто-нибудь, например, ко мне в чат приходит, говорят, ну, типа, нужен исполнитель на какие-то там заказы, там, Телеграм-бот, что-то еще.
Фигачить, получать опыт и потом идти на фриланс еще фигачить, получать опыт.
Потом, когда вы поймете, что вы готовы, идти на фулл-тайм работу пробоваться.
Оно уберет вообще все теги.
У нас сначала стриптекс, потом лайнбрейкс.
Мы с вами разбрались, стриптекст, лайнбрейкс.
Нет, не подходит, потому что в joke у нас нет тегов вообще.
То есть вот это API, которое мы используем вот здесь, оно не отдает нам лайнбрейки в виде HTML.
Здесь обычные лайнбрейки.
И вот эти лайнбрейки отображаем в виде HTML, как раз таки вот лайнбрейкс.
БР, БР, просто чтобы БР поставились и все, то есть еще раз смотрим вот сюда, сюда, сюда, сюда, вот, да, вот как определить HTML или HTML5, вот что, короче, новые строчки есть, бла-бла-бла, бла-бла-бла, бла-бла-бла, вот, новые строчки, судья, я пред...
Я вас осуждаю на максимальное наказание.
Я мечтаю о том, что пусть это будет смерть.
Пожалуйста, пусть будет смерть.
Судья, выучи джаву, блин.
Ну, такие вот шутки про джаву.
Что, у нас мало шуток тут?
Вот, повторяются.
Her roses are red.
Это blue.
I use hex holes, but I use RGB for you.
Интересно, тут...
Тут какая-то игра слов, что я не понимаю.
RGB for you я бы использовал.
Либо это просто шутка про RGB и хексы.
Так, на DRF пишешь?
Обычно нет.
Вот предыдущий эфир неделю назад был про DRF.
Ты пишешь проект на фастапе?
Да, я пишу проект на фастапе.
И я делаю сейчас новый курс по фастапе.
Я уже понял, думал о пишечках с P. Да, о пишечках без P.
Давайте, кстати, напомним, и мы с вами на самом деле будем закругляться, да?
Сейчас закоммитим, что у нас тут.
Так, дэшборд.
Давайте так, дэшборд шоу, шоу джоук виз лайн бреакс он дэшборд.
И дальше...
views, вот, мы делаем task group for async view.
Task group, ну, точнее, for calls in async view.
Сохраняем.
Так, а можешь немного больше рассказать про самостоятельное обучение?
Просто сейчас заканчиваю и как-то по себе не понимаю, что делать.
Да, давайте в двух словах я покажу очень простой пример.
Вам нужно найти что-то, что уже за вас сделали, и по этому как-то учиться.
Например, я вот иду
В... не ответили до сих пор.
Я вот иду под это видео, да, у нас тут есть вот я. Я открываю вот этот ролик и вот здесь перехожу, вот все ссылки на мои ресурсы.
значит ну понятно что можно там на ютюбе на рутубе где угодно найти кучу моих роликов посмотреть их потренироваться но самое ценное что есть это любые готовые составленные программы я покажу на примере своей программы потому что почему нет но что мы здесь делаем опять же вот то что я показываю это бесплатно это не требует от вас внесения каких денег вы просто открываете любую программу на любом сайте который вам нравится любого автора вообще у любого и смотрите что написано
думаете с чем вы из этого не знакомы и ищите на ютюбе ролики как вот это сделать все вот здесь вот не то что небольшой список но это вполне за полгода разобраться с этим самостоятельно можно будет я планирую чтобы на курсе это вот полностью дать за полгода и тут есть у меня подробная программа уже по занятиям то есть вот вы если не знакомы с чем-то из этого пожалуйста знакомьтесь вот мы например сейчас пилим большое фастапе приложение
это большой модуль вот у нас первый это прям знакомство про это почти все ну не все конечно из этого но многое было у меня на канале но в таком разбитом виде вы ищите там 10 сколько больше роликов про фастапе смотрите изучайте здесь уже структурировано про аутентификацию дальше с докером работаем редис тут про редис говорим команды в терминале очень классные пишем
Работаем с типизацией, соблюдаем код стиль, это прирождение к соблюдению код стиля, всякие roof, там pre-commit, black, ну и так далее.
Дальше юнитесты прошли уже, то есть тестирование, проверяем покрытие, пайтест, это только половина модуля вышла, ну точнее вышла, записана, выйдет скоро, ну как скоро, летом, потому что я выкладываю, каждую неделю я выкладываю новый модуль, какой-то модуль может быть на 10 уроков, какой-то на 5.
ну просто модулями удобно себе отсечки делать вот пожалуйста изучайте вот все что вы видите изучайте тут просто в чем еще прикол курса опять же то что тесты и что я активно помогаю в чате постоянно отвечаю будут дипломные работы будут курсовые работы буду проверять будете защищать приходить на общий эфир и будет несколько человек защищать свой проект проекты я буду проверять буду вам помогать так что научу реально писать приложения которые я хочу видеть от тех людей которых я нанимаю себе в команду
если вы переходите по моей ссылочке, оплачиваете по моей ссылке, то я получаю пониженную комиссию и мне очень приятно, если вы просто из каталога находите, я плачу половину стоимости платформе и мне, конечно, очень приятно, что вы присоединяетесь в любом случае, но если вы вдруг пришли от меня, а не из каталога, то перейдите по моей ссылочке и у меня будет сниженная комиссия
вот короче берете любой это я показываю на своем примере берете любую готовую программу находите любой сайт где вы знаете вот про обучение и пользуйтесь этой программой для того чтобы составить свою программу то есть смотрите чего вы из этого не знаете и изучаете и
Так, значит, что еще важно?
Читать документацию полезно не просто как книжку читать, а вот сейчас, как мы с вами пытались, искали в документации решение.
Если вы начинаете работать с новой секцией, то да, полезно.
Вот если вы, например, с Django только начинаете работать, то у Django вот здесь...
На главной есть вот First Steps и вот этот туториал из 7, там 8, не помню, 10 занятий.
Пройдите, прочитайте целиком и выполните все, что они тут пишут.
Выполните все, разберитесь, и тогда вы сможете уже нормальное приложение на Django написать.
Так, а время тем временем у меня на часах 9 часов вечера по Москве, и нам до сих пор так и не ответила заботливая поддержка, поэтому, кому интересно, чем закончилась эпопея с тем, что мне в ВК заблокировали ролик по авторским правам, который мой ролик полностью мной сделанный, следите за Телеграмом, я в Телеграме все напишу, как в Телеграм попасть, пишите либо канал Сурена и находите просто канал Сурена, кстати, интересно, в Гугле он находится, давайте проверим, канал Сурена.
Это другой Сурен, со всем уважением.
Вот Телеграм, Телесурен.
Нет, это канал другого Сурена.
Пожалуйста, я не претендую ни разу.
А дальше Питон напишем, ну-ка.
О, Сурен, находит.
Короче, находите любой канал или под этим видео смотрите.
описание там есть ссылка на все ссылки вот здесь мы переходим везде есть ссылка на все ссылки вот ссылка на все ссылки нажимаем сюда переходим на ссылку на все ссылки и здесь находите любой ресурс где вы хотите что-то про меня найти и вот канал в telegram это здесь я буду обновление по тому что происходит писать куда мой ролик делся на телегу подписался класс спасибо у джанги шикарный туториал да у джанги шикарный туториал как мы сегодня увидели только у джанги печально
с асинхронной, но ждем, ждем, потихоньку развивается, потихоньку будет, вот, в общем-то, давайте краткий итог по коду, значит, все, что нам надо было сделать, на самом деле, это вопрос там 15-20 минут, наверное, идем в views, и все, что мы сделали асинхронное, это у нас task группа, мы получаем здесь профайл,
асинхронно с юзером.
Получаем exchange rates асинхронно, то есть внутри у нас асинхронично тут HTPX использовал.
Можно было HTTP использовать, но я HTPX сделал для примера.
И мы берем еще вот joke с API шуток.
Отдаем joke.
Все.
Я дальше...
Складываю это в словарик, отдаю в шаблон.
То есть здесь вот асинхронично вся вот здесь заканчивается.
Ну, из-за этого async view.
Единственное, что надо было еще поменять, это в шаблоне home.
Так, давайте вот здесь у нас.
вот здесь, base, нет, вот здесь, в navbar, вот здесь у нас обращение к a user должно быть, а не к user, откуда a user берется, это мы идем в middleware, это мы можем найти вот здесь в settings, здесь мы идем в middleware authentication, и вот здесь есть a user, это асинхронный user, вот partial a user, откуда мы берем a user, это у нас вот эта функция,
Partial у нас работает из асинхронщины.
Окей, это я упустил.
Или что?
Или Django где-то в шаблоне сама ждет потом.
Ну, короче, ладно.
Вот здесь нам возвращается закэшированный юзер.
Если он не в кэше еще, а надо бы, то вот aget user.
Но интересно, а можем ли мы middleware сказать, что нам всегда надо юзера подтягивать, зачем нам его тянуть?
Ну, ладно.
В общем, мы делаем aus aget user, то есть как get user, только асинхронно.
Вот у нас получение.
Но это все встроено уже.
Да, вот у нас await случились.
Все, вернули юзера или анонимуса.
Все, прекрасно.
Короче, вот так работаем с Django в асинхронщине.
Мне не очень понравилось.
Мы не можем поменять движок в Django, то есть движок, который используется по умолчанию в PSI-KPG.
И несмотря на то, что PSI-KPG поддерживает асинхронную работу, тем не менее в Django используется синхронный подход, засунутый в Threadpool.
Вот, и все.
Вот, ну а так работает, то есть вот это все, таз-группа, она выполняется конкурентно, то есть никакой из этих запросов не блокирует другой, и когда мы все дождались, мы выходим из таз-группы и отдаем результаты по всем.
Вот и все, это вся асинхронщина по...
джанги нам по моему заблокированному моему же ролику по моим авторским правом точнее кому они принадлежат неизвестно пока не ответили это в телеге отвечу приходите приходите на курс если у вас вопросы по курсу есть какие-либо я называю на самом деле курсом а в чатах я это пишу образовательная программа потому что у курса такой флёр небольшой есть ну не знаю мне не очень нравится
Это прям большая образовательная программа, она будет долго выходить, я надеюсь до конца года успеть выпустить, может быть в сентябре, где-то закончу в октябре, посмотрим.
Там очень большой объем, мы будем писать реальные приложения, несколько проектов, 2, 3 или 4, пока что я между 3 и 4 мечусь, скорее всего будет 3, но плюс-минус 1.
проект реально и напишем и на каждое занятие есть задание почти на каждое занятие есть задание а на более сложные задания есть даже разбор поэтому приходите просто приходите под любым видео нажимаете на ссылку на все ссылки там написана моя программа на степик очень синхронно отвечают
Ну, конкурентно отвечают или про что?
А, в чате?
В чате, да, постоянно отвечаю.
Как разобраться с ДРФ?
Мой предыдущий эфир неделю назад открываете на любой платформе.
Там мы знакомимся с ДРФ.
Все показываю.
пожалуйста вот все на этом закрепляюсь огромное всем спасибо что присоединились очень приятно пожалуйста пожалуйста ставьте лайки неважно вы смотрели в прямом эфире или в записи ставьте лайки мне супер приятно когда ставят лайки почему а потому что это дает мне понять что я делаю что то что все делаю хорошо вот поэтому
Сегодня, к сожалению, кстати, донатов не было, но что поделать.
Приходите в любые соцсети, все ссылки найдете, и на этом я буду завершать эфир на всех площадках, поэтому всем удачи, любые вопросы в Telegram-чате в открытом, в Telegram-чате на Boosty отдельный Telegram-чат, и в рамках образовательной программы тоже отдельный чат.
Везде отвечаю, каждый день, постоянно, если не я ответил, то кто-то еще ответил, очень классные ребята сидят, всем отвечают.
Все.
По всем вопросам пишите, найдете где.
И до новых встреч.
Всем спасибо большое за внимание, за участие.
И всем пока-пока-пока.
Всем удачи.
Любые вопросы в Telegram-чате.
Похожие видео: Асинхронное Django приложение

Приложение на Django + DRF и сравнение с FastAPI-JSON:API

#5 Django "кулинарный портал" (Часть 4)

#1 Django "кулинарный портал" (Часть 1)

#3 Django "кулинарный портал" (Часть 2)

#11. Пользовательские теги шаблонов | Django уроки

