<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/">
  <channel>
    <language>ru</language>
    <title>Django</title>
    <description>Django — это свободный фреймворк для веб-разработки на Python. В этом разделе вы найдёте гайды, советы и шпаргалки по Джанго для программистов всех рангов.</description>
    <link>https://tproger.ru/tag/django</link>
    <atom:link href="https://tproger.ru/tag/django/feed" rel="self" type="application/rss+xml"/>
    <lastBuildDate>Sat, 03 Oct 2026 14:16:23 GMT</lastBuildDate>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>12</sy:updateFrequency>
    <image>
      <title>Django</title>
      <link>https://tproger.ru</link>
      <url>https://tproger.ru/apple-touch-icon.png</url>
    </image>
    <item>
      <title>Кнопка «наверх» в Django: почему в проде это уже не три строки JavaScript</title>
      <link>https://tproger.ru/articles/knopka-naverh-v-django-pochemu-v-prode-eto-uzhe-ne-tri-stroki-j</link>
      <comments>https://tproger.ru/articles/knopka-naverh-v-django-pochemu-v-prode-eto-uzhe-ne-tri-stroki-j?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Фёдор Малков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/knopka-naverh-v-django-pochemu-v-prode-eto-uzhe-ne-tri-stroki-j</guid>
      <description><![CDATA[<p>Как добавить кнопку «наверх» в Django-сайт и Django Admin: настройка, CSP, доступность, мобильная версия и работа рядом с cookie-баннерами.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/knopka-naverh-v-django-pochemu-v-prode-eto-uzhe-ne-tri-stroki-j">Кнопка «наверх» в Django: почему в проде это уже не три строки JavaScript</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[jQuery]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[MIT]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Дизайн]]></category>
      <category><![CDATA[CDN]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 01 Jul 2026 13:01:06 GMT</pubDate>
      <content:encoded><![CDATA[<p>Как сделать scroll-to-top для сайта и Django Admin, не забыв про мобильные устройства, CSP, доступность, плавающие виджеты и нормальную настройку без правки шаблонов.</p><p>На первый взгляд кнопка «наверх» — задача на пять минут. Добавил<i> position: fixed</i>, обработчик window.scrollTo()  — готово.</p><p>Но стоит этой кнопке появиться в живом проекте, как выясняется, что она пересекается с cookie-баннером, мешает чату поддержки, выглядит иначе в мобильной версии, не дружит со строгим CSP или пропадает из Django Admin.</p><p>В итоге маленькая UI-деталь начинает обрастать условиями. Я решил собрать их в отдельный Django-пакет — django-scroll-to-top</p><figure><img src="https://media.tproger.ru/user-uploads/139342/2026-06-29/000bf08b-be8e-4252-82ce-dbef3556426e.webp" alt="Пример кнопки &quot;Наверх&quot; на демо сайте" /><figcaption>Пример кнопки "Наверх" на демо сайте</figcaption></figure><h2>Когда трёх строк JavaScript достаточно</h2><p>Для небольшого сайта, где нет сложной верстки, админки, CSP и требований к повторному использованию, самый простой вариант действительно выглядит примерно так:</p><p>Это нормальное решение. Не всегда стоит тянуть пакет ради одной кнопки.</p><p>Но в реальном Django-проекте быстро появляются дополнительные вопросы:</p><ul><li>когда именно показывать кнопку: после 300 пикселей, одного экрана или только при прокрутке вверх;</li><li>что делать на коротких страницах;</li><li>как не перекрыть cookie-баннер, чат, toast-уведомления или нижнюю мобильную навигацию;</li><li>как дать пользователю закрыть кнопку;</li><li>как не сломать клавиатурную навигацию и режим reduced motion;</li><li>как сделать отдельное оформление для сайта и Django Admin;</li><li>как не заставлять проект добавлять unsafe-inline в Content Security Policy;</li><li>как позволить редактору или администратору изменить цвет, положение и иконку без нового деплоя.</li></ul><p>Именно в этот момент «три строки JavaScript» превращаются в отдельный компонент.</p><h2>Что я хотел получить</h2><p>Цель была не в том, чтобы сделать ещё одну стрелку в правом нижнем углу. Хотелось собрать переиспользуемый компонент со следующими свойствами:</p><ol><li>Подключение сайта одной template-тегом.</li><li>Отдельная поддержка обычных страниц и стандартного Django Admin.</li><li>Настройка внешнего вида через админку, а не через постоянную правку CSS.</li><li>Без jQuery, CDN, фронтенд-фреймворка и обязательной сборки.</li><li>Безопасная работа при строгой CSP.</li><li>Прогрессивное улучшение: без JavaScript остаётся обычная ссылка в начало страницы.</li><li>Возможность жить рядом с другими фиксированными элементами интерфейса.</li></ol><p>Пакет в итоге хранит обычные настройки установки в settings.py, а визуальное поведение — в базе данных. Это позволяет менять кнопку через Django Admin, публиковать новую версию настроек и при необходимости откатываться на предыдущую. В проекте есть отдельные профили для публичного сайта и Django Admin, а ревизии могут быть черновыми, опубликованными или архивными.</p><h2>Быстрое подключение</h2><p>Базовый сценарий начинается с установки:</p><p>В settings.py добавляем приложение. Если нужна поддержка стандартной админки, пакет должен идти раньше django.contrib.admin:</p><p>Включаем области, где должна работать кнопка:</p><p>Для публичной части добавляем URLConf пакета:</p><p>А в общий шаблон сайта — один тег:</p><p>На стандартном Django Admin ничего дополнительно вставлять не нужно: пакет использует обычный механизм разрешения шаблонов Django. Если же в проекте переопределён admin/base_site.html  тег можно добавить вручную в блок footer</p><h2>Настройка без превращения админки в редактор CSS</h2><p>Мне не хотелось хранить в базе шаблоны, произвольный CSS или JavaScript. Это неудобно для сопровождения и создаёт лишнюю поверхность для ошибок.</p><p>Поэтому визуальная часть собрана из контролируемых вариантов:</p><ul><li>круг, квадрат, скруглённый квадрат или pill;</li><li>заливка solid, outline, soft, ghost, glass или gradient;</li><li>положение в любом углу экрана;</li><li>отдельные размеры для desktop и mobile;</li><li>светлая и тёмная тема;</li><li>встроенные иконки, иконки от разработчика или загружаемые SVG;</li><li>настройки тени, границы, opacity и focus ring.</li></ul><figure><img src="https://media.tproger.ru/user-uploads/139342/2026-06-29/90107109-2271-460a-9dea-815592d468e7.webp" alt="Настройки кнопки" /><figcaption>Настройки кнопки</figcaption></figure><h2>Что происходит, когда рядом есть cookie-баннер или чат</h2><p>Нижний правый угол страницы редко бывает свободен. Там часто живут:</p><ul><li>cookie-баннер;</li><li>компактная кнопка после закрытия баннера;</li><li>чат поддержки;</li><li>кнопка обратного звонка;</li><li>мобильная навигация;</li><li>toast-уведомления.</li></ul><p>Пакет умеет рассматривать такие элементы как препятствия. Для этого можно пометить элемент атрибутом:</p><p>Дальше для кнопки можно выбрать поведение: игнорировать препятствия, сдвинуться вдоль края, попробовать другой угол или скрыться, если безопасного места не осталось.</p><p>Для сложных виджетов есть отдельный адаптер: он может отслеживать появление и исчезновение элементов, например компактного launcher после закрытия cookie-баннера. При этом ни cookie-пакет, ни чат не становятся зависимостями  django-scroll-to-top</p><h2>Доступность — не отдельная галочка в конце</h2><p>У кнопки есть понятное имя для screen reader, поддержка клавиатуры, видимый focus-visible, минимальный размер области нажатия и режим prefers-reduced-motion.</p><p>Если пользователь отключил анимации на уровне системы, плавная прокрутка не будет навязываться. Если JavaScript не загрузился, кнопка остаётся обычной ссылкой на начало документа.</p><p>Полный независимый аудит WCAG 2.2 AA и тестирование масштабирования 200% и 400% пока находятся в roadmap, поэтому называть компонент полностью сертифицированным по WCAG было бы неправильно. Но структурные требования — клавиатурная доступность, фокус, reduced motion, forced-colors и безопасная работа без JavaScript — уже заложены в компонент и покрываются тестами.</p><h2>CSP и загружаемые SVG</h2><p>В корпоративных проектах часто нельзя просто добавить inline-скрипт и включить unsafe-inline ради одной кнопки.</p><p>По умолчанию компонент использует same-origin CSS и JavaScript. Для него подходит политика такого вида:</p><p>Настраиваемые цвета и размеры отдаются не через inline-стили, а через версионированный stylesheet endpoint. Это позволяет сохранить простой контракт с одним template-тегом и не ослаблять CSP.</p><p>Отдельно пришлось подумать о загружаемых SVG. Админ не рендерит исходный файл как есть: SVG проходит санитарную обработку. Скрипты, обработчики событий, внешние ресурсы, встроенные документы и небезопасные namespace отклоняются. Для загружаемых иконок также хранится информация об авторе, источнике и лицензии.</p><h2>Ревизии, публикация и откат</h2><p>Одна из самых полезных вещей в пакете — не сама кнопка, а жизненный цикл её настроек.</p><p>Можно создать черновик, посмотреть результат в live preview, опубликовать изменения или вернуться к предыдущей версии. Это особенно удобно, когда кнопку настраивает не разработчик, а контент-менеджер или дизайнер.</p><figure><img src="https://media.tproger.ru/user-uploads/139342/2026-06-29/c9840966-4e32-4506-807a-ac78830fecfa.webp" alt="Живой предпросмотр" /><figcaption>Живой предпросмотр</figcaption></figure><p>У ревизий есть три состояния:</p><ul><li>draft — редактируемый черновик;</li><li>published — текущая активная конфигурация;</li><li>archived — сохранённая версия для отката.</li></ul><figure><img src="https://media.tproger.ru/user-uploads/139342/2026-06-29/2fcf0cfc-b29e-4ce1-b1de-9c07aac1fce0.webp" alt="настройки ревизий профиля кнопки" /><figcaption>настройки ревизий профиля кнопки</figcaption></figure><h2>Где пакет уместен, а где нет</h2><p>django-scroll-to-top имеет смысл, когда кнопка нужна в нескольких проектах, должна работать в Django Admin, настраиваться без деплоя или жить в окружении со строгими требованиями к CSP и интерфейсу.</p><p>Для лендинга на одну страницу проще и правильнее написать несколько строк самостоятельно. Это будет быстрее, понятнее и дешевле в сопровождении.</p><p>Но если такая маленькая деталь начинает повторяться в нескольких продуктах, появляется необходимость поддерживать мобильную версию, доступность, независимые настройки для сайтов и админки, то отдельный компонент уже перестаёт быть избыточным.</p><p>Сейчас пакет выпущен как beta-версия 0.2.0, требует Python 3.10+ и поддерживает Django 4.2 LTS, 5.x и 6.0. Лицензия — MIT.</p><p>Исходный код, документация и примеры использования доступны в GitHub-репозитории проекта.</p><p>Пакет опубликован в PyPI под именем django-scroll-to-top.</p><p>Обратная связь, баг-репорты и предложения по интеграции с кастомными Django Admin-темами приветствуются в Issues.</p>]]></content:encoded>
    </item>
    <item>
      <title>Python: полный путеводитель для разработчика</title>
      <link>https://tproger.ru/articles/python--polnyj-putevoditel-dlya-razrabotchika</link>
      <comments>https://tproger.ru/articles/python--polnyj-putevoditel-dlya-razrabotchika?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Картофельный Повелитель]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/python--polnyj-putevoditel-dlya-razrabotchika</guid>
      <description><![CDATA[<p>Структурированный гайд по Python: синтаксис, ООП, Django/FastAPI, Data Science, asyncio и GIL. Примеры кода и ссылки на углублённые материалы.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/python--polnyj-putevoditel-dlya-razrabotchika">Python: полный путеводитель для разработчика</a>»</p>]]></description>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Фреймворки и библиотеки]]></category>
      <category><![CDATA[Data Science]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 02 Apr 2026 11:17:39 GMT</pubDate>
      <content:encoded><![CDATA[<p>Python — высокоуровневый интерпретируемый язык программирования общего назначения, который уверенно входит в тройку самых популярных языков программирования в мире. По данным индекса <a href="https://www.tiobe.com/tiobe-index/">TIOBE</a> на начало 2026 года, он стабильно удерживает первое место, а <a href="https://survey.stackoverflow.co/2024/">Stack Overflow Developer Survey</a> подтверждает: Python остаётся одним из самых желанных языков для изучения. Причина — универсальность: веб-приложения, нейросети, автоматизация, анализ данных, боты и управление инфраструктурой. Чистый синтаксис, читаемый код и гигантская экосистема библиотек позволяют писать рабочие программы уже после нескольких часов знакомства с языком.</p><p>В октябре 2025 года вышел Python 3.14 с экспериментальным JIT-компилятором и поддержкой шаблонных T-строк — язык продолжает ускоряться, не жертвуя простотой. Экосистема тоже не стоит на месте: FastAPI стал стандартом для высокопроизводительных API, а инструменты вроде Ruff и uv радикально ускорили рабочий процесс разработчика. Python Package Index (<a href="https://pypi.org/">PyPI</a>) насчитывает более 600 000 пакетов — для любой задачи, скорее всего, уже существует готовое решение.</p><p>Этот путеводитель — не энциклопедия и не учебник. Это навигационный хаб: мы кратко разберём каждую важную область Python и дадим ссылки на подробные материалы Tproger, где каждая тема раскрыта в деталях. Неважно, только начинаете вы знакомство с языком или уже пишете на нём продакшен-код — здесь вы найдёте структурированную карту для дальнейшего роста. Мы охватим основы синтаксиса, продвинутые концепции, три главных веб-фреймворка, Data Science, последние нововведения в Python 3.14 и карьерные перспективы.</p><p>— Python — язык №1 по TIOBE 2026, более 600 000 пакетов в PyPI</p><p>— Основы языка: динамическая типизация, duck typing, встроенные коллекции (list, tuple, dict, set и другие)</p><p>— Три главных веб-фреймворка: Django (full-stack), Flask (микро), FastAPI (async API)</p><p>— Python 3.14: экспериментальный JIT-компилятор и шаблонные T-строки</p><p>— Медианная зарплата middle Python-разработчика: 250 000—350 000 руб./мес.</p><p>— Функции: замыкания, LEGB, *args/**kwargs, лямбды</p><p>— ООП: классы, наследование, @property, магические методы</p><p>— GIL, threading, asyncio и multiprocessing — когда что использовать</p><p>— Тестирование с pytest, работа с файлами через pathlib</p><h2>Основы языка: с чего начинается Python</h2><p>Python — язык с динамической типизацией и строгим контролем отступов. Если в C++ или Java фигурные скобки определяют блоки кода, то в Python эту роль играют пробелы. Поначалу это непривычно, но на практике делает код единообразным и читаемым — у вас просто нет возможности написать нечитаемую «лапшу». Философия Python описана в «Дзен Python» (<a href="https://peps.python.org/pep-0020/">PEP 20</a>): «Красивое лучше уродливого», «Явное лучше неявного», «Простое лучше сложного». Эти принципы пронизывают весь язык и его стандартную библиотеку.</p><p>Базовые типы данных в Python — это числа (int, float, complex), строки (str), булевы значения (bool), а также коллекции: списки (list), кортежи (tuple), множества (set) и словари (dict). Каждый тип имеет свои особенности. Например, целые числа в Python не ограничены размером: можно спокойно работать с числами в тысячи разрядов без переполнения — попробуйте сделать это в C или Java. Строки неизменяемы, а словари с Python 3.7 гарантированно сохраняют порядок вставки. Множества предоставляют проверку принадлежности элемента за O(1), а операции объединения, пересечения и разности выполняются за линейное время, что делает их незаменимыми для задач на поиск уникальных элементов.</p><p>Одна из ключевых концепций — duck typing: «если объект ходит как утка и крякает как утка, то это утка». Python не проверяет тип объекта заранее — он проверяет, поддерживает ли объект нужную операцию. Это даёт гибкость, но требует дисциплины. Современный Python активно использует аннотации типов (type hints), которые помогают IDE и линтерам находить ошибки ещё до запуска кода. Начиная с Python 3.10 появился оператор match/case (паттерн-матчинг), а в 3.12 — улучшенные дженерики и type aliases, которые делают типизацию ещё удобнее.</p><p>Переменные в Python — это не ячейки памяти, а метки (имена), привязанные к объектам. Понимание этого механизма — ключ к предсказуемой работе с мутабельными типами вроде списков и словарей. Когда вы пишете a = b для списка, вы не копируете данные — обе переменные указывают на один и тот же объект в памяти. Отсюда классические ловушки с изменяемыми аргументами по умолчанию и «неожиданным» изменением данных. Для создания независимой копии нужно использовать срез [:], метод copy() или модуль copy для глубокого копирования.</p><p>Управляющие конструкции в Python минималистичны и выразительны. Условия записываются через if/elif/else, циклы — через for и while. Конструкция for в Python ближе к foreach из других языков: она итерирует по элементам коллекции, а не по индексам. Функция range() генерирует последовательности чисел для случаев, когда нужен числовой цикл. Важно освоить и обработку исключений (try/except/finally) — Python использует исключения не только для ошибок, но и как механизм управления потоком, например StopIteration для завершения итерации.</p><p>Подробнее о типах данных и их поведении — в <a href="https://tproger.ru/translations/python-data-types">нашем гайде по основным типам данных</a>. А если хотите системно пройти все базовые концепции от установки до первого проекта — загляните в <a href="https://tproger.ru/articles/podrobnoe-opisanie-jazyka-python-dlja-nachinajushhih">подробное описание языка для начинающих</a>.</p><h2>Функции в Python</h2><p>Функции — основной инструмент структурирования кода в Python. Ключевое слово def создаёт функцию, return возвращает результат. Python поддерживает позиционные и именованные аргументы, значения по умолчанию, а также распаковку через *args (кортеж позиционных) и **kwargs (словарь именованных). Это позволяет создавать гибкие интерфейсы: от простых утилит до сложных API-обёрток.</p><p>Анонимные функции lambda удобны для коротких выражений — например, в качестве ключа сортировки: sorted(users, key=lambda u: u.age). Однако злоупотреблять ими не стоит: если лямбда не помещается в одну строку, лучше написать обычную функцию с понятным именем.</p><p>Python использует правило LEGB для поиска переменных: Local → Enclosing → Global → Built-in. Это объясняет, почему переменная внутри функции «затеняет» глобальную, и почему для изменения глобальной переменной нужно объявление global. Замыкания (closures) — функции, захватывающие переменные из объемлющей области видимости — лежат в основе декораторов, фабричных функций и callback-паттернов.</p><p>Функции в Python — объекты первого класса: их можно передавать как аргументы, возвращать из других функций и сохранять в структурах данных. Это фундамент для функционального стиля программирования, который активно используется вместе с map(), filter() и functools.</p><h2>ООП в Python</h2><p>Python — мультипарадигменный язык, но ООП в нём реализовано глубоко и последовательно. Классы создаются ключевым словом class, конструктор определяется методом __init__, а первый параметр каждого метода — self, ссылка на текущий экземпляр. В отличие от Java или C#, где this подразумевается неявно, Python требует явного указания — это осознанный выбор в пользу читаемости.</p><p>Python поддерживает множественное наследование через механизм MRO (Method Resolution Order) — алгоритм C3-линеаризации определяет порядок обхода родительских классов. Полиморфизм реализуется через duck typing: нет необходимости в интерфейсах — достаточно, чтобы объект имел нужные методы. Для формальных контрактов есть модуль abc с абстрактными базовыми классами и декоратором @abstractmethod.</p><p>Инкапсуляция в Python — скорее соглашение, чем принуждение. Префикс _ обозначает «приватный» атрибут, __ — активирует механизм name mangling, но ни то ни другое не запрещает доступ. Для контролируемого доступа к атрибутам используют декоратор @property, который превращает метод в вычисляемое свойство с геттером, сеттером и делетером.</p><p>Магические методы (dunder-методы) — мощный механизм, позволяющий объектам вести себя как встроенные типы. __str__ и __repr__ управляют строковым представлением, __eq__ и __hash__ — сравнением, __len__ и __getitem__ — доступом к элементам. Подробный разбор синтаксиса и концепций Python — в <a href="https://tproger.ru/articles/podrobnoe-opisanie-jazyka-python-dlja-nachinajushhih">нашем подробном описании языка для начинающих</a>.</p><h2>Модули и пакеты Python</h2><p>Модульная система Python проста: любой .py-файл — это модуль, а директория с __init__.py — пакет. Импорт осуществляется через import и from ... import. Python ищет модули по путям из sys.path, куда автоматически входят текущая директория, стандартная библиотека и директория site-packages с установленными пакетами.</p><p>Для управления зависимостями экосистема предлагает несколько инструментов. Классический pip + venv решает базовые задачи: создание изолированного окружения и установка пакетов из PyPI. Poetry добавляет управление зависимостями через pyproject.toml, lock-файлы и публикацию пакетов. Новый uv — написанный на Rust менеджер пакетов — работает в 10—100 раз быстрее pip и активно набирает популярность.</p><p>Стандартная библиотека Python (batteries included) — одна из самых богатых: от работы с сетью (http, socket) до сериализации (json, pickle), регулярных выражений (re) и параллелизма (threading, multiprocessing). Полный список из более чем 200 модулей доступен в <a href="https://tproger.ru/translations/10-python-libraries-you-might-not-know">нашей подборке полезных Python-библиотек</a>.</p><h2>Практика: задачи для начинающих</h2><p>Главная ошибка при изучении программирования — читать теорию неделями, не написав ни строчки кода. Python хорош тем, что позволяет начать практиковаться с первого дня: интерактивный интерпретатор (REPL), быстрая обратная связь и понятные сообщения об ошибках снижают барьер входа до минимума. Откройте терминал, напишите python3 — и вы уже можете экспериментировать.</p><p>Начинайте с простых задач: обработка строк, работа со списками, базовые циклы и условия. Затем переходите к задачам на функции, рекурсию и работу с файлами. Важно не просто решать задачу, а разбирать чужие решения — так вы быстрее освоите идиоматический Python. Один грамотно решённый пример научит вас большему, чем десять страниц документации. Обращайте внимание на то, как опытные разработчики используют встроенные функции (enumerate, zip, map), срезы списков и словарные включения — это и есть «питонический» стиль.</p><p>Хорошая практика — вести собственный файл с решениями и заметками. Возвращаясь к задачам через неделю, вы увидите, как вырос ваш уровень. Платформы вроде LeetCode, Codewars и HackerRank предлагают задачи с автоматической проверкой, но начинать лучше с задач, адаптированных под русскоязычную аудиторию. Ещё один совет: не гонитесь за количеством. Пять задач, решённых вдумчиво с разбором альтернативных подходов, ценнее пятидесяти, решённых механически копированием паттернов.</p><p>Мы собрали <a href="https://tproger.ru/problems/python-3-exercises-for-beginners-geekbrains">подборку задач для начинающих</a> — от элементарных до задач средней сложности. Каждая задача тренирует конкретный навык: работу с коллекциями, строковыми операциями, логикой ветвления. Рекомендуем решать их последовательно — сложность нарастает постепенно, и к концу подборки вы будете уверенно владеть основами языка.</p><h2>Продвинутые концепции Python</h2><p>Когда основы освоены, приходит время познакомиться с инструментами, которые отличают код новичка от кода опытного разработчика. В Python таких инструментов много, но есть пять ключевых концепций, без которых сложно писать по-настоящему качественный код: декораторы, генераторы, comprehensions, контекст-менеджеры и механизм *args/**kwargs. Именно владение этими инструментами отличает junior-разработчика от middle — и именно их чаще всего спрашивают на собеседованиях.</p><h3>Декораторы</h3><p>Декоратор — это функция, которая принимает другую функцию и возвращает её модифицированную версию. Звучит абстрактно, но на практике декораторы встречаются повсеместно: @property, @staticmethod, @login_required в Django, @app.route() во Flask. Они позволяют добавлять поведение без изменения исходного кода функции — логирование, кэширование, проверку прав доступа, валидацию аргументов, замер времени выполнения.</p><p>Под капотом декоратор — это обычный паттерн: функция, принимающая функцию и возвращающая функцию. Но синтаксический сахар с символом @ делает код лаконичным и выразительным. Декораторы можно параметризовать, складывать стопкой (применять несколько к одной функции) и даже применять к целым классам. Стандартная библиотека Python включает полезные декораторы: @functools.lru_cache для кэширования результатов, @functools.wraps для сохранения метаданных обёрнутой функции.</p><p>Декораторы — одна из тех тем, которые кажутся сложными ровно до момента, пока не разберёшься. Подробный разбор с примерами — в статье <a href="https://tproger.ru/translations/demystifying-decorators-in-python">«Декораторы в Python: понять и полюбить»</a>.</p><h3>Генераторы и comprehensions</h3><p>Генераторы — это функции с ключевым словом yield, которые возвращают данные лениво, по одному элементу за раз. Вместо того чтобы создавать в памяти список из миллиона элементов, генератор выдаёт их по запросу. Это критически важно при обработке больших файлов, потоков данных и результатов SQL-запросов. Генератор занимает фиксированный объём памяти независимо от количества элементов — хоть миллион, хоть миллиард.</p><p>Comprehensions (списковые, словарные и множественные включения) — это питонический способ создания коллекций в одну строку. Вместо цикла из трёх строк вы пишете выразительную конструкцию: [x ** 2 for x in range(10) if x % 2 == 0]. Они быстрее эквивалентных циклов (Python оптимизирует их на уровне байткода) и читаются проще — если не злоупотреблять вложенностью. Словарные включения {k: v for k, v in pairs} и множественные {x for x in items} работают по тому же принципу.</p><h3>Контекст-менеджеры и *args/**kwargs</h3><p>Конструкция with в Python — это контекст-менеджер, который гарантирует корректное освобождение ресурсов: закрытие файлов, соединений с базой, снятие блокировок. Вместо try/finally вы пишете with open('file.txt') as f: — и ресурс освобождается автоматически, даже если произошла ошибка. Можно создавать собственные контекст-менеджеры через методы __enter__/__exit__ или декоратор @contextmanager из модуля contextlib — это проще, чем кажется.</p><p>*args и **kwargs позволяют создавать функции с переменным числом аргументов. Это основа для написания гибких API, декораторов и обёрток. Понимание того, как Python распаковывает аргументы, открывает путь к элегантным решениям: передача параметров из словаря в функцию одной строкой, объединение конфигураций, создание универсальных обёрток. В комбинации с аннотациями типов (ParamSpec, Concatenate) этот механизм стал ещё мощнее в последних версиях Python.</p><p>Отдельного внимания заслуживает работа с памятью. Python скрывает от разработчика ручное управление памятью, но понимание того, сколько весят разные типы данных и как работает сборщик мусора, помогает писать эффективный код. Например, пустой список в Python занимает 56 байт, а каждый элемент добавляет 8 байт на указатель плюс размер самого объекта. Для числовых задач это означает, что NumPy-массив может быть в 10 раз компактнее обычного списка. Детальный разбор — в статье о <a href="https://tproger.ru/articles/raspredelenie-pamjati-v-python-skolko-i-v-kakih-sluchajah-zanimajut-tipy-dannyh">распределении памяти в Python</a>.</p><h3>Dataclasses и NamedTuple</h3><p>Модуль dataclasses (Python 3.7+) решает классическую проблему: написание классов, которые в основном хранят данные. Декоратор @dataclass автоматически генерирует __init__, __repr__, __eq__ и другие методы. С параметром frozen=True класс становится неизменяемым — удобно для конфигураций и DTO.</p><p>NamedTuple — ещё более лёгкая альтернатива: именованный кортеж занимает меньше памяти, чем dataclass, и автоматически поддерживает распаковку и итерацию. Выбор между ними прост: нужна изменяемость или наследование — dataclass, нужна компактность и совместимость с кортежами — NamedTuple.</p><h2>Многопоточность, асинхронность и GIL</h2><p>GIL (Global Interpreter Lock) — глобальная блокировка интерпретатора CPython, которая гарантирует, что в каждый момент времени только один поток выполняет байткод Python. Это упрощает реализацию интерпретатора и работу с памятью, но ограничивает параллелизм CPU-задач. Важно: GIL не мешает I/O-параллелизму — потоки освобождают блокировку при ожидании сети, диска или sleep.</p><p>Модуль threading подходит для I/O-bound задач: параллельные HTTP-запросы, чтение файлов, работа с базами данных. Для CPU-bound вычислений (обработка изображений, математические расчёты) используйте multiprocessing — он создаёт отдельные процессы, каждый со своим GIL. Пул concurrent.futures.ProcessPoolExecutor упрощает распределение задач по ядрам.</p><p>Модуль asyncio — стандарт для асинхронного программирования в Python. Конструкции async def и await позволяют писать неблокирующий код, который выглядит почти как синхронный. Один поток обрабатывает тысячи соединений — именно поэтому FastAPI и другие ASGI-фреймворки работают быстрее классических WSGI-аналогов.</p><p>Когда что использовать? threading — для I/O-операций с умеренной нагрузкой. asyncio — для высоконагруженных I/O-сценариев (веб-серверы, парсеры). multiprocessing — для CPU-bound задач. На практике они часто комбинируются: например, asyncio для сетевого ввода-вывода и ProcessPool для тяжёлых вычислений внутри одного приложения.</p><p>Важная новость: <a href="https://peps.python.org/pep-0703/">PEP 703</a> предлагает сделать GIL опциональным (free-threaded Python). Экспериментальная сборка без GIL уже доступна в Python 3.13+ через специальную сборку python3.14t (free-threaded build). В Python 3.14 этот режим стал официально поддерживаемым (<a href="https://peps.python.org/pep-0779/">PEP 779</a>). Если эксперимент окажется успешным, в будущих версиях Python сможет полноценно использовать все ядра процессора без обходных путей через multiprocessing.</p><h2>Тестирование в Python</h2><p>Тестирование — не роскошь, а базовая гигиена разработки. В Python стандартом де-факто является pytest — фреймворк, который сочетает простоту написания тестов с мощной системой расширений. Обычные функции с assert — это уже тесты. Не нужны классы, наследование от TestCase и специальные методы.</p><p>Фикстуры (@pytest.fixture) управляют подготовкой и очисткой тестового окружения: подключение к базе данных, создание тестового клиента, временные файлы. Параметризация (@pytest.mark.parametrize) позволяет прогнать один тест с десятками наборов входных данных без дублирования кода.</p><p>Для изоляции внешних зависимостей используйте unittest.mock — встроенный модуль, который позволяет подменять HTTP-запросы, обращения к базе данных и вызовы внешних сервисов. В связке с pytest это покрывает 95% потребностей в тестировании. TDD (Test-Driven Development) — подход, при котором тест пишется раньше кода. Его необязательно практиковать всегда, но для сложной бизнес-логики он существенно снижает количество регрессий.</p><h2>Работа с файлами и данными</h2><p>Python предоставляет удобные инструменты для работы с файлами любых форматов. Конструкция with open(...) гарантирует корректное закрытие файла даже при ошибке. Модуль pathlib (Python 3.4+) — современная замена os.path: объектно-ориентированные пути, кроссплатформенная совместимость и цепочки вызовов.</p><p>Для структурированных данных стандартная библиотека предлагает модули json, csv и configparser. Для YAML понадобится сторонний пакет PyYAML. Работа с Excel-файлами — через openpyxl или pandas. Для больших объёмов данных используйте потоковое чтение: csv.reader или json.JSONDecoder().raw_decode() вместо загрузки всего файла в память.</p><p>Для работы с распределением памяти и внутренним устройством типов данных Python — рекомендуем нашу <a href="https://tproger.ru/articles/raspredelenie-pamjati-v-python-skolko-i-v-kakih-sluchajah-zanimajut-tipy-dannyh">статью о распределении памяти в Python</a>: сколько и в каких случаях занимают типы данных.</p><h2>Веб-разработка на Python</h2><p>Python — один из ключевых языков для серверной веб-разработки. Три фреймворка покрывают практически все сценарии: Django — для полнофункциональных приложений, Flask — для микросервисов и лёгких проектов, FastAPI — для высокопроизводительных API. Каждый из них занимает свою нишу, и выбор зависит от масштаба проекта, требований к производительности и опыта команды. Разберём сильные и слабые стороны каждого, чтобы вы могли сделать осознанный выбор.</p><h3>Django: всё включено</h3><p>Django — это «батарейки в комплекте». ORM, админ-панель, система аутентификации, шаблонизатор, миграции базы данных, защита от CSRF и XSS, формы с валидацией, кэширование, интернационализация — всё работает из коробки и не требует сторонних зависимостей. Это делает Django идеальным выбором для крупных проектов: интернет-магазинов, SaaS-платформ, CRM-систем, внутренних корпоративных порталов. Instagram, Mozilla, Disqus, Pinterest — все они используют Django в продакшене.</p><p>Главное преимущество Django — зрелость. Фреймворку больше 20 лет, он имеет огромное сообщество, тысячи готовых пакетов (django-rest-framework, django-allauth, celery) и предсказуемый цикл релизов. Django ORM позволяет работать с базой данных через Python-объекты, не написав ни строчки SQL, а система миграций автоматически отслеживает изменения в моделях. Обратная сторона — Django навязывает свою архитектуру. Если вам нужен только REST API без шаблонов и админки, значительная часть фреймворка будет «мёртвым грузом».</p><h3>Flask: минималистичный и гибкий</h3><p>Flask — противоположность Django. Микрофреймворк даёт маршрутизацию, обработку запросов и систему расширений — остальное вы выбираете сами. Нужна ORM? Подключите SQLAlchemy. Нужна авторизация? Flask-Login. Хотите WebSocket? Flask-SocketIO. Такой подход идеален для микросервисов, прототипов и проектов, где полный контроль над стеком важнее скорости старта. Flask часто выбирают для внутренних сервисов, API-шлюзов и проектов, которые начинаются маленькими, но могут вырасти.</p><p>Flask отлично сочетается с фронтенд-фреймворками. Например, в статье <a href="https://tproger.ru/translations/developing-app-with-flask-and-vue-js">«Пишем одностраничное приложение с Flask и Vue.js»</a> мы показываем, как построить SPA с Flask-бэкендом — от настройки проекта до деплоя. Это типичный современный стек: Python на сервере, JavaScript-фреймворк на клиенте.</p><h3>FastAPI: скорость и типизация</h3><p>FastAPI — самый молодой из тройки, но уже ставший стандартом для создания API. Он построен на Starlette (ASGI) и Pydantic, поддерживает async/await из коробки и автоматически генерирует документацию OpenAPI (Swagger UI и ReDoc) прямо из аннотаций типов в коде. FastAPI — один из самых быстрых Python-фреймворков благодаря Starlette и uvicorn. Валидация данных через Pydantic-модели ловит ошибки ещё до обработки запроса, а type hints превращаются в живую документацию API. Dependency injection встроен в ядро фреймворка, что упрощает тестирование и переиспользование кода.</p><p>Но скорость — не всё. FastAPI требует понимания асинхронного программирования, а экосистема пока уступает Django и Flask по количеству готовых решений. Для простого CRUD-приложения с админкой Django справится быстрее; для прототипа с нестандартной архитектурой Flask даст больше свободы. О подводных камнях и ситуациях, когда FastAPI — не лучший выбор, мы подробно рассказываем в статье <a href="https://tproger.ru/articles/pochemu-ne-stoit-vybirat-fastapi-samyj-bystryj-frejmvork-na-python">«Почему не стоит выбирать FastAPI»</a> — честный разбор, который поможет принять взвешенное решение.</p><h3>Какой фреймворк выбрать</h3><ul><li>Полноценное веб-приложение с админкой и авторизацией — Django</li><li>Микросервис или прототип с полным контролем над стеком — Flask</li><li>Высокопроизводительный REST/GraphQL API с автодокументацией — FastAPI</li><li>Не уверены — начните с Django: у него самый пологий путь от нуля до продакшена</li></ul><p>На практике многие команды используют несколько фреймворков одновременно: Django для основного приложения, FastAPI для высоконагруженных микросервисов, Flask для внутренних инструментов. Python позволяет комбинировать. Общий навык для всех трёх фреймворков — понимание HTTP-протокола, REST-архитектуры, работы с базами данных и основ безопасности (CORS, CSRF, XSS, SQL-инъекции). Освоив эти концепции на одном фреймворке, вы легко перейдёте на другой.</p><h2>Python для Data Science</h2><p>Если веб-разработка — давняя территория Python, то Data Science — его новая сверхдержава. По данным <a href="https://www.jetbrains.com/lp/devecosystem-2024/python/">JetBrains Developer Ecosystem Survey</a>, Python — самый изучаемый язык программирования и основной инструмент дата-аналитиков и дата-инженеров. R, Julia, Scala — у каждого есть свои преимущества, но ни один не предлагает такую же широту экосистемы. Причина — уникальный набор библиотек, который покрывает весь pipeline работы с данными: от загрузки и очистки до визуализации и развёртывания моделей в продакшен.</p><p>NumPy — фундамент всего стека. Библиотека предоставляет многомерные массивы и математические операции, работающие на порядки быстрее чистого Python — за счёт реализации на C. Умножение матрицы 1000x1000 в NumPy выполняется за миллисекунды, в то время как наивная реализация на чистом Python займёт минуты. Pandas строится поверх NumPy и предлагает удобные таблицы (DataFrame), позволяя загружать, фильтровать, группировать и агрегировать данные в несколько строк кода. Данные из CSV, Excel, SQL, JSON — Pandas читает практически всё.</p><p>Для машинного обучения стандартом остаётся scikit-learn — библиотека с десятками алгоритмов классификации, регрессии и кластеризации. Её главная сила — единый интерфейс: fit(), predict(), score() работают одинаково для любого алгоритма, будь то случайный лес, SVM или градиентный бустинг. Это позволяет быстро сравнивать модели, менять алгоритмы одной строкой и строить пайплайны предобработки данных.</p><p>Для глубокого обучения Python предлагает PyTorch и TensorFlow — два гиганта, на которых построены GPT, Stable Diffusion и другие модели, изменившие индустрию. PyTorch доминирует в исследованиях благодаря динамическим вычислительным графам, а TensorFlow остаётся популярным в продакшене благодаря TensorFlow Serving и TFLite. Визуализация данных — matplotlib для статичных графиков, seaborn для статистических визуализаций и plotly для интерактивных дашбордов. Jupyter Notebook объединяет всё это в единую среду, где код, графики и текст живут рядом.</p><p>Разобраться в ключевых библиотеках поможет наш <a href="https://tproger.ru/translations/top-10-python-bibliotek-dlja-data-science">топ-10 Python-библиотек для Data Science</a>. А если хотите расширить инструментарий за пределы стандартного набора — загляните в подборку <a href="https://tproger.ru/translations/10-python-libraries-you-might-not-know">10 полезных библиотек, о которых вы могли не слышать</a>: там есть настоящие жемчужины для отладки, профилирования и работы с данными.</p><p>Для управления окружениями в Data Science часто используют conda (Anaconda/Miniconda) — он умеет устанавливать не только Python-пакеты, но и системные зависимости вроде CUDA для GPU-вычислений.</p><h2>Практические инструменты Python</h2><p>Помимо веб-разработки и Data Science, Python — незаменимый инструмент для повседневных задач: интеграция с внешними сервисами, извлечение данных из веб-страниц и обработка текста.</p><h3>Работа с API</h3><p>Библиотека requests — стандарт для синхронных HTTP-запросов: лаконичный API, автоматическая сериализация JSON и управление сессиями. Для асинхронных задач и HTTP/2 используйте httpx — он совместим с requests по интерфейсу, но поддерживает async/await.</p><h3>Веб-скрапинг</h3><p>Для извлечения данных из HTML-страниц Python предлагает несколько уровней инструментов. BeautifulSoup — простой парсер для статических страниц: выборка по CSS-селекторам и тегам. Scrapy — полноценный фреймворк для масштабного скрапинга с очередями, ротацией прокси и экспортом данных. Selenium и Playwright — для страниц, где контент рендерится JavaScript'ом.</p><h3>Регулярные выражения</h3><p>Модуль re — мощный инструмент для поиска и трансформации текста по шаблонам. Основные функции: re.findall() для извлечения всех совпадений, re.sub() для замены и re.compile() для предкомпиляции часто используемых паттернов.</p><p>Совет: для сложных паттернов используйте сырые строки (r"...") — они избавляют от двойного экранирования обратных слэшей. А для задач, выходящих за рамки регулярных выражений (парсинг HTML, XML), всегда предпочитайте специализированные парсеры.</p><h2>Что нового в Python 3.14</h2><p>Python 3.14 (<a href="https://docs.python.org/3/whatsnew/3.14.html">что нового</a>) (да, «пи»-релиз — разработчики не упустили возможность пошутить), выпущенный в октябре 2025 года, стал одним из самых значительных релизов за последние годы. Главные нововведения направлены на производительность — область, где Python традиционно уступал компилируемым языкам. Но 3.14 меняет правила игры.</p><p>Экспериментальный JIT-компилятор (<a href="https://peps.python.org/pep-0744/">PEP 744</a>) — пожалуй, главная новость. Он компилирует часто выполняемые участки кода (так называемые «горячие пути») в машинные инструкции прямо во время работы программы. На реальных приложениях это даёт эффект варьируется: от замедления на 10% до ускорения на 20% в зависимости от нагрузки — на некоторых задачах JIT пока замедляет код без каких-либо изменений в коде. JIT пока отключён по умолчанию (в официальных сборках для macOS и Windows JIT уже включён в бинарники — активируется переменной окружения PYTHON_JIT=1), но уже работает стабильно на большинстве платформ. Это первый шаг к тому, чтобы Python перестал считаться «медленным языком».</p><p>Внутренняя архитектура интерпретатора переработана: новый tail-call диспетчер опкодов (на уровне C, не Python-функций) даёт прирост 3—5% на стандартном benchmark suite. Важно: это не оптимизация хвостовой рекурсии в Python-коде — RecursionError при превышении глубины стека по-прежнему возможен.</p><p>T-строки (<a href="https://peps.python.org/pep-0750/">PEP 750</a>) — новый синтаксис шаблонных строк с префиксом t"...". В отличие от f-строк, T-строки не выполняют подстановку сразу, а возвращают объект Template, который можно обработать — экранировать специальные символы, валидировать параметры, преобразовать значения. Это отличное решение для безопасной генерации HTML и SQL без риска инъекций.</p><p>Среди других улучшений — ускоренные операции со словарями (до 40% быстрее в некоторых сценариях), оптимизированная работа сборщика мусора и улучшенные сообщения об ошибках, которые теперь подсказывают возможные причины проблемы. Обновлён синтаксис обработки исключений (<a href="https://peps.python.org/pep-0758/">PEP 758</a>): теперь можно писать except ValueError, TypeError: без скобок (без as — с as по-прежнему нужны скобки: except (ValueError, TypeError) as e:). Также завершён переход на отложенное вычисление аннотаций типов (<a href="https://peps.python.org/pep-0649/">PEP 649</a>/749) — аннотации больше не вычисляются при импорте модуля, что ускоряет запуск. Python продолжает развиваться, сохраняя обратную совместимость и фокус на удобстве разработчика.</p><h2>Куда двигаться дальше</h2><p>Python открывает множество карьерных путей, и выбор зависит от ваших интересов и склонностей. Вот основные направления, в каждом из которых Python — ключевой или один из основных инструментов:</p><ol><li><b>Backend-разработчик</b> — Django, Flask или FastAPI, базы данных (PostgreSQL, Redis), REST API, очереди задач (Celery), контейнеризация (Docker, Kubernetes)</li><li><b>Data Scientist / ML-инженер</b> — pandas, scikit-learn, PyTorch, работа с данными, статистика, построение и деплой моделей</li><li><b>DevOps / SRE</b> — автоматизация инфраструктуры (Ansible, Terraform), скрипты мониторинга, CI/CD пайплайны, облачные провайдеры (AWS, GCP)</li><li><b>ИИ-инженер</b> — LLM, промпт-инжиниринг, RAG-системы, fine-tuning, LangChain, работа с API нейросетей (OpenAI, Anthropic, Mistral)</li><li><b>Автоматизатор / QA-инженер</b> — Selenium, Playwright, pytest, автоматизация тестирования, нагрузочное тестирование (Locust)</li></ol><p>Независимо от выбранного направления, есть навыки, которые пригодятся везде: Git для контроля версий, SQL для работы с базами данных, Docker для контейнеризации, Linux для понимания серверной среды. Python-разработчик в 2026 году — это не просто человек, который знает синтаксис языка, а специалист, владеющий инструментарием вокруг него. Также стоит освоить виртуальные окружения (venv, poetry, uv), линтеры (ruff, mypy) и основы CI/CD — это ожидается от любого профессионального разработчика. Для управления версиями Python-проектов пригодится наш <a href="https://tproger.ru/articles/git-polnyj-putevoditel-ot-pervogo-kommita-do-prodvinutyh-wor">путеводитель по Git</a>.</p><p>Рынок труда подтверждает спрос: по данным <a href="https://hh.ru/">hh.ru</a>, количество вакансий с Python стабильно растёт на 15—20% в год, а медианная зарплата Python-разработчика уровня middle составляет 250 000—350 000 рублей в месяц. Специалисты на стыке Python и Data Science / ML зарабатывают ещё больше. Язык востребован не только в IT-компаниях: банки, телеком, ритейл, промышленность — Python нужен везде, где есть данные и автоматизация.</p><p>Отдельно стоит упомянуть растущий спрос на ИИ-инженеров. С развитием больших языковых моделей Python стал основным языком для интеграции ИИ в продукты: построение RAG-систем, создание агентов, fine-tuning моделей — всё это делается на Python. Библиотеки LangChain, LlamaIndex, Hugging Face Transformers формируют новую экосистему, которая растёт быстрее любого другого направления в IT.</p><p>Если вы в начале пути — начните со структурированной <a href="https://tproger.ru/articles/python-roadmap-2023-ljn8jvxfj">дорожной карты изучения Python</a>. Она поможет не потеряться в обилии материалов и выстроить последовательный план обучения от основ до профессионального уровня. А затем возвращайтесь к этому путеводителю — здесь вы всегда найдёте ссылки на углублённые материалы по каждой теме. Мы регулярно обновляем наши гайды, чтобы они оставались актуальными — так что добавляйте страницу в закладки.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как использовать асинхронные вьюхи в Django 5.1 с примерами кода</title>
      <link>https://tproger.ru/articles/django-5-1--asinhronnye-vyuhi--migracii-i-drugie-osobennosti-reliza</link>
      <comments>https://tproger.ru/articles/django-5-1--asinhronnye-vyuhi--migracii-i-drugie-osobennosti-reliza?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Денис Кудерин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/django-5-1--asinhronnye-vyuhi--migracii-i-drugie-osobennosti-reliza</guid>
      <description><![CDATA[<p>Разберитесь с асинхронным программированием в Django 5.1: работа с async-вьюхами, ORM-запросами и системой миграций. Готовые примеры кода, решение типичных ошибок и лучшие практики для веб-разработчиков.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/django-5-1--asinhronnye-vyuhi--migracii-i-drugie-osobennosti-reliza">Как использовать асинхронные вьюхи в Django 5.1 с примерами кода</a>»</p>]]></description>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 07 Dec 2025 12:10:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>В августе 2024 состоялся релиз Django 5.1. Хотя на уже доступны более новые версии, например, Django 5.2 LTS, версия 5.1 остается актуальной и полностью поддерживаемой. Это делает её стабильным выбором для многих проектов в активной разработке.</p><p>Именно этот релиз завершил важный этап стабилизации асинхронных возможностей фреймворка. Он поддерживает Python версий с 3.10 по 3.13, что покрывает потребности большинства разработчиков.</p><p>Асинхронность в Django прошла долгий путь: начало было положено в версии 3.0 с базовой поддержкой ASGI, в Django 4.0 появились асинхронные ORM-запросы. В версии 5.1 этот инструмент окончательно сформировался для высокопроизводительных приложений, и его успели проверить «в боевых условиях» много разработчиков.</p><h2>Зачем вообще нужна асинхронность?</h2><figure><img src="https://media.tproger.ru/user-uploads/133848/2025-11-14/6f0770e3-862f-4c36-9820-0b672bb07d6b.png" alt="" /></figure><p>Представьте большой ресторан с одним официантом. Он принимает заказ, бежит на кухню, ждет приготовления, несет блюдо. Пока он ждет на кухне, другие посетители сидят без внимания. Так работают синхронные  приложения.</p><p>Асинхронность — это штат из нескольких официантов. Пока один ждет на кухне, другие обслуживают клиентов. Сервер не блокируется на одной операции, а переключается между задачами.</p><p>Главное изменение в Django 5.1 — стабилизация асинхронного API. Ранние реализации, начиная с Django 3.1 содержали скрытые проблемы, которые теперь устранены. Асинхронные вьюхи перестали быть экспериментальной функцией.</p><p>Основное преимущество асинхронности — эффективная работа с операциями ввода-вывода. Это запросы к внешним API, взаимодействие с файлами и базами данных. В таких сценариях асинхронный код может обрабатывать больше запросов на том же оборудовании — в некоторых случаях до 3-5 раз, в зависимости от нагрузки и конфигурации..</p><p>Рассмотрим практический пример. Допустим, мы разрабатываем агрегатор новостей. Приложение должно получать данные из трех источников одновременно.</p><p>Импортируем необходимые библиотеки:</p><p>Этот код выполняет все три запроса параллельно. В синхронной версии общее время выполнения равнялось бы сумме времени всех запросов. В асинхронной — времени самого медленного запроса.</p><figure><img src="https://media.tproger.ru/user-uploads/133848/2025-11-14/dd8d3017-4f27-4e00-aa09-e115edc00a20.png" alt="" /></figure><h2>Асинхронный ORM: текущее состояние</h2><p>Django 5.1 продолжает улучшать асинхронную поддержку ORM (Object-Relational Mapping — система, которая позволяет работать с базой данных как с набором Python-объектов). Большинство операций с БД теперь имеют асинхронные версии. Но важно понимать ограничения.</p><p>Полностью асинхронные запросы работают только с драйверами, поддерживающими асинхронность. Для PostgreSQL это psycopg3, для MySQL — aiomysql. SQLite имеет ограниченную асинхронную поддержку.</p><p>Пример асинхронного ORM-запроса:</p><p>Методы, начинающиеся с «a» (aget, alist, afirst), предоставляют асинхронный интерфейс к стандартным ORM-операциям.</p><h2>Производительность: реальные показатели</h2><p>Асинхронный подход в Django 5.1 показывает наибольшую эффективность в сценариях с интенсивным вводом-выводом, где приложение активно взаимодействует с внешними API, файловыми системами или сетевыми ресурсами. В таких условиях асинхронная обработка запросов позволяет эффективно использовать ресурсы сервера за счет параллельного выполнения операций ожидания.</p><p>Архитектурные преимущества асинхронности реализуются, если соблюден ряд условий:</p><ul><li>используется ASGI-сервера вместо WSGI;</li><li>правильно настроены асинхронные драйверов базы данных;</li><li>нет блокирующих операций в основном потоке выполнения.</li></ul><p>При грамотной реализации это позволяет обрабатывать тысячи одновременных соединений без пропорционального увеличения потребления памяти.</p><p>На практике производительность сильно зависит от конкретной конфигурации и характера нагрузки. Для CPU-bound операций или простых CRUD-приложений с минимальной внешней интеграцией выигрыш может быть незначительным. Однако в задачах, требующих множественных параллельных обращений к внешним сервисам или обработки потоковых данных, асинхронная архитектура демонстрирует существенное преимущество перед традиционным синхронным подходом.</p><h2>Типичные ошибки и как их избежать</h2><p>Переход на асинхронность требует изменения концепции разработки. Самые частые ошибки связаны с неправильным смешением синхронного и асинхронного кода. Рассмотрим основные подводные камни и способы их обхода.</p><p>Ошибка: вызов синхронной функции из асинхронного контекста без обертки.</p><p>Неправильный подход:</p><p>Правильное решение:</p><p>Другая распространенная проблема — блокирующие вызовы в асинхронном коде. Даже в асинхронной функции такие операции как сложные вычисления или синхронные HTTP-запросы будут блокировать цикл событий.</p><p>Решение — выносить ресурсоемкие задачи в отдельные потоки через asyncio.to_thread или использовать специализированные воркеры.</p><p>Типичная ошибка: неправильная работа с транзакциями в асинхронном контексте. Синхронные транзакции Django не работают с асинхронным кодом.</p><p>Неправильно:</p><p>Правильное решение — использовать sync_to_async для обертки всей транзакции:</p><p>Ошибка — постановка избыточного количества одновременных задач без ограничений. Это может привести к исчерпанию ресурсов сервера.</p><p>Проблемный код:</p><p>Решение — использовать семафоры для ограничения параллелизма:</p><p>Ошибка неправильной обработки исключений в асинхронном коде. В синхронном Python исключения распространяются по стеку вызовов, но в асинхронном это работает иначе.</p><p>Неправильно:</p><p>Правильный подход — учитывать специфику асинхронных исключений:</p><p>Ошибка блокировки цикла событий долгими CPU-bound операциями. Асинхронность не ускоряет вычисления, а только улучшает работу с вводом-выводом.</p><p>Проблемный код:</p><p>Решение — вынос вычислений в отдельный поток:</p><p>Ошибка неправильного использования глобальных переменных в асинхронном коде. Состояние может изменяться неожиданно из-за параллельного выполнения.</p><p>Опасный код:</p><p>Решение — использование контекстных переменных или передача состояния явно:</p><p>Ошибка создания взаимной блокировки при неправильном использовании примитивов синхронизации. Асинхронные блокировки имеют свои особенности.</p><p>Проблемный код:</p><p>Решение — проектировать код так, чтобы избегать вложенных блокировок и использовать timeout:</p><p>Исключив эти ошибки, сможете создавать более надежный и производительный асинхронный код в Django 5.1.</p><h2>Когда асинхронность не нужна</h2><p>Асинхронность — мощный инструмент, но не универсальное решение. Есть сценарии, где ее применение не дает преимуществ, а только усложняет код.</p><p>Ситуации, когда асинхронность избыточна:</p><ul><li>Простые CRUD-приложения без внешних вызовов — если приложение в основном выполняет базовые операции с базой данных и не взаимодействует с внешними API, синхронный код проще для понимания и отладки.</li><li>Проекты с небольшой нагрузкой — когда количество одновременных пользователей измеряется десятками, а не тысячами, дополнительные затраты на управление асинхронными задачами перевешивают преимущества.</li><li>Команды без опыта работы с асинхронным кодом — асинхронное программирование требует понимания цикла событий и корутин (легковесных программ, которые позволяют писать асинхронный код так, как будто он синхронный). Ошибки сложнее обнаружить и исправить.</li><li>Приложения с интенсивными вычислениями — Python GIL ограничивает параллельное выполнение CPU-bound задач, поэтому для вычислений лучше подходит многопроцессорность.</li><li>Интеграция со сторонними библиотеками — многие популярные Python-библиотеки не поддерживают асинхронность, приходится использовать обертки sync_to_async.</li><li>Быстрая разработка и тестирование — написание и отладка асинхронных тестов занимает больше времени, что критично для стартапов.</li><li>Высокие требования к надежности — синхронная архитектура предсказуемее и надежнее для проектов, где стабильность важнее производительности.</li><li>Ограниченные ресурсы разработки — стоимость разработки и поддержки асинхронных приложений обычно выше из-за требований к квалификации команды.</li><li>Миграция legacy-проектов — переписывание существующих синхронных систем на асинхронность рискованно и часто неоправданно.</li><li>Микросервисная архитектура — выделение отдельных сервисов для асинхронных задач часто практичнее, чем преобразование всего приложения.</li></ul><p>Выбор между синхронным и асинхронным подходом должен основываться на конкретных требованиях проекта, а не на модных тенденциях. Измеряйте производительность, оценивайте сложность и принимайте взвешенные решения. Для многих проектов проверенная синхронная архитектура остается оптимальным решением.</p><h2>Миграции в Django 5.1: эволюция продолжается</h2><p>Система миграций — один из самых мощных инструментов Django. В версии 5.1 она получила значительные улучшения в производительности и надежности.</p><p>Новый алгоритм обнаружения изменений стал умнее. Раньше простые изменения типа переименования поля могли генерировать каскад ненужных миграций. Теперь система лучше понимает намерения разработчика.</p><p>Рассмотрим пример улучшенного обнаружения изменений. Было в models.py (основном файле для описания структуры базы данных):</p><p>В Django 4.2 это могло создать две отдельные миграции. В 5.1 система понимает, что created и created_at — одно поле, и генерирует одну миграцию с операцией RenameField и изменением max_length.</p><figure><img src="https://media.tproger.ru/user-uploads/133848/2025-11-14/ba142314-f343-4547-931d-80ed37f1a0ca.png" alt="" /></figure><h2>Безопасные миграции больших таблиц</h2><p>Работа с таблицами в миллионы записей всегда была болезненной точкой. Блокировки таблиц при применении миграций могли приводить к простоям приложения.</p><p>В Django 5.1 представлен атрибут Operation.category. Он позволяет классифицировать операции миграций. Команда showmigrations теперь отображает специальные символы для каждой операции. Это упрощает чтение плана миграций. Разработчики быстрее понимают структуру изменений в базе данных.</p><p>Новая система категорий помогает автоматизировать проверку миграций. Инструменты анализа кода могут использовать категории для поиска потенциальных проблем, что особенно полезно в больших проектах со сложной историей миграций. Визуальные метки делают процесс разработки более наглядным. Легко отслеживать прогресс применения миграций в разных средах.</p><p>Новые опции в миграциях:</p><h2>Миграции с данными: лучшие практики</h2><p>Миграции данных остаются мощным, но опасным инструментом. Ошибки в этом процессе может привести к катастрофическим последствиям.</p><p>Как делать правильно:</p><ul><li>всегда тестировать миграции на полной копии production-данных;</li><li>использовать пакетную обработку для больших объемов данных;</li><li>предусматривать откат для каждой операции с данными;</li><li>добавлять индикатор прогресса для долгих миграций</li></ul><p>Пример безопасной миграции данных:</p><h2>Интеграция с облачными базами данных</h2><p>В 2025 году большинство проектов развернуты в облачных средах. Django 5.1 улучшил поддержку облачных баз данных типа Amazon RDS, Google Cloud SQL и Azure Database.</p><p>Основные улучшения:</p><ul><li>лучшая обработка временных разрывов соединения;</li><li>поддержка реплик для чтения для распределения нагрузки;</li><li>улучшенная работа с пулами соединений;</li><li>автоматическое переподключение при обрывах.</li></ul><p>Конфигурация для облачной PostgreSQL:</p><p>Django 5.1 сделал встроенную поддержку пулов соединений PostgreSQL через psycopg3, чтобы сократить расходы на установку соединений.</p><h2>Мониторинг и отладка асинхронного кода</h2><p>Отладка асинхронного кода требует специальных подходов. Трассировка стека в асинхронных приложениях сложнее из-за работы цикла событий (event loop).</p><p>Новые инструменты для мониторинга:</p><ul><li>ASGI middleware (промежуточный слой) для мониторинга производительности;</li><li>интеграция с системами мониторинга производительности приложений;</li><li>специализированные логи для асинхронных операций;</li><li>метрики для event loop.</li></ul><p>Пример middleware для мониторинга:</p><h2>Тестирование асинхронных приложений</h2><p>Тестирование асинхронного кода в Django требует использования специальных тестовых классов и подходов.</p><p>Пример тестирования асинхронной вьюхи:</p><h2>Безопасность асинхронного кода</h2><p>Асинхронность приносит новые векторы атак. Состояния гонки, взаимные блокировки и проблемы с разделением состояния становятся более вероятными.</p><p>Как минимизировать риски:</p><ul><li>использовать потокобезопасные структуры данных;</li><li>избегать разделяемого изменяемого состояния;</li><li>тщательно тестировать на состояния гонки;</li><li>использовать асинхронные версии блокировок при необходимости.</li></ul><p>Пример безопасной работы с разделяемыми ресурсами:</p><h2>Миграционная стратегия для legacy-проектов</h2><p>Перевод существующего проекта на асинхронность требует продуманного подхода.</p><p>Рекомендуется постепенная миграция:</p><ol><li>Начать с новых эндпоинтов, реализуя их асинхронно.</li><li>Выделить наиболее нагруженные части API для перевода на async.</li><li>Использовать гибридный подход, где это необходимо.</li><li>Тщательно тестировать производительность на каждом этапе.</li></ol><p>Пример гибридного подхода. Старые синхронные вьюхи остаются:</p><p>Новые эндпоинты делаем асинхронными:</p><p>Гибридный эндпоинт:</p><h2>Производительность в продакшене: метрики и мониторинг</h2><p>При развертывании асинхронных приложений важно отслеживать правильные метрики.</p><p>Традиционные метрики веб-приложений дополняются специфическими для async:</p><ul><li>Event loop latency — задержки в обработке событий;</li><li>Active tasks — количество активных асинхронных задач;</li><li>Queue size — размер очереди задач;</li><li>Database connection pool usage — использование пула соединений.</li></ul><p>Настройка мониторинга:</p><h2>Итоги: асинхронность как стандарт</h2><p>Django 5.1 знаменует переход асинхронности из категории экспериментальных возможностей в стандартный инструмент разработки. Стабильность и производительность async-компонентов достигли уровня, позволяющего использовать их в production-проектах.</p><p>Система миграций продолжает развиваться, предлагая улучшенную производительность и надежность. Новые функции особенно ценны для больших проектов с миллионами записей.</p><p>Ключевые выводы для разработчиков в 2025 году:</p><ul><li>асинхронные вьюхи готовы к использованию в продакшене;</li><li>наибольший выигрыш от асинхронности — в сценариях с интенсивным вводом-выводом;</li><li>миграции стали надежнее и безопаснее для больших баз данных;</li><li>постепенная миграция legacy-кода — оптимальная стратегия;</li><li>мониторинг и тестирование требуют адаптации под асинхронную парадигму.</li></ul><p>Django продолжает эволюционировать, поддерживая равновесие между современными требованиями и обратной совместимостью. Асинхронность в Django 5.1 — это закономерный этап развития фреймворка, который уже более 15 лет входит в топ наиболее популярных инструментов для веб-разработки на Python.</p>]]></content:encoded>
    </item>
    <item>
      <title>Куда двигаться после изучения Django: советы для Python-разработчиков</title>
      <link>https://tproger.ru/articles/kuda-dvigatsya-posle-izucheniya-django--sovety-dlya-python-razrabotchikov-257299</link>
      <comments>https://tproger.ru/articles/kuda-dvigatsya-posle-izucheniya-django--sovety-dlya-python-razrabotchikov-257299?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгения Епихина]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kuda-dvigatsya-posle-izucheniya-django--sovety-dlya-python-razrabotchikov-257299</guid>
      <description><![CDATA[<p>В статье разбираемся, почему Django — далеко не финиш в карьере, и в каких направлениях можно двигаться Python-разработчику.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kuda-dvigatsya-posle-izucheniya-django--sovety-dlya-python-razrabotchikov-257299">Куда двигаться после изучения Django: советы для Python-разработчиков</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Парсинг]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[MySQL]]></category>
      <category><![CDATA[Машинное обучение]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Raspberry Pi]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Советы]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[Асинхронное программирование]]></category>
      <category><![CDATA[Data Science]]></category>
      <category><![CDATA[NoSQL]]></category>
      <category><![CDATA[Redis]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[аналитик]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[Neo4j]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 12 Aug 2025 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Django — это веб-фреймворк на языке Python, который позволяет быстро создавать сложные веб-приложения. Он включает в себя готовые компоненты для работы с базами данных, маршрутизацией URL, обработкой форм, аутентификацией пользователей и админ-панелями, что значительно ускоряет разработку и упрощает поддержку проектов.</p><p>Владение Django — это старт, а не финиш. Чтобы оставаться востребованным, нужно постоянно расширять знания и навыки. В этой статье разберем пути и направления для улучшения своих компетенций.</p><h2>Почему владение Django — не предел для разработчика</h2><h2>Особенности Django</h2><p>Django используют для разработки веб-приложений разной сложности: при работе с большими базами данных, для создания сервисов, способных обслуживать большое количество пользователей. На нём создают соцсети, новостные сайты, веб-версии приложений, онлайн-магазины.</p><p>Основные плюсы:</p><ul><li><b>Полноценный стек</b>: ORM для работы с базой, мощная система маршрутизации URL, шаблоны для рендеринга, встроенная админка, формы, система аутентификации и авторизации.</li><li><b>Архитектура MTV (Model-Template-View)</b>: похожа на классический MVC, но с особенностями, которые упрощают разделение логики, представления и данных.</li><li><b>Безопасность</b>: Django автоматически защищает от CSRF, XSS, SQL-инъекций и других распространенных атак. Не нужно писать много дополнительного кода.</li><li><b>Активное сообщество и экосистема</b>: тысячи сторонних пакетов, расширений и готовых решений.</li><li><b>Поддержка нескольких баз данны</b>х: PostgreSQL, MySQL, SQLite, Oracle и др.</li></ul><p>Ограничения:</p><ul><li><b>Синхронная природа Django</b>.</li><li><b>Монолитность</b>: архитектура фреймворка ориентирована на создание крупных приложений, но в микросервисах может быть избыточна.</li><li><b>Ограниченная гибкость ORM</b>: нестандартные SQL-запросы иногда сложно выразить средствами ORM, приходится использовать raw SQL или сторонние библиотеки для запросов.</li><li><b>Строгие правила организации кода</b>: требуют дисциплины и могут ограничивать свободу в архитектурных решениях.</li><li><b>Недостаточная производительность</b>: уступает лёгким асинхронным фреймворкам (например, FastAPI), особенно под высокими нагрузками. Но для большинства проектов пока это не критично.</li></ul><h2>В каком направлении двигаться после изучения Django</h2><blockquote>Задача — создавать продукт, который будет нужен конечному потребителю.</blockquote><h3>Первое направление для развития — расширить инструментарий для решения разных задач в веб-разработке</h3><p>Возможные пути:</p><ul><li>Изучить другие веб-фреймворки (Flask, FastAPI)</li><li>Углубиться в асинхронное программирование (asyncio, aiohttp)</li><li>Работать с API и микросервисами</li></ul><h4>Flask и FastAPI</h4><p>Flask — минималистичный микрофреймворк, даёт полную свободу в выборе компонентов. Используют для небольших приложений и микросервисов.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-08-12/bbe7c040-14de-426d-9a10-c556f7319bee.png" alt="" /><figcaption>Пример простой команды на Flask</figcaption></figure><p>FastAPI — современный асинхронный фреймворк, ориентирован на создание высокопроизводительных API. Поддерживает стандарт OpenAPI и автоматическую генерацию документации. Он быстрее Flask и Django благодаря asyncio и Pydantic.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-08-12/33a27277-5136-4a03-8af2-f436db42fa99.png" alt="" /><figcaption>Пример простого API на FastAPI</figcaption></figure><h4>Асинхронное программирование</h4><p>Веб-разработка всё активнее использует асинхронные технологии. Django не всегда справляется с задачами высокой конкурентной нагрузки.</p><p>Поэтому изучение asyncio — стандартной библиотеки Python для асинхронного программирования — откроет перед вами новые возможности. Вместе с aiohttp или тем же FastAPI вы сможете создавать приложения, которые обрабатывают тысячи одновременных соединений. Это особенно важно для real-time сервисов, чат-приложений и систем с интенсивным обменом данными.</p><h3>Второе направление — расширить навыки в смежных областях</h3><p>Можно пойти по пути расширения компетенций за пределы основной специализации. Важно не только уметь писать код, но и понимать, как приложения разворачиваются и работают в продакшене. Знание DevOps-практик помогает наладить эффективное взаимодействие между разработкой и эксплуатацией.</p><h4>Изучение DevOps и контейнеризации</h4><p>Контейнеры позволяют запускать приложения в изолированной среде, это упрощает настройку и развертывание. Например, Docker помогает упаковать приложение с зависимостями в один контейнер, а Kubernetes — управлять такими контейнерами в продакшене. Знание этих технологий улучшит взаимодействие с операционной командой и ускорит выпуск новых версий приложений.</p><h4>CI/CD и автоматизация процессов</h4><p>Непрерывная интеграция (Continuous Integration) и непрерывное развертывание (Continuous Deployment) — ключевые практики современной разработки ПО. Они позволяют автоматизировать сборку, тестирование и доставку приложений, масштабировать процессы.</p><p>Инструменты CI/CD (например, Jenkins, GitLab CI/CD, GitHub Actions) помогают настроить автоматические пайплайны, которые обеспечивают быструю обратную связь и минимизируют человеческий фактор в релизах. Автоматизация процессов снижает количество ошибок и позволяет сосредоточиться на разработке новых функций.</p><p>Настройка непрерывной интеграции и доставки (Continuous Integration / Continuous Delivery) снижает поток ошибок при релизах и экономит время. Пример: GitHub Actions для автоматического запуска тестов и сборки проекта при каждом коммите.</p><h4>Больше знаний в области баз данных</h4><p>Помимо классических реляционных баз данных (PostgreSQL, MySQL), современные приложения часто используют NoSQL для специфичных задач. MongoDB, Redis, Cassandra обеспечивают гибкость в хранении данных, горизонтальное масштабирование и высокую производительность при работе с большими объемами информации.</p><p>Графовые базы данных (Neo4j, ArangoDB) предназначены для эффективного хранения и анализа связей между объектами, что важно для социальных сетей, рекомендательных систем и других приложений с богатой структурой.</p><p>Так, Redis хорошо подходит для кэширования данных, а Neo4j — для сложных связей между объектами.</p><h3>Третье направление — переход к другим аспектам Python-разработки</h3><p>Рассмотрим четыре варианта карьерного развития для Python-программиста: Data Science и машинное обучение, автоматизация бизнес-процессов, разработка десктопных приложений и встраиваемые системы (IoT).</p><p>Почему стоит попробовать?</p><ul><li>Высокий спрос на специалистов. Они востребованы в банках и инвестиционных компаниях, в сфере медицины и биотехнологии, в консалтинге,  автомобильной промышленности и т.д..</li><li>Широкий набор библиотек: pandas, NumPy, scikit-learn, TensorFlow, PyTorch.</li><li>Возможность работать с реальными задачами: от бизнеса до науки.</li></ul><h4>Автоматизация и скрипты для бизнеса</h4><p>Python часто используется для автоматизации рутинных задач: парсинга данных, обработки файлов, интеграции систем, генерации отчетов. Создание скриптов для автоматизации бизнес-процессов помогает повысить эффективность работы и снизить количество ошибок.</p><p>Знание таких библиотек, как openpyxl (работа с Excel), requests (HTTP-запросы), BeautifulSoup и Scrapy (парсинг веб-страниц), а также умение писать скрипты под конкретные задачи, делают разработчика ценным специалистом в корпоративной среде.</p><p>Примеры задач:</p><ul><li>Автоматическая загрузка данных из Excel и их преобразование</li><li>Скрипты для отправки email-рассылок</li><li>Интеграция с CRM и другими сервисами через API</li></ul><h4>Разработка десктопных приложений (PyQt, Kivy)</h4><p>Хотя сейчас популярность уходит к вебу и мобильным платформам, десктопные приложения на Python востребованы в таких сферах: инструменты для анализа, редакторы, утилиты.</p><p>Инструменты для создания:</p><ul><li>PyQt — мощный фреймворк для создания кроссплатформенных GUI.</li><li>Kivy — библиотека для разработки приложений с поддержкой сенсорных экранов.</li></ul><p>Этот путь подходит тем, кто хочет создавать удобные инструменты с графическим интерфейсом для пользователей на Windows, macOS или Linux.</p><h4>Встраиваемые системы и IoT</h4><p>В области IoT и встроенных систем Python набирает популярность благодаря легкости освоения и поддержке на маломощных устройствах. Помогают в этом  платформы по типу Raspberry Pi и MicroPython.</p><p>Изучение этого направления открывает возможности работы с аппаратным обеспечением, созданием прототипов и внедрением инновационных решений в промышленности и бытовой технике.</p><p>Например, с помощью Python на Raspberry Pi можно  разрабатывать датчики для мониторинга состояния оборудования на производстве и разрабатывать прототипы носимых устройств для сбора данных о здоровье.</p><blockquote>Если рассматривать профессию “Python-разработчик на Django”, то сразу получится сужение до конкретной библиотеки на конкретном языке. Если же в резюме у специалиста стоит, что он “разработчик Python”, возможностей сильно больше. Если написать про себя “разработчик”, будет не понятно, разработчик чего. Но изменив резюме на “DevOps инженера”, становится понятен карьерный трек.</blockquote>]]></content:encoded>
    </item>
    <item>
      <title>5 VPS-хостингов в 2025, которые держат нагрузку: кейсы, стоимость, метрики</title>
      <link>https://tproger.ru/articles/5-vps-hostingov-v-2025--kotorye-derzhat-nagruzku--kejsy--stoimost--metriki</link>
      <comments>https://tproger.ru/articles/5-vps-hostingov-v-2025--kotorye-derzhat-nagruzku--kejsy--stoimost--metriki?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Валерия Турчак]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/5-vps-hostingov-v-2025--kotorye-derzhat-nagruzku--kejsy--stoimost--metriki</guid>
      <description><![CDATA[<p>Сравниваем 5 VPS-провайдеров, которые стабильно работают под нагрузкой в 2025 году. Разбираем стоимость, примеры использования, производительность и uptime. </p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/5-vps-hostingov-v-2025--kotorye-derzhat-nagruzku--kejsy--stoimost--metriki">5 VPS-хостингов в 2025, которые держат нагрузку: кейсы, стоимость, метрики</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[MySQL]]></category>
      <category><![CDATA[Быстрый старт]]></category>
      <category><![CDATA[PHP]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[iOS]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[ВКонтакте]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[VPN]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[GitLab]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[Intel]]></category>
      <category><![CDATA[Windows Server]]></category>
      <category><![CDATA[Образование]]></category>
      <category><![CDATA[Маркетинг]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Техподдержка]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[AMD]]></category>
      <category><![CDATA[Игра]]></category>
      <category><![CDATA[Дата-центр]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[1C]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[VPS]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 05 Aug 2025 06:10:17 GMT</pubDate>
      <content:encoded><![CDATA[<p>В 2025 году выбирать VPS по принципу дешево и сердито уже не работает. Любой рабочий или MVP-проект — от API для мобильного приложения до интернет-магазина  сталкивается с пиками нагрузки, которые нужно выдержать. Ошибки на старте обходятся дороже простоя в продакшне.</p><p>Собрали пять VPS-хостингов, которые показывают, как должны выглядеть выжившие серверы под нагрузкой: современное железо, каналы без счётчиков трафика, живая поддержка инженеров и опыт клиентов. Ниже — конфигурации, цены и метрики, чтобы вы подобрали сервер под свой сценарий.</p><h2>1. ИХЦ (Интернет ХостингЦентр): конфигурации под нагрузку с NVMe, CPU до 5 ГГц и трафиком без ограничений</h2><p>Один из самых гибких по конфигурациям хостеров в обзоре. Работает с 2009 года. Поддерживает разные типы виртуализации (KVM и Virtuozzo), предлагает линейки с SSD и NVMe, российские и европейские площадки, разные уровни мощности — от базовых до высоконагруженных.</p><h3>Линейки VPS и конфигурации</h3><ol><li>ssdVPS — базовая линейка для России. Позволяет собирать конфигурации от 1 до 32 ГБ оперативной памяти, от 1 до 10 виртуальных CPU и от 20 до 300 ГБ SSD-диска.</li><li>NVMe/ — линейка на базе KVM с более высокой производительностью ввода-вывода. Доступны конфигурации от 1 до 24 ГБ RAM, от 1 до 12 vCPU, SSD от 15 до 300 ГБ.</li><li>EU-NVMe/ — аналог NVMe-линейки, но размещённый в Амстердаме. Конфигурации расширены: от 1 до 64 ГБ оперативной памяти, от 1 до 18 CPU, от 15 до 1000 ГБ SSD, скорость порта — от 200 до 500 Мбит/с.</li><li>VPS 5 ГГц — отдельная линейка на KVM, ориентированная на проекты с высокой частотной нагрузкой, до 5 ГГц на ядро, порт до 1000 Мбит/с.</li></ol><p>VPS Windows — выделенная категория для задач на Windows.</p><h3>Особенности и инфраструктура</h3><p>В <a href="https://www.ihc.ru/vps.html">ИХЦ</a> можно выбрать между двумя видами виртуализации: <b>KVM</b> и <b>Virtuozzo</b>. Виртуализация KVM подходит для задач, где нужна изоляция ресурсов, стабильность под нагрузкой и совместимость с Linux и Windows. Virtuozzo — более экономный вариант с быстрой настройкой, но с возможной перераспределённой нагрузкой между соседними VPS.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-31/d8f9548f-7bd8-4eef-a4aa-6d50b0e424a2.png" alt="" /><figcaption>Дата-центры провайдера есть в Москве и Амстердаме.</figcaption></figure><p>Связь с поддержкой доступна через тикеты, онлайн-чат на сайте, телеграм-бота, телефон и сообщения ВКонтакте. Поддержка работает 24/7. На всех тарифах включена базовая <b>DDoS-защита</b>.</p><h3>Примеры использования VPS от IHC</h3><p>Компания предоставляет конкретные кейсы. Примеры:</p><ul><li>Проект 1: VPS NVMe/24 (24 ГБ RAM, ~200 ГБ SSD) используется под бэкенд iOS-приложения. Стек: nginx, PHP, MySQL. Нагрузка: 12 000 уникальных пользователей в сутки. Утилизация CPU — 25%.</li><li>Проект 2: VPS NVMe/12 (12 ГБ RAM, ~120 ГБ SSD) для развлекательного сайта. Стек: nginx, Docker, Node.js. Нагрузка: 7 000 уникальных пользователей в сутки, загрузка CPU — около 20%.</li></ul><p>Серверы стабильно держат среднюю и высокую нагрузку — даже с трафиком в 10–12 тысяч пользователей в сутки остаётся запас по ресурсам.</p><h3>Дополнительные опции</h3><p>ИХЦ предлагает <b>тестовый период в 3 дня</b>, <b>безлимитный трафик</b>, <b>бесплатный первый месяц ispmanager 6</b> в подарок, а также предустановку панелей управления (ispmanager, FastPanel) или VPN-шаблонов по выбору при заказе. Также доступны бэкапы, SLA и автоснапшоты.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-31/e5730a1c-375b-4b91-a238-6a52a51df67a.png" alt="" /></figure><h3>Цены</h3><p>Что касается ценовой политики, стоимость VPS в России (линейка «ssdVPS») начинается <b>от 380 руб/мес</b> или 3800 руб/год (12 месяцев по цене 10). Европейские VPS («EU-NVMe/») и VPS на KVM («NVMe/») стартуют <b>от 440 руб/мес</b> или 4400 руб/год, а каждый дополнительный гигабайт памяти стоит 6 рублей.</p><h2>2. FirstVDS: мощные VDS на AMD EPYC и Ryzen</h2><p><a href="https://firstvds.ru/">FirstVDS</a> — хостинг-провайдер с опытом на рынке более 20 лет. Предлагают VPS и VDS с виртуализацией KVM для проектов любого размера. Все серверы работают на современном оборудовании. Трижды победитель в номинации «Хостер года» Национальной премии «ЦОДы.РФ».</p><p>Есть VPS для разных сценариев нагрузки — от стандартных сайтов до тяжёлых веб-приложений и проектов с высокими требованиями к CPU и отказоустойчивости. Отдельные решения для Битрикс, установка ОС семейства Linux, FreeBSD и Windows Server.</p><h3>Линейки VPS: от базовой мощности до кластера Ceph</h3><p>FirstVDS предлагает три основные линейки, которые отличаются архитектурой и назначением:</p><ol><li>VDS Форсаж — гибкая конфигурация сервера на базе AMD EPYC, до 128 ядер (до 3,7 ГГц), до 512 Гб оперативной памяти и до 4 000 Гб быстрого NVMe-накопителя. Локации Москва и Амстердам. Стартовая стоимость такой конфигурации составляет от 749 руб/мес.</li><li>Для нагруженных проектов — CPU.Турбо — гибкая конфигурация сервера на базе AMD Ryzen с частотой до 5,7 ГГц, DDR5 и с быстрыми NVMe-накопителями. Идеально для Битрикс. Локация Москва. Начальная цена CPU.Турбо — от 624 руб/мес. При покупке лицензии Битрикс (1С-Битрикс: Управление сайтом или Битрикс24) есть дополнительная скидка 30% на 3 месяца аренды этого тарифа.</li><li>Отказоустойчивый VDS Атлант — гибкая конфигурация сервера на базе AMD EPYC — до 192 ядер (до 3,5 ГГц), до 768 Гб оперативной памяти и до 8 Тб быстрого NVMe-накопителя. Репликация данных между узлами кластера Ceph и дублирование сетевого оборудования. Локация Москва. Его стартовая стоимость от 1619 руб/мес, при этом бесплатные автобэкапы уже включены.</li></ol><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-31/3490237d-3e99-49c5-9d90-10e3849765ed.png" alt="" /></figure><p>Компания использует два центра обработки данных в <b>Москве</b>: <b>IXcellerate (уровень Tier III)</b> и Web DC. Для тарифа Форсаж и готовых тарифов также доступен ЦОД <b>euNetworks (уровень Tier III) в Амстердаме</b>.</p><h3>Сетевые возможности, трафик и безопасность</h3><p>В стоимость каждого сервера входит бесплатный выделенный IP-адрес. Клиенты могут выбрать между 100 Мбит/с с безлимитным трафиком или портом 1 Гбит/с с включёнными 32 Тб трафика.</p><p>Защита от DDoS-атак и система безопасности BitNinja для сервера и сайта доступны как подключаемые опции. Также предоставляются объектное хранилище S3, автобэкапы и Кибер-бэкап. Для безопасности коммуникаций используются SSL-сертификаты GlobalSign.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-31/7d36ac0d-4832-402b-b0b0-9d7955963916.png" alt="" /></figure><h3>Управление, ПО и поддержка</h3><p>При заказе сервера клиент получает лицензию ispmanager 6  lite: первый месяц панель предоставляется бесплатно, дальше оплачивается по тарифу самой панели. Предлагается гибкий выбор операционных систем, включая Linux, FreeBSD и Windows Server. Под разовые задачи доступны готовые рецепты установки — от Битрикс и GitLab до TeamSpeak, LAMP‑стека и других популярных наборов ПО.</p><p>Для установки и решения любых вопросов — доступна живая круглосуточная техническая поддержка 24/7 через чат на сайте, в личном кабинете и по телефону, без использования чат-ботов. Для самостоятельного решения вопросов предусмотрена обширная база знаний.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-31/7fc897fc-5d2d-4f28-9047-834a8b0202b1.png" alt="" /></figure><h3>Клиентские бонусы и программы</h3><p>Есть тестовый период до 3 дней. Регулярно проводятся акции и предоставляются скидки, в том числе на тарифы для нагруженных проектов.</p><p>1) При переходе от другого хостера FirstVDS бесплатно переносит до 10 сайтов. Дополнительно предоставляется скидка 40% на первый месяц аренды VPS при оплате сервера на 1, 3 или 6 месяцев, либо 3 месяца бесплатной аренды VPS при оплате на год.</p><p>2) Клиенты с возрастом аккаунта от 5 лет получают постоянную скидку на аренду VPS, начиная от 5% и увеличиваясь ежегодно до 20%.</p><p>3) Действует реферальная программа, по которой партнёр получает 10% от расходов привлечённых клиентов, а привлечённый пользователь — скидку 25% на первый месяц аренды VPS.</p><p>4) Стоимость продления домена у FirstVDS равна актуальной стоимости его регистрации.</p><h2>3. InCloud: VPS‑площадки для бизнеса, где важен SLA</h2><p><a href="https://incloud.ru/">InCloud</a> продаёт виртуальные серверы, работающие в отказоустойчивом кластере на базе enterprise хранилищ NetApp и HPE 3PAR. Позиционируется как решение для 1С, малого/среднего бизнеса и аутсорс компаний, которым нужны предсказуемые ресурсы и техподдержка профессиональных инженеров, а не чат‑ботов.</p><h3>Тарифные планы и ценообразование</h3><p>InCloud предлагает две основные линейки тарифов:</p><ol><li>Стандартный тариф: внутри процессоры Intel Xeon 2600v4 2ГГц и оперативная память DDR4 2400 МГц.Стоимость: 1 CPU – 200 рублей, 1 Гб RAM – 200 рублей.</li><li>Производительный тариф: использует процессоры AMD EPYC до 3.8 ГГц и оперативной памяти DDR5 4800 МГц. Стоимость: 1 CPU – 250 рублей, 1 Гб RAM – 250 рублей.</li></ol><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-31/c484688e-fd3f-48ca-b743-616c21699ac4.png" alt="" /></figure><p><b>Стоимость дискового пространства</b>: SATA диски: <b>3 рубля за 1 Гб</b>. SSD и NVMe диски: <b>13 рублей за 1 Гб</b>.</p><h3>Архитектура и поддержка</h3><p>Теперь про то, что упрощает жизнь и добавляет надежности нашим развернутым сервисам:</p><ul><li>Ежедневные бэкапы: данные ваших серверов будут копироваться каждый день, и храниться они могут до 30 дней.</li><li>Удобная панель управления: через нее можно делать снапшоты  и клонировать серверы. Для разработчиков это просто золото – быстро накатить тестовую среду, попробовать новую фичу, а потом откатиться или создать идентичные рабочие среды.</li><li>SLA-договор: есть возможность заключить SLA-договор, чтобы получить гарантированный уровень доступности услуг.</li><li>Новейшие мощные серверы — на базе AMD EPYC 4 поколения.</li></ul><p>Одна из фишек – это возможность напрямую проконсультироваться с сертифицированными инженерами InCloud по сложным проектам.</p><h3>А что с клиентскими кейсами</h3><ol><li><b>Кейс Vamkamin</b>: производственная компания, которая ускорила работу своей системы 1С и сократила IT-расходы на 35%. У них была проблема с медленной работой 1С при одновременном доступе бухгалтерии, склада и отдела продаж, а также с частыми простоями на локальных серверах. InCloud предложил перенести все сервисы в облако, используя серверы на базе AMD EPYC 9554, что обеспечило прирост производительности более 40% по сравнению с предыдущими решениями. Также были внедрены гибкое масштабирование ресурсов и ежедневное резервное копирование.</li><li><b>Кейс Веб-студии 100UP</b>: компания занимается разработкой и поддержкой сайтов для крупных торговых сетей и e-commerce проектов. 100UP переехала к облачному провайдеру InCloud, выбрав тарифы на базе AMD EPYC 9554 с высокой тактовой частотой и большим количеством ядер. Благодаря разнообразию тарифов команда легко распределила проекты по нужным по производительности виртуальным серверам. После переезда 100UP смогла сократить время отклика клиентских сайтов в среднем на 45%, обеспечить бесперебойную работу даже в периоды высокой сезонной нагрузки, ускорить запуск новых проектов, фокусироваться на разработке и маркетинге и улучшить качество предоставляемых услуг.</li></ol><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-31/c0b63a9f-bb39-4b44-9363-45cefd4c2f62.png" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-31/9f98fda8-0b7a-408a-9a82-00f063ee0d88.png" alt="" /></figure><h2>4. SmartApe: быстрые VPS на NVMe‑SSD</h2><p><a href="https://www.smartape.ru/ssd-vps">SmartApe</a> подойдет проектам, где дисковая подсистема и CPU работают без простоя: интернет‑магазины, порталы с большим количеством контента, внутренние корпоративные системы, высоконагруженные API. Если нужен быстрый старт — сервер создаётся за одну‑две минуты; если понадобится масштабирование, тариф можно увеличить без миграции.</p><h3>Преимущества этих VPS</h3><p>Используются современные серверные NVMe SSD диски в RAID массиве, которые в 600 раз быстрее обычных HDD. Скорость чтения достигает 8000 Мбайт/с, а записи — 2000 Мбайт/с.</p><p>Серверы работают на мощных процессорах Intel Xeon Gold или AMD EPYC (до 3.7 ГГц) и быстрой памятью DDR4. Используется полноценная виртуализация KVM с выделенными ресурсами для гарантии их предоставление. Дата-центры уровня TIER-III и TIER-IV обеспечивают Uptime 99.982%. Данные хранятся в хранилище RAID-10.</p><p>Дополнительно клиенты получают полный root-доступ (по SSH для Linux и RDP для Windows), возможность установки любых операционных систем (более 20, включая Ubuntu, CentOS, Debian, Windows Server) и ПО, а также полную изоляцию от других клиентов.</p><h3>Удобство и поддержка</h3><ul><li>Бесплатная панель управления (Hestia) или платная ISPmanager для простого управления сервером.</li><li>Бесплатное базовое администрирование и помощь в переносе сайтов.</li><li>Круглосуточная квалифицированная поддержка 24/7.</li><li>Бесплатный тестовый период 10 дней без оплаты и ввода карты.</li><li>Защита от DDoS-атак включена в стоимость.</li><li>Выделенный внешний IP-адрес (возможность купить до 10 IP).</li></ul><p>Перед покупкой дают десять дней теста без привязки карты; если сервис не подойдёт, в течение тридцати дней можно вернуть деньги за неиспользованный период.</p><h4>Пример использования: интернет‑магазин</h4><p>VPS c 2 vCPU, 4 ГБ RAM, 80 ГБ SSD и портом 100 Мбит/с; при обычном трафике сайт обслуживает 300–500 уникальных посетителей в день, одновременно на страницах бывает 10–20 человек, а в пиковую распродажу до 50; средняя нагрузка 5–10 запросов в секунду, короткими всплесками до 20; заявленный аптайм 99,982 %, реальные замеры отклика после кэширования — 200–300 мс; счёт за такой сервер выходит около 1 300 рублей в месяц.</p><h4>Пример использования: API на Node.js</h4><p>4 vCPU, 8 ГБ RAM, 160 ГБ NVMe и канал 200 Мбит/с; сервис стабильно обрабатывает 50–100 запросов в секунду, на пике достигает 200, одновременно подключены 500–1 000 клиентов, максимум 2 500; трафик близок к 200 ГБ в месяц; при том же аптайме 99,982 % средняя задержка ответа укладывается в 50–100 мс; ежемесячная стоимость в зависимости от опций колеблется в диапазоне 2 600–3 000 рублей.</p><p>SmartApe имеет смысл брать, когда дисковая скорость и гарантированные ресурсы важнее высокого GUI и почасовой тарификации, для расчёта стоимости есть калькулятор конфигураций на сайте и оперативная техподдержка.</p><h2>5. PSB Hosting: что даёт их VPS‑платформа</h2><p><a href="https://psb.hosting/vps">PSB Hosting</a> продвигает VPS-хостинг как решение для сайтов, приложений и SaaS-сервисов, которым нужна предсказуемая мощность и высокий SLA. Провайдер делает упор на новое оборудование, пропускную способность без ограничений и инфраструктуру уровня Tier III+.</p><h3>Локации и тарификация</h3><p>Серверы разворачиваются в четырёх точках: Нидерланды, США, Германия и Финляндия. Для каждой площадки доступен одинаковый конструктор конфигураций. Базовый план NL‑100, который включает 1 vCPU, 2 ГБ RAM и 30 ГБ SSD, стоит 6 долларов в месяц. Линейка поднимается ступенчато:</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-31/62dfc578-ede9-4533-bfb8-bca1a1a26688.png" alt="" /></figure><p>Слайдеры позволяют довести параметры до 32 ядер, 64 ГБ RAM и 510 ГБ SSD; верхняя планка оплаты — 220 $ в месяц.</p><p>Трафик безлимитный на любых конфигурациях — дополнительной оплаты за гигабайты нет.</p><h3>Аппаратная платформа, ОС и предустановки</h3><p>В хост-узлах применяются процессоры последних линеек AMD и Intel. Оперативная память — DDR5, что снижает задержки при обращении к ОЗУ. Дисковая подсистема полностью на NVMe, объединена в RAID 10: чтение и запись выше, чем у классических SSD, а отказ одного накопителя не выводит хранилище из строя. К каждому VPS подключён выделенный канал с пропускной способностью до 10 Гбит/с.</p><p>Сервер можно поднять сразу с Windows Server, Ubuntu, Debian, CentOS или FreeBSD. Для быстрого старта доступны готовые образы: Bitrix, Django-стек, Docker, FastPanel, Hestia CP, Keitaro, LAMP, Node, OpenVPN, Outline, Portainer, Vesta CP и другие.</p><h3>Управление и поддержка</h3><p>Провайдер обещает круглосуточную техническую поддержку, резервные копии (бэкапы) и автоснапшоты. Для автоматизации предусмотрен API; в панели управления можно масштабировать ресурсы, перезагружать сервер и следить за статистикой.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-31/fabfe43d-7891-4129-8ad5-e87f45b087ef.png" alt="" /></figure><h2>Как выбрать VPS под свой проект</h2><p>Для сайта с пиковыми нагрузками подойдёт SmartApe, где дисковая подсистема на NVMe-SSD в RAID-10 обеспечивает скорость чтения до 8000 Мбайт/с и записи до 2000 Мбайт/с, а сайт на конфигурации с 2 vCPU, 4 ГБ RAM и 80 ГБ SSD выдерживает 300–500 уникальных посетителей в день с пиком до 50 одновременных пользователей и нагрузкой 5–10 запросов в секунду (короткими всплесками до 20).</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-08-20/bc98805d-7f7f-471d-a2a2-1df68139c637.png" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-08-20/204e63be-985f-449d-a37c-37ca9993d335.png" alt="" /></figure><p>Если проект включает высоконагруженный API, например, на Node.js, то оптимален SmartApe с конфигурацией 4 vCPU, 8 ГБ RAM и 160 ГБ NVMe, которая стабильно обрабатывает 50–100 запросов в секунду (пики до 200) при 500–1000 одновременных подключениях (максимум 2500) и трафике до 200 ГБ в месяц.</p><p>Для задач с 1С, где важна стабильность и сокращение IT-расходов, выбирайте InCloud на базе AMD EPYC 9554: в кейсе Vamkamin это ускорило работу системы на 40%, сократило расходы на 35% и минимизировало простои, с ежедневными бэкапами до 30 дней и SLA-договором.</p><p>Если нужен VPS для Битрикс с высокой частотой CPU, подойдёт FirstVDS на AMD Ryzen (CPU.Турбо) с частотой до 5,7 ГГц и DDR5: скидка 30% на 3 месяца при покупке лицензии Битрикс, плюс отказоустойчивость на кластере Ceph с репликацией данных.</p><p>Для веб-студий с разработкой и поддержкой сайтов для e-commerce, где требуется распределение проектов по производительности и бесперебойная работа в сезонные пики, подойдёт InCloud на AMD EPYC 9554: в кейсе 100UP это сократило время отклика на 45% и обеспечило стабильность под высокой нагрузкой.</p><p>Если проект ориентирован на международный трафик с предсказуемыми ресурсами и высоким SLA, выбирайте PSB Hosting с локациями в Нидерландах, США, Германии или Финляндии, безлимитным трафиком и каналом до 10 Гбит/с на DDR5 и NVMe в RAID 10.</p><p>Для бэкенда мобильного приложения с нагрузкой до 12 000 уникальных пользователей в сутки (утилизация CPU 25%) подойдёт ИХЦ на NVMe/24 с 24 ГБ RAM и ~200 ГБ SSD, стеком nginx, PHP, MySQL.</p><p>Если развлекательный сайт с более чем 5000 уникальных пользователей в сутки (загрузка CPU ~20%), то подходит ИХЦ на NVMe/12 с 12 ГБ RAM и ~120 ГБ SSD, стеком nginx, Docker, Node.js. Он обеспечит стабильность с безлимитным трафиком и DDoS-защитой.</p><p>Выбор сводится к трём вопросам: где ваши<br />пользователи, какую пиковую нагрузку вы ждёте и нужен ли формальный SLA.<br />Сформулируйте эти требования заранее — и любой из пяти хостингов закроет задачу<br />без проблем в продакшне. Добавить свои рекомендации VPS хостингов — вы всегда<br />можете в комментариях, желательно описывать короткие кейсы.</p>]]></content:encoded>
    </item>
    <item>
      <title>10 библиотек Python, которые меняют карьеру</title>
      <link>https://tproger.ru/articles/10-bibliotek-python--kotorye-menyayut-kareru</link>
      <comments>https://tproger.ru/articles/10-bibliotek-python--kotorye-menyayut-kareru?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Татьяна Жукова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/10-bibliotek-python--kotorye-menyayut-kareru</guid>
      <description><![CDATA[<p>10 библиотек Python, которые помогут прокачаться в аналитике, ML и разработке. Как они работают и почему меняют карьеру.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/10-bibliotek-python--kotorye-menyayut-kareru">10 библиотек Python, которые меняют карьеру</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Тестирование]]></category>
      <category><![CDATA[Парсинг]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[JSON]]></category>
      <category><![CDATA[MySQL]]></category>
      <category><![CDATA[Отладка]]></category>
      <category><![CDATA[Нейронные сети]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[Jupyter Notebook]]></category>
      <category><![CDATA[Визуализация]]></category>
      <category><![CDATA[Образование]]></category>
      <category><![CDATA[OpenAI]]></category>
      <category><![CDATA[Анализ данных]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Аналитика]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[аналитик]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 17 Jul 2025 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>У Python тысячи библиотек, но лишь немногие действительно меняют карьеру. Они помогают не просто решать задачи, а ускорять проекты, прокачивать навыки и выходить на следующий уровень в аналитике, машинном обучении и разработке. В этом материале мы собрали 10 библиотек, которые помогут зарабатывать на Python и развивать навыки.</p><h2>1. Pandas</h2><p>Pandas — библиотека для работы с данными в Python, позволяющая легко загружать, анализировать, очищать и преобразовывать числовую информацию в удобной табличной форме. По сути, это Excel, который смог, и позволяет делать всё автоматизировано и на порядки быстрее.</p><p>Библиотека строится вокруг двух ключевых структур: <b>Series</b> (одномерный массив с индексами); <b>DataFrame </b>(таблица с индексами и колонками).</p><h3>Какие задачи решает библиотека</h3><p>Pandas полезна для следующих задач:</p><ul><li>Сам анализ данных: можно быстро фильтровать, группировать, агрегировать и строить сводные таблицы.</li><li>Очистка данных: удаляем пустые строки, заменяем значения, приводим типы.</li><li>Загрузка данных из CSV, Excel, SQL.</li><li>Визуальная разведка данных (EDA) перед построением моделей.</li><li>Подготовка данных для ML и отчётов.</li><li>Автоматизация отчётов и ETL-пайплайнов.</li></ul><p>Благодаря Pandas аналитик превращается в инженера данных, а ML-специалист может сосредоточиться на моделях, а не на ручной подготовке датасетов.</p><h3>Как пользоваться</h3><p>Ниже разберём простейший кейс: нужно загрузить данные о зарплатах разработчиков из CSV, посчитать среднюю зарплату по языкам программирования и отобрать топ-5.</p><h3>Почему это меняет карьеру</h3><p>Работа с Pandas становится границей между знанием Python и умением решать задачи бизнеса. Для <b>джуна </b>это шанс сразу показать практическую пользу: выгрузки, отчёты и базовый анализ можно делать в десятки раз быстрее и аккуратнее, чем вручную в эксельке.</p><p>Для <b>аналитика</b> Pandas превращается в главный рабочий инструмент, позволяя не просто проверять гипотезы и делать сводные таблицы, а строить полноценные отчётные пайплайны, автоматизировать рутинные выгрузки и концентрироваться на сути данных, а не на правках ручками.</p><p>Для <b>ML-инженера</b> владеть Pandas — значит уметь готовить датасеты качественно; быстро очищать и приводить данные к нужному виду, что напрямую влияет на результат моделей. Без этого работа над проектами машинного обучения часто превращается в бесконечную возню с данными.</p><p>Наконец, даже для <b>разработчиков</b> Pandas может стать неожиданным бустом в карьере. Например, когда нужно автоматизировать отчёты для бизнеса или быстро анализировать логи и данные из БД без поднятия дашбордов — Pandas даёт гибкость и скорость, которые редко даёт что-то ещё в экосистеме Python.</p><h2>2. Django</h2><p>Django — фреймворк для веб-разработки на Python, который позволяет быстро создавать надежные и масштабируемые веб-приложения. Он следует принципам DRY (Don’t Repeat Yourself — не повторяй себя), предоставляя разработчику ORM, роутинг, систему авторизации, админку, работу с формами, шаблонами и инструментами безопасности из коробки.</p><p>Django подходит как стартапам, которым нужно быстро выйти на рынок, так и крупным проектам с миллионами пользователей. Это не просто библиотека, а полноценный каркас для построения и сопровождения веб-сервисов.</p><h3>Какие задачи решает библиотека</h3><p>Каркас, действительно, каркасный. Задачи следующие:</p><ul><li>Создание веб-приложений и API любой сложности.</li><li>Быстрая разработка MVP, прототипов и коммерческих проектов.</li><li>Упрощение работы с базами данных через ORM, без написания сырого SQL.</li><li>Построение административных панелей для управления данными без ручной разработки.</li><li>Гибкая маршрутизация и работа с формами, валидацией и шаблонами.</li><li>Реализация аутентификации, авторизации и защиты приложений.</li></ul><p>Django позволяет сосредоточиться на бизнес-логике и продукте, не тратить недели на настройку инфраструктуры.</p><h3>Как пользоваться</h3><p>Устанавливаем:</p><p>Создаем проект и приложение:</p><p>Пример модели:</p><p>Миграция базы данных:</p><p>Создание админки:</p><p>После этого можно запустить сервер:</p><p>И перейти по адресу http://127.0.0.1:8000/admin для управления записями через готовую админ-панель.</p><h2>3. PyTorch</h2><p>PyTorch — мощная библиотека Python. Она позволяет строить и обучать нейронные сети, проводить вычисления с автоматическим дифференцированием и работать с GPU для ускорения самих вычислений.</p><p>Главное отличие PyTorch от других ML-фреймворков — динамическая вычислительная графика (define-by-run): модель строится и изменяется во время выполнения кода, что даёт гибкость при создании и отладке сложных моделей.</p><p>Сегодня PyTorch используется в продакшен системах, научных исследованиях, компьютерном зрении, NLP и генеративных моделях, занимая ведущее место в индустрии.</p><h3>Какие задачи решает библиотека</h3><p>В функционал PyTorch входят:</p><ul><li>Построение нейронных сетей любой сложности (CNN, RNN, трансформеры);</li><li>Обучение и тестирование моделей на CPU и GPU;</li><li>Реализация кастомных слоёв и loss-функций;</li><li>Разработка и деплой ML/AI моделей в продакшен;</li><li>Быстрая итерация гипотез с удобной отладкой.</li></ul><p>С PyTorch можно начать с простых нейронных сетей, а затем перейти к реализации современных архитектур.</p><h3>Как пользоваться</h3><p>Установим PyTorch (на CPU, для GPU потребуется версия с CUDA):</p><p>Рассмотрим кейс обучения простой нейронной сети для классификации рукописных цифр MNIST.</p><p>После обучения можно использовать torch.save() для сохранения модели и torch.load() для загрузки в продакшн.</p><h3>Почему это меняет карьеру</h3><p>PyTorch — билет в мир современной разработки AI и машинного обучения. Владение инструментом даёт <b>разработчику</b> возможность уверенно войти в области, которые продолжают оставаться топовыми на рынке: искусственный интеллект, компьютерное зрение, NLP, генерация изображений и видео и т.д.</p><p>Для <b>начинающего ML/AI-специалиста </b>PyTorch помогает лучше понять, как устроены нейронные сети, и под капотом увидеть, как происходят вычисления. Это ускоряет рост навыков и делает разработчика востребованным в исследованиях и R&amp;D-проектах.</p><p>Для <b>дата-сайентистов</b> PyTorch позволяет превратить исследовательские ноутбуки в готовые к деплою модели, благодаря PyTorch Lightning, TorchScript и ONNX.</p><p>Для<b> разработчиков, которые хотят выйти на рынок AI</b>, PyTorch — это мастхев: проекты в стартапах и крупных компаниях всё чаще строятся вокруг него. Умение писать кастомные loss-функции, проектировать сложные пайплайны обучения, настраивать обучение на кластерах и GPU — компетенции, которые существенно бустят зарплату.</p><p>PyTorch в целом помогает расширять портфолио: с ним можно создавать генеративные модели, строить LLM, участвовать в соревнованиях и работать с самыми современными подходами в машинном обучении.</p><h2>4. Polars</h2><p>Polars — современная библиотека для обработки данных в Python, созданная как альтернатива Pandas. Она использует колоночную архитектуру и многопоточность, что позволяет работать с большими объёмами данных значительно быстрее и с меньшим потреблением памяти.</p><p>Polars вдохновлена Pandas, но её API оптимизировано для производительности и удобства, а также даёт разработчику возможность писать цепочки ленивых вычислений, которые оптимизируются перед выполнением. Это делает её отличным инструментом для аналитиков, дата-инженеров и дата-сайентистов, которым нужно обрабатывать данные быстро.</p><h3>Какие задачи решает библиотека</h3><p>Polars явно есть, чем гордиться:</p><ul><li>Загрузка, очистка и преобразование больших датасетов;</li><li>Анализ данных с использованием цепочек преобразований;</li><li>Быстрая агрегация и группировка данных;</li><li>Ленивые вычисления: построение пайплайнов преобразования данных, которые выполняются только при вызове collect().</li><li>Обработка данных, которые не помещаются в память, за счёт эффективности и колоночной архитектуры.</li></ul><p>Если Pandas начинает притормаживаться на данных в несколько гигабайт, Polars обычно продолжает работать быстро, позволяя без боли обрабатывать большие CSV.</p><h3>Как пользоваться</h3><p>Установка:</p><p>Давайте загрузим данные и проведем базовые трансформации:</p><p>А вот и пример ленивых вычислений:</p><p>В чем особенность:</p><ul><li>pl.read_csv загружает данные сразу.</li><li>pl.scan_csv создаёт план вычислений для последующей оптимизации.</li><li>Используются выражения (pl.col, .with_columns, .agg), которые композируются без создания промежуточных копий, это ускоряет процесс.</li></ul><h3>Почему это меняет карьеру</h3><p>Polars меняет карьеру, потому что даёт преимущество в скорости и эффективности при работе с данными. Там, где Pandas уже не справляется, полярный медведь приходит на помощь.</p><p>Для <b>дата-инженеров</b> Polars полезен при построении ETL и пайплайнов обработки данных, где важна скорость и предсказуемое потребление ресурсов. Его можно использовать в продакшен-скриптах, для подготовки данных к ML и для автоматизации отчётности.</p><p>Для <b>дата-сайентистов </b>Polars даёт возможность анализировать больше данных за меньшее время, быстро итерировать гипотезы и ускорять исследования. Его API достаточно близок к Pandas, поэтому переход не требует месяцев переучивания.</p><p>Освоение Polars показывает работодателям, что ты не просто знаешь стандартные инструменты, но умеешь выбирать оптимальные решения для реальных задач, повышая эффективность работы команды. В эпоху роста данных это критично для любого Python-разработчика, работающего с аналитикой и машинным обучением.</p><h2>5. FastAPI</h2><p>FastAPI — современный фреймворк для создания API на Python, заточенный под скорость, асинхронность и валидацию данных из коробки. Он построен на Starlette и Pydantic, автоматически создаёт OpenAPI-документацию, поддерживает асинхронное программирование и позволяет писать производительные REST и WebSocket API с минимальным количеством кода.</p><p>Вместо долгой настройки, как у Flask или Django, в FastAPI многое готово изначально: удобная работа с запросами и ответами, декларативная валидация, документация Swagger, асинхронность и высокая производительность без лишних усилий.</p><h3>Какие задачи решает</h3><p>Задач, действительно, много:</p><ul><li>Быстрая разработка REST API для мобильных и веб-приложений;</li><li>Создание бэкенда для ML/DS моделей (деплой моделей в виде API);</li><li>Построение микросервисов с хорошей производительностью;</li><li>Реализация websocket-серверов и асинхронных API;</li><li>Подготовка внутренних инструментов или бэкендов для MVP.</li></ul><p>FastAPI помогает быстро запускать API и уверенно масштабировать его в полевых условиях. Это один из немногих фреймворков Python, который по скорости работы сопоставим с Node.js и Go.</p><h3>Как пользоваться</h3><p>Во-первых, нужно установить FastAPI и Uvicorn (используем ASGI-сервер для запуска):</p><p>Простейший API-пример с эндпоинтом GET /:</p><p>Запускаем сам сервер:</p><p>После запуска API будет доступен по адресу http://127.0.0.1:8000/. Автоматически доступна интерактивная документация Swagger по адресу http://127.0.0.1:8000/docs.</p><p>FastAPI поддерживает валидацию параметров запроса, тел запросов и путей прямо через типы Python. Например, простой эндпоинт с параметром:</p><p>При вызове http://127.0.0.1:8000/items/10?q=test FastAPI автоматически проверит, что item_id — это число, и распарсит q как строку.</p><h3>Почему это меняет карьеру</h3><p>FastAPI — билет в мир бэкенда, где скорость и чистота кода имеют довольно высокое значение. Для <b>Python-разработчика </b>это возможность быстро освоить создание API и микросервисов, не увязнув в громоздкой настройке, как в Django, и при этом получить систему, готовую к продакшену.</p><p>Для <b>ML-специалиста</b> FastAPI становится инструментом для деплоя моделей: можно обернуть пайплайн предсказаний в API, подключить авторизацию или логирование и получить работающий сервис за считанные дни.</p><p>Вообще умение быстро поднимать и поддерживать API — навык, который ценят в бигтехе и стартапах. На разработчиков, которые владеют FastAPI, часто равняются: они умеют превращать идеи бизнеса в работающие сервисы за минимальное время.</p><h2>6. Typer</h2><p>Typer — современная библиотека для создания CLI-приложений на Python с минимальным количеством кода и автоматической генерацией документации. Автор библиотеки — Себастьян Рамирес, создатель FastAPI.</p><p>Главная особенность Typer — использование type hints для автоматического парсинга аргументов командной строки. Вы получаете удобную и читаемую CLI с поддержкой автодополнения и цветного вывода за считанные минуты.</p><h3>Какие задачи решает библиотека</h3><p>Список задач такой:</p><ul><li>Создание CLI-утилит любого уровня сложности.</li><li>Быстрое прототипирование и упаковка Python-скриптов в удобные инструменты для продакшена.</li><li>Генерация подробной справки (--help) и автодополнения команд.</li><li>Облегченная поддержка и масштабирование CLI за счёт структуры и читаемого кода.</li><li>Организация CLI с подкомандами, вложенными аргументами и обработкой ошибок.</li></ul><p>Typer использует аннотацию типов и минимум шаблонного кода.</p><h3>Как пользоваться</h3><p>Установка:</p><p>Пример минимальной CLI:</p><p>Теперь можно запустить из консоли:</p><p>Результат будет такой: Привет, Алиса! Тебе 25 лет.</p><h3>Почему это меняет карьеру</h3><p>Typer меняет карьеру тем, что открывает путь к созданию удобных CLI-инструментов, которые автоматизируют рутину и повышают продуктивность.</p><p>С Typer можно быстро превращать свои Python-скрипты в надежные утилиты, которыми удобно пользоваться и другим разработчикам, и сотрудникам из других отделов. CLI-приложения часто становятся клеем инфраструктуры: они позволяют автоматизировать деплой, миграции БД, сбор данных, интеграцию с внешними API и локальную разработку.</p><p>Если вы <b>Data Scientist или ML-инженер</b>, Typer позволяет оборачивать пайплайны в CLI, которые легко запускать из Jenkins, Airflow или вручную. Если вы <b>DevOps или Backend-инженер</b>, можете создавать CLI для работы с инфраструктурой и сервисами без сложных зависимостей.</p><p>Кроме того, работа с Typer улучшает навык структурирования кода, понимание CLI, использования type hints и разработки инструментов, которые делают работу проще для других. А это, очевидно, ценится в любой команде и повышает востребованность специалиста.</p><h2>7. Rich</h2><p>Rich — библиотека Python для красивого форматирования и интерактивного отображения информации в терминале. С её помощью можно выводить цветные таблицы, маркдаун, прогресс-бары, подсвеченный синтаксис кода, деревья каталогов и логирование в понятной и привлекательной форме.</p><p>Rich создана для того, чтобы «оживить» консоль Python, сделать логи удобными для восприятия, а CLI-инструменты — профессионально выглядящими без лишних усилий. Это библиотека, которая улучшает и UX, и DX.</p><h3>Какие задачи решает</h3><p>Про красоту не забываем! Задачи следующие:</p><ul><li>Цветное и структурированное логирование, понятное при чтении логов в реальном времени.</li><li>Отображение прогресс-баров для долгих операций.</li><li>Вывод таблиц, деревьев каталогов, JSON прямо в терминале.</li><li>Подсветка синтаксиса кода для CLI-инструментов.</li><li>Создание CLI-интерфейсов, которые выглядят профессионально и современно.</li><li>Улучшение читаемости при отладке скриптов.</li></ul><p>С помощью Rich можно быстро сделать понятными даже сложные данные при отладке или демонстрации.</p><h3>Как пользоваться</h3><p>Установка Rich:</p><p>Для примера выведем таблицу с подсветкой в консоли:</p><p>В результате в терминале получится цветная таблица, которая выглядит понятно и презентабельно.</p><h3>Почему это меняет карьеру</h3><p>Rich — это библиотека, которая помогает быстро повысить качество любого CLI-инструмента или дев-опыт в команде. <b>Разработчик</b>, который использует Rich, делает свои инструменты удобными не только для себя, но и для коллег: логирование становится понятным, а отладка скриптов — наглядной.</p><p>Во многих стартапах и продвинутых командах важна скорость обратной связи при тестировании пайплайнов и автоматизаций, и Rich помогает выводить ключевую информацию максимально читаемо.</p><p>Кроме того, Rich позволяет быстро создавать CLI-интерфейсы, которые выглядят как продакшен-продукты, даже если это внутренние инструменты. Руководство будет радоваться и думать о вас как о крутом разрабе.</p><p>Для <b>дата-инженеров и разработчиков DevOps</b> Rich полезна при создании админ-утилит и при мониторинге пайплайнов, для <b>Python-разработчиков</b> — при создании библиотек и фреймворков с CLI.</p><h2>8. LangChain</h2><p>LangChain — фреймворк для создания приложений на базе LLM, например, GPT, Claude, Mistral, Gemini. Он позволяет строить цепочки обработки запросов, интегрировать LLM с данными и инструментами, добавлять память и управление состояниями, а также связывать работу модели с внешними API и базами знаний.</p><p>LangChain предоставляет удобный слой абстракции над вызовами LLM и ускоряет разработку чат-ботов, RAG-приложений, агентов с инструментами, систем анализа документов и других AI-сервисов.</p><h3>Какие задачи решает</h3><p>Список внушительный:</p><ul><li>Интеграция LLM в Python-приложения без необходимости писать тот самый клеевой код вручную.</li><li>Построение цепочек с последовательной обработкой сообщений, включая преобразования и вызовы внешних функций.</li><li>Добавление памяти в чат-боты для сохранения истории общения и контекста.</li><li>Использование агентов для динамического вызова инструментов (веб-поиск, базы данных, API).</li><li>Создание RAG-систем с интеграцией LLM и векторных БД.</li><li>Быстрая сборка прототипов LLM-приложений, которые можно развернуть в продакшен.</li></ul><h3>Как пользоваться</h3><p>Установка:</p><p>Создадим простую цепочку с чатом GPT:</p><p>Благодаря единым абстракциям, можно гибко комбинировать цепочки, память и вызов внешних инструментов, не усложняя код.</p><h3>Почему это меняет карьеру</h3><p>LangChain меняет карьеру, потому что открывает новый пласт Python-разработки в AI и LLM-инженерии, быстро превращая пользователя GPT в создателя полноценных AI-приложений. Вместо того чтобы писать хаотичный клеевой код, вы начинаете системно проектировать цепочки запросов, учитесь строить продуманные промпты и объединять их с инструментами, памятью и внешними API.</p><p>Работа с LangChain погружает в практическую LLM-инженерию: вы начинаете создавать RAG-приложения, которые умеют искать и анализировать данные перед генерацией ответа и строить агентов. Это востребовано в продуктах, где нужно подключать ИИ к базам знаний, автоматизировать задачи и разрабатывать интерактивные системы, которые реально используют модели в продакшене.</p><p>LangChain позволяет быстро собирать и запускать MVP AI-продуктов, что дает конкурентное преимущество при создании стартапов или внутренних сервисов. А ещё учит мыслить структурами и проектировать масштабируемую архитектуру LLM-приложений и видеть, как генеративный ИИ можно превратить в рабочий инструмент.</p><h2>9. SQLAlchemy</h2><p>SQLAlchemy — это мощная ORM и toolkit для работы с базами данных в Python, позволяющая писать SQL-запросы декларативно, создавать модели таблиц и управлять транзакциями в Python-коде без ручного написания SQL.</p><p>Библиотека даёт разработчику два уровня контроля:</p><ul><li>Core: низкоуровневая работа с SQL выражениями и соединениями;</li><li>ORM: высокоуровневая декларативная работа с моделями, классами и связями между таблицами.</li></ul><p>SQLAlchemy поддерживает PostgreSQL, MySQL, SQLite, Oracle и другие СУБД, давая единую абстракцию, без привязки к конкретному движку.</p><h3>Какие задачи решает</h3><p>Пул задач следующий:</p><ul><li>Описание таблиц в виде Python-классов и управление ими через сессии;</li><li>Создание, чтение, обновление и удаление данных;</li><li>Миграция SQL на декларативный стиль без потери гибкости;</li><li>Полный контроль над транзакциями и выполнением запросов;</li><li>Работа с асинхронными приложениями при создании FastAPI/Django-приложений;</li><li>Экранирование параметров, которое снижает вероятность SQL-инъекций и ошибок.</li></ul><h3>Как пользоваться</h3><p>Создадим минимальный пример для SQLite с таблицей пользователей:</p><p>Этот код создаёт базу example.db, таблицу users, добавляет туда одного пользователя и выводит всех пользователей в базе. При необходимости можно использовать SQLAlchemy Core для написания гибких запросов вручную, если нужно работать ближе к SQL.</p><h3>Почему это меняет карьеру</h3><p>SQLAlchemy меняет карьеру <b>Python-разработчика</b> тем, что даёт понимание системной работы с данными, архитектуры приложений и взаимодействия с реальными базами данных. Вы учитесь строить продуманные бэкенды, которые работают с транзакциями, миграциями, связями между таблицами и сложными выборками.</p><p>Знание SQLAlchemy открывает дорогу в мир API, микросервисов и продуктов, где требуется качественное управление данными и гибкая логика работы с БД. Работа с SQL теперь совсем не страшная.</p><h2>10. Seaborn</h2><p>Seaborn — библиотека для визуализации данных на Python, построенная поверх Matplotlib и упрощающая создание информативных и стильных графиков с минимальным количеством кода.</p><p>Она автоматически заботится о красивых стилях, цветах, разметке графиков, легендах и позволяет легко строить распределения, линейные графики, тепловые карты и другие визуализации.</p><p>Библиотека тесно интегрируется с Pandas DataFrame, позволяя использовать колонки данных напрямую для построения графиков, что делает её идеальной для EDA (разведочного анализа данных) и подготовки визуализаций для отчётов и презентаций.</p><h2>Какие задачи решает</h2><p>Визуализация безумно важна, особенно в контексте дата-аналитики. Seaborn отвечает за:</p><ul><li>Быстрое построение информативных графиков для анализа данных и поиска инсайтов;</li><li>Автоматическую обработку ошибок отображения и масштабирования, что экономит время;</li><li>Поддержку сложных визуализаций по типу ящиков с усами или тепловых карт без десятков строк кода;</li><li>Стилизацию графиков без ручных настроек Matplotlib;</li><li>Возможность добавлять статистические элементы (линию регрессии, KDE, распределение);</li><li>Интеграцию с Jupyter Notebook для интерактивного анализа данных.</li></ul><h3>Как пользоваться</h3><p>Допустим, у нас есть датасет с данными о чаевых:</p><p>В три строки мы получаем чистый и читаемый ящик с усами, показывающий, как счет за ужин распределяется по дням недели.</p><p>Для построения более сложных графиков можно использовать диаграмму рассеяния:</p><p>Тут мы добавляем цветовую кодировку по полу, чтобы увидеть зависимости между переменными.</p><h3>Почему это меняет карьеру</h3><p>Seaborn меняет карьеру, потому что даёт навык визуального анализа данных, что критично в современной аналитике и дата-инженерии. Умение быстро строить графики и видеть аномалии, распределения и взаимосвязи между переменными превращает работу с данными из слепого копания в числах в структурный анализ.</p><p>Использование Seaborn в Python-стеке помогает выделиться среди разработчиков, которые ограничиваются Pandas и текстовыми логами, ведь визуализация часто позволяет быстрее заметить закономерности и убедить команду или заказчика в правильности гипотезы.</p><p>Seaborn также учит пониманию данных через визуальные паттерны, что улучшает навыки построения моделей машинного обучения (так понятнее, какие признаки важны), и помогает создавать наглядные отчёты для продуктовых решений, где результат анализа нужно доносить до людей не из айти-индустрии.</p><p><i>А какими библиотеками пользуетесь вы? Делитесь в комментариях!</i></p>]]></content:encoded>
    </item>
    <item>
      <title>Сломал ногу — выучил Python: как ИИ помог экс-консультанту стать программистом за 100 дней</title>
      <link>https://tproger.ru/news/slomal-nogu---vyuchil-python--kak-ii-pomog-eks-konsultantu-stat-programmistom-za-100-dnej</link>
      <comments>https://tproger.ru/news/slomal-nogu---vyuchil-python--kak-ii-pomog-eks-konsultantu-stat-programmistom-za-100-dnej?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/slomal-nogu---vyuchil-python--kak-ii-pomog-eks-konsultantu-stat-programmistom-za-100-dnej</guid>
      <description><![CDATA[<p>Экс-консультант стал программистом за 100 дней с помощью ChatGPT и Python — собрал портфолио, прошел собеседование и получил работу без курсов и Leetcode</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/slomal-nogu---vyuchil-python--kak-ii-pomog-eks-konsultantu-stat-programmistom-za-100-dnej">Сломал ногу — выучил Python: как ИИ помог экс-консультанту стать программистом за 100 дней</a>»</p>]]></description>
      <category><![CDATA[Тестирование]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[CI/CD]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 02 Jun 2025 18:09:04 GMT</pubDate>
      <content:encoded><![CDATA[<p>Эрик Леннрот, бывший консультант в Big Four, <a href="https://eriklonnroth.com/100-days/">стал программистом</a> всего за 100 дней — благодаря больничному, упорству и ChatGPT.</p><p>Все началось, когда 38-летний Эрик сломал лодыжку во время пробежки. Лежа дома, он увидел в соцсетях истории о том, как люди запускали SaaS-проекты за выходные с помощью ИИ. Это вдохновило его на третью попытку освоить программирование.</p><h2>Учеба без бюджета — только ИИ и бесплатные курсы</h2><p>Эрик решил не тратить ни копейки на курсы. Он выбрал Python как основной язык и прошел CS50 от Гарварда — сначала курс по Python, потом по веб-разработке.</p><p>С ИИ он работал как с личным наставником: писал псевдокод, просил ChatGPT раскритиковать его, затем вручную набирал код. Синтаксис — по запросу. Такой подход позволил быстрее понять концепции, а не просто запомнить команды.</p><p>Свой первый проект он сделал по мотивам Wordle — игру на угадывание слов он реализовал на Python под названием PyWordle.</p><p>Затем собрал полноценное веб-приложение Make My Meal Plan: генерация рецептов, списки покупок, TailwindCSS, Django, PostgreSQL, CI/CD и даже тестирование через Playwright — все своими руками за 150 часов. Проект включал 25 000 строк кода.</p><h2>Работа после 100 дней</h2><p>Через 3 месяца обучения он получил оффер. Без Leetcode, без алгоритмических задач — только благодаря портфолио. Его взяли на испытательный срок в консалтинговую компанию в Лондоне, чтобы он заменил Excel и устаревшие тулзы на автоматизированные пайплайны.</p><p>Эрик честно рассказал, что научился программировать за пару месяцев и активно использовал ИИ — и все равно его приняли.</p><p>По его словам, весь путь стоил $120 — подписки на Claude Pro и Cursor. Все остальное — бесплатные курсы и открытые материалы. Недавно он прошел испытательный срок, получил повышение и теперь работает с геоданными и статистикой, используя pandas и ArcGIS. Параллельно пишет Django-приложение для анализа населения и доходов в Великобритании.</p><h2>«Точно вовремя» вместо «на всякий случай»</h2><p>Эрик считает, что его история — отражение новой реальности: вместо долгих программ и формального образования — самостоятельное обучение под задачи, с фокусом на инициативу и реальные результаты. ИИ в этом — не костыль, а катализатор.</p>]]></content:encoded>
    </item>
    <item>
      <title>Большой гайд по React от Tproger: топовые статьи и инструменты</title>
      <link>https://tproger.ru/articles/bolwoj-gajd-po-react-ot-tproger--topovye-stati-i-instrumenty</link>
      <comments>https://tproger.ru/articles/bolwoj-gajd-po-react-ot-tproger--topovye-stati-i-instrumenty?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Анна Ельцова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/bolwoj-gajd-po-react-ot-tproger--topovye-stati-i-instrumenty</guid>
      <description><![CDATA[<p>Гайд по реакт. Топовые статьи и инструменты. React для новичков. Делимся теорией и практическими рейсами. Tproger. </p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/bolwoj-gajd-po-react-ot-tproger--topovye-stati-i-instrumenty">Большой гайд по React от Tproger: топовые статьи и инструменты</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Практика]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Redux]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Flutter]]></category>
      <category><![CDATA[Пет-проект]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 01 May 2025 10:00:04 GMT</pubDate>
      <content:encoded><![CDATA[<p>Внутри этого гайда — самые топовые статьи от Tproger, c помощью которых вы сможете прокачать свои навыки: от базовых паттернов до сложных анимаций и бэка. Сначала немного разберемся в теории, а потом — перейдем к практике и реальным проектам, которые реализовали наши читатели. Не забудьте сохранить гайд!</p><h2>Немного базы</h2><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-05-05/08ef6c61-544e-4c5a-91dc-d0d4d3200357.jpg" alt="" /></figure><p>В этих статьях рассказываем о том, что нужно знать новичкам и не только.</p><ul><li><a href="https://tproger.ru/articles/reactjs-na-izi--chto-realno-nuzhno-znat-frontend-razrabotchiku-v-2025-godu">ReactJS на изи: что реально нужно знать фронтенд-разработчику в 2025 году</a> — помогаем новичкам войти войти и показываем опытным разработчикам, что они могли упустить.</li><li><a href="https://tproger.ru/articles/kakie-est-patterny-v-react-i-dlya-chego-oni-nuzhny--chast-1">Какие есть паттерны в React и для чего они нужны: часть 1</a> и <a href="https://tproger.ru/articles/kakie-est-patterny-v-react-i-dlya-chego-oni-nuzhny--chast-2">Какие есть паттерны в React и для чего они нужны: часть 2</a> — здесь объясняем популярные архитектурные паттерны в React, когда и зачем их применять.</li><li><a href="https://tproger.ru/articles/luchwie-biblioteki-dlya-animacij-na-react">7 библиотек для анимаций на React / Tproger</a> — собрали актуальные библиотеки для анимации в React; сравнение, демо и рекомендации.</li><li><a href="https://tproger.ru/translations/mistakes-junior-react-developers-make">Типичные ошибки джунов, использующих React</a> — показываем типичные ошибки junior-разработчиков в React, рассказываем, как писать чище и стабильнее.</li><li><a href="https://tproger.ru/articles/podgotovka-okruzhenija-react-prilozhenija-vscode-prettier-eslint-stylelint-husky">Подготовка окружения React-приложения: VSCode, Prettier, ESLint, Stylelint, Husky</a> — рассказываем, как начать работу с приложениями на Реакте и что должно быть на рабочем столе.</li><li><a href="https://tproger.ru/articles/react-native-protiv-flutter--chto-luchwe">React Native против Flutter: что лучше</a> (для общего развития) — сравниваем популярные фреймворки для кроссплатформенной разработки; плюсы, минусы и рекомендации.</li><li><a href="https://tproger.ru/articles/deeplink-v-react-native--polnoe-rukovodstvo">Deeplink в React Native: Полное руководств для новичков</a> — рассказываем, что такое deeplink и как их писать на Реакте.</li></ul><h2>Практикуемся</h2><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-05-05/d2d4a20e-2de7-46d4-8b4d-bbf28558d7e6.jpg" alt="" /></figure><ul><li><a href="https://tproger.ru/articles/js--dran-and-drop--delaem-podvizhnye-bloki">Современный Drag and Drop в React с помощью dndkit: создаем перетаскиваемое меню</a> — здесь о том, как сделать меню, кнопки и все с помощью dndkit.</li><li><a href="https://tproger.ru/translations/django-react-webapp">Пишем приложение с бэкендом на Django и фронтендом на React</a> — рассказываем, как создать REST API на Джанго, добавить React и объединить это в один проект.</li><li><a href="https://tproger.ru/articles/sozdanie-todo-list-beskonechnoj-vlozhennosti-react-typescript-mobx">Создание ToDo-листа бесконечной вложенности на React, TypeScript и MobX</a> — пошагово создаем вложенные задачи в ToDo-приложении, используем MobX, React и TypeScript.</li><li><a href="https://tproger.ru/articles/sozdanie-typing-test-prilozheniya-na-react-typescript-redux-toolkit">Создание Typing Test приложения на React + TypeScript + Redux Toolkit</a> — учимся создавать приложение для проверки скорости набора текста, используем Redux Toolkit.</li><li><a href="https://tproger.ru/articles/najdi-oshibku-v-react-komponente-funkcionalnoe-karri">Найди ошибку в React-компоненте: Функциональное Карри</a> — практический кейс: ищем ошибку в React и заодно изучаем каррирование функций.</li><li><a href="https://tproger.ru/articles/windows-application-on-react">Создание приложений для Windows на React Native</a> — разбираем, как запускать и разрабатывать React Native-приложения под Windows, примеры и инструменты.</li><li><a href="https://tproger.ru/articles/recharts-optimization">Оптимизация графиков Recharts</a> — ускоряем отрисовку графиков на React с помощью Recharts, практика, кейсы и улучшения.</li><li><a href="https://tproger.ru/articles/your-first-app-in-react-native">Как разработать своё первое приложение на React Native</a> — инструкция по созданию первого мобильного приложения на React Native, от идеи до запуска.</li><li><a href="https://tproger.ru/articles/pet-proekt-na-react-kak-my-ozvuchivali-internet">Пет-проект на React. Как мы «озвучивали» интернет</a> — история реализации проекта с Web Speech API и React. Учим браузер говорить.</li></ul><p>Кстати, похожий гайд мы уже делали — про Python. Можно заценить <a href="https://tproger.ru/articles/bolwoj-gajd-po-python-ot-tproger--topovye-instrumenty-dlya-raznyh-napravlenij">здесь</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Настраиваем паука для сбора данных: как работает фреймворк Scrapy</title>
      <link>https://tproger.ru/articles/nastraivaem-pauka-dlya-sbora-dannyh--kak-rabotaet-frejmvork-scrapy</link>
      <comments>https://tproger.ru/articles/nastraivaem-pauka-dlya-sbora-dannyh--kak-rabotaet-frejmvork-scrapy?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Ekaterina Davidova]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/nastraivaem-pauka-dlya-sbora-dannyh--kak-rabotaet-frejmvork-scrapy</guid>
      <description><![CDATA[<p>В Точке мы обучаем наших AI-ассистентов, а для этого нужно много данных. В статье расскажу, как быстро собрать информацию практически с любого сайта при помощи фреймворка Scrapy. </p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/nastraivaem-pauka-dlya-sbora-dannyh--kak-rabotaet-frejmvork-scrapy">Настраиваем паука для сбора данных: как работает фреймворк Scrapy</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Парсинг]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[JSON]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[DPI]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 07 Apr 2025 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>В Точке мы обучаем наших AI-ассистентов, а для этого нужно много данных. В статье расскажу, как быстро собрать информацию практически с любого сайта при помощи фреймворка Scrapy.</p><h2>Зачем компании собирают данные</h2><p>Сегодня в интернете более 1 миллиарда сайтов. На великом и ужасном реддите каждый час появляется более 50 000 новых публикаций. На Github уже опубликовано более 300 млн публичных репозиториев. Всё это — открытые данные, которые можно использовать и, главное — собирать. Разумеется, перед этим проверить условия использования сайта, потому что некоторые из них могут запрещать сбор данных.</p><p><b>Зачем это нужно компаниям:</b></p><ul><li><b>Анализ рынка:</b> для ритейла это возможность изучить клиентов и конкурентов.</li><li><b>Мониторинг сайтов вендоров ПО: </b>некоторые компании выкладывают уязвимости в своих продуктах и делятся возможными решениями.</li><li><b>Создание продукта: </b>собранные данные можно обогатить, прикрутить красивый интерфейс, умный поиск и предложить пользователю новое приложение, типа 2GIS.</li><li><b>Развитие LLM: </b>например, Google в 2024 году заключил контракт с Reddit на сбор данных. Open AI тоже часто говорят о том, что обучают свою модель на открытых источниках, а в ближайшее время хотят подключить ещё и транскрибации с YouTube.</li></ul><p>Как вы поняли, в интернете очень много данных. И если мы хотим их собрать, то нам нужен подходящий инструмент.</p><h2>Что такое Scrapy</h2><p>Это высокоуровневый фреймворк на Python для краулинга и скреппинга сайтов. На GitHub у него больше 53 тысяч звёздочек, 10,6 тысяч форков и много глазиков. А ещё он занимает первое место по тегам #crawling и #scraping.</p><figure><img src="https://media.tproger.ru/user-uploads/108715/2025-04-06/e72840e2-833f-411b-bb5f-0ade0d6ea7f7.png" alt="" /></figure><p><b>Есть много причин, почему Scrapy так популярен: </b></p><ul><li>Это фреймворк с готовой архитектурой — там много инструментов, доступных из коробки, которые можно настроить и использовать.</li><li>Он асинхронный — чаще возникает задача замедлить его, чем ускорить.</li><li>У него простые настройки — нужно всего раз подумать над архитектурой, а добавление новых источников будет занимать минимум времени.</li><li>Scrapy удобно дебажить в любой момент, начиная от загрузки страницы и заканчивая сохранением данных в базе.</li><li>Есть продуманные селекторы, доступны CSS, Xpath. Их можно комбинировать или выбрать что-то одно.</li><li>Большое комьюнити и обновляемая документация. Ответы на большинство вопросов можно легко найти в сети.</li></ul><p>Scrapy точно подойдёт вам, если во всех ваших источниках одинаковый формат данных и вы можете унифицировать их обработку и сохранение. Но всё-таки его нельзя назвать универсальным инструментом.</p><p><b>Scrapy будет не лучшим выбором, если: </b></p><ul><li>Нужно собрать малый объем данных или собрать их нужно всего один раз.</li><li>Вам нужно отдать просто сырые html или json, а не парсить и преобразовывать данные.</li><li>Среди источников нет общей структуры данных.</li></ul><p>Во всех этих случаях мы можем использовать Scrapy, но, скорее всего, он будет излишним.</p><h2>Как работает Scrapy</h2><p>После того, как вы установили Scrapy в виртуальное окружение ( '' pip instal scrapy' ) и создали новый проект ( ' scrapy startprogect scraper '' ), вам необходимо написать своего первого «паука».</p><p>В Scrapy используется класс spider — он определяет, как мы будем извлекать данные из сайтов. Допустим, нам нужно собрать информацию с одностраничного сайта. Создаём класс TestSpider, наследуемся от scrapy.Spider, добавляем атрибут name с уникальным именем и start_urls, где укажем страницы, с которых нужно начать поиск. После этого переопределим метод parse.</p><p>Parse является дефолтным для обработки ответов. Если вы сделаете request и не укажете функцию, которая должна его обработать, то ответ от запроса придёт в метод parse. Поэтому его, как минимум, нужно переопределить и назначить логику.</p><p>Допустим, нас интересует информация о компании — название и описание. Можем создать объект данных с двумя элементами — title и content, и с помощью двух xpath селекторов забрать со страницы заголовок и описание.</p><p>В конце передаём этот объект данных для последующей обработки в ядро. Это всё, что нужно, чтобы начать парсинг на Scrapy.</p><h2>Обработка данных в Scrapy</h2><p>Дальше в ход вступает PipeLine. Он отвечает за обработку данных, валидацию или сохранение. В Scrapy есть пайплайны, готовые из коробки, но вы также можете написать их самостоятельно.</p><p>В ValidatePipeline мы проверяем объект данных на наличие title, а в SavePipeline — сохраняем объект в качестве json.</p><p>Здесь я просто показал, как можно создать пайплайн самостоятельно. Но имейте в виду, что это не очень отказоустойчивый код, поэтому в проде так делать не стоит.</p><h2>Зачем нужен Middleware</h2><p>Middleware очень похож на PipeLine, только он обрабатывает не объекты данных, а запросы и ответы от сайта.</p><p>В Scrapy есть несколько разных middleware:</p><ul><li><b>scheduler middleware:</b> помещает запросы в очередь и извлекает их для обработки.</li><li><b>spider middleware: </b>управляет данными между пауком и ядром.</li><li><b>downloader middleware: </b>управляет данными между ядром и загрузчиком.</li></ul><p>Получается такая схема работы компонентов Scrapy:</p><p><i>Запрос: Spider → Spider Middleware → Engine → Scheduler Middleware → Scheduler → Engine → Downloader Middleware → Downloader → Server (сайт)</i></p><p><i>Ответ: Server → Downloader → Downloader Middleware → Engine → Spider Middleware → Spider → Item Pipeline → Storage (хранилище данных)</i></p><p>Скорее всего, в первую очередь вы будете настраивать downloader middleware, поэтому разберём его подробнее.</p><p>Ниже продемонстрировал два примера, как можно написать свой Middleware. В RandomProxyMiddleware мы обрабатываем все запросы, которые будет отсылать наш паук с помощью метода process_request (добавляем рандомную прокси к каждому реквесту), а в CheckCaptchaMiddleware — обрабатываем все ответы с помощью метода process_response (проверяем ответ от сайта, ищем в нём слово captcha).</p><p>Итак, мы написали Pipeline и Middlewares. Дальше нужно указать, как мы будем их использовать. Для этого запишите их в файле <a href="http://settings.py/">settings.py</a>, где находятся настройки проекта.</p><p>Начнём с пайплайнов. Цифра справа — это порядковый номер выполнения. То есть первым будет ValidatePipeLine, а вторым сработает SavePipeline. Обычно цифры указываются от 0 до 1000. И в случае с пайплайнами чем ниже цифра, тем раньше сработает пайплайн.</p><p>В случае с middleware картина такая же, но логика немного иная.</p><p>Каждый middleware может обрабатывать как request, так и response. При этом middleware стоит посередине между ядром, который отправляет запросы, и загрузчиком. Если ваша middleware обрабатывает запросы, то сработает первой та, что указана с меньшей цифрой, потому что она ближе к ядру. А если middleware обрабатывает ответы, то первой будет та, у которой цифра больше, потому что она дальше от ядра и ближе к загрузчику.</p><figure><img src="https://media.tproger.ru/user-uploads/108715/2025-04-06/db359adf-e3fd-40c8-81e5-5c0d9658bd0a.png" alt="" /></figure><p>Об этот нюанс часто спотыкаются новички, хотя, скорее всего, он прописан в документации.</p><h2>Пример, как использовать Scrapy</h2><p>Рассмотрим, как с помощью одного селектора собрать сайт любой вложенности и архитектуры.</p><p>Для начала создаём класс паука, наследуемся от scrapy.Spider, указываем name, start_urls и атрибут allowed_domains — он необязательный, но в данном случае без него не обойтись. В нём мы укажем список хостов, на которые разрешаем ходить нашему пауку, чтобы он не начал собирать другие сайты.</p><p>Дальше переопределяем метод parse и, когда к нам приходит ответ от сайта, находим все ссылки. И это и есть тот единственный xpath селектор, который поможет обойти весь сайт и собрать страницы.</p><p>Все ссылки помещаем в переменную url в качестве списка, а потом этот список передаём в функцию follow_all объекта response.</p><p>Чтобы дописать сохранение, просто передаём объект response вглубь ядра Scrapy, где напишем какой-то нехитрый пайплайн и будем сохранять html-страницы. Так можно собрать абсолютно любой сайт, просто подставьте ссылку на него в start_urls.</p><p>Важный нюанс: под капотом follow_all сделает запросы к сайту по всем ссылкам, которые мы нашли на странице. И поскольку в follow all мы не указываем определённый метод в параметре callback, то все ответы придут сюда же в метод parse (потому что он дефолтный в Scrapy). Эта логика будет повторяться на каждой странице.</p><p>Ещё в Scrapy есть внутренний фильтр, поэтому если паук соберёт дубликаты, то автоматически зафильтрует их и не будет проходить по ссылкам дважды.</p><h2>Немного итогов</h2><p>Scrapy — это большой, сложный, но очень хороший фреймворк, как Django в веб-разработке. Он предлагает большой выбор готовых инструментов для сбора и обработки данных, а также, поддерживает асинхронное выполнение задач, что ускоряет процесс парсинга.</p><p>Scrapy может показаться трудным для новичков, но у него есть богатая документация и примеры, поэтому при желании в нём нетрудно разобраться.</p>]]></content:encoded>
    </item>
    <item>
      <title>ИИ-помощники для программистов создали новый тип багов. Что это за баги?</title>
      <link>https://tproger.ru/news/ii-pomoshhniki-dlya-programmistov-sozdali-novyj-tip-bagov--chto-eto-za-bagi-</link>
      <comments>https://tproger.ru/news/ii-pomoshhniki-dlya-programmistov-sozdali-novyj-tip-bagov--chto-eto-za-bagi-?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/ii-pomoshhniki-dlya-programmistov-sozdali-novyj-tip-bagov--chto-eto-za-bagi-</guid>
      <description><![CDATA[<p>ИИ-помощники, такие как GitHub Copilot, создают новый тип багов: скрытые ошибки в импортах и коде из-за неверных предположений и автоматизации</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/ii-pomoshhniki-dlya-programmistov-sozdali-novyj-tip-bagov--chto-eto-za-bagi-">ИИ-помощники для программистов создали новый тип багов. Что это за баги?</a>»</p>]]></description>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 14 Jan 2025 09:51:56 GMT</pubDate>
      <content:encoded><![CDATA[<p>В последние годы ИИ-помощники, такие как GitHub Copilot, стали популярными инструментами для ускорения разработки кода.</p><p>Однако, как показывает опыт разработчика Klaas van Schelven, использование таких инструментов может привести к появлению новых, труднообнаружимых ошибок в коде.</p><h2>Случай с GitHub Copilot</h2><p>В своём блоге разработчик <a href="https://www.bugsink.com/blog/copilot-induced-crash/">описывает</a>, как при работе над проектом с использованием Django он столкнулся с неожиданными сбоями в тестах.</p><p>После продолжительного поиска причины выяснилось, что Copilot автоматически сгенерировал следующую строку импорта:</p><p>На первый взгляд, этот импорт может показаться безобидным. Однако в Django классы TestCase и TransactionTestCase имеют разные поведения в отношении управления транзакциями:</p><ul><li><b>TestCase:</b> оборачивает каждый тест в транзакцию и откатывает её после завершения, обеспечивая изоляцию тестов.</li><li><b>TransactionTestCase: </b>не управляет транзакциями автоматически, что полезно для тестов, зависящих от явного управления транзакциями.</li></ul><p>Таким образом, импорт TestCase под именем TransactionTestCase привёл к тому, что тесты выполнялись с неверной семантикой транзакций, вызывая неожиданные сбои.</p><h2>Почему такие ошибки трудно обнаружить?</h2><p>Такие ошибки сложно выявить по нескольким причинам:</p><ol><li><b>Автоматизация:</b> Разработчики могут не замечать автоматически сгенерированные строки кода, особенно при быстром темпе работы.</li><li><b>Переименование:</b> Использование ключевого слова as для переименования может скрыть истинную природу импортируемого объекта, вводя в заблуждение при чтении кода.</li><li><b>Доверие к ИИ:</b> Разработчики могут чрезмерно полагаться на ИИ-помощников, не перепроверяя сгенерированный код, что увеличивает риск внедрения подобных ошибок.</li></ol><h2>Рекомендации для предотвращения подобных ошибок</h2><p>Чтобы минимизировать риски, связанные с использованием ИИ-помощников, рекомендуется:</p><ul><li><b>Внимательно проверять сгенерированный код:</b> особенно строки импорта и переименования.</li><li><b>Понимать контекст:</b> осознавать, какие классы и функции используются, и как они взаимодействуют в проекте.</li><li><b>Ограничивать автоматизацию:</b> использовать ИИ-помощников как вспомогательный инструмент, а не как основной источник кода.</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Как настроить аутентификацию в веб-приложениях на Django</title>
      <link>https://tproger.ru/articles/kak-nastroit-autentifikaciyu-v-veb-prilozheniyah-na-django</link>
      <comments>https://tproger.ru/articles/kak-nastroit-autentifikaciyu-v-veb-prilozheniyah-na-django?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Вадим Егорцев]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-nastroit-autentifikaciyu-v-veb-prilozheniyah-na-django</guid>
      <description><![CDATA[<p>Аутентификация в веб-приложениях на Django. Показываем основные варианты настройки. Рассматриваем пошаговую инструкцию ✔ Tproger</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-nastroit-autentifikaciyu-v-veb-prilozheniyah-na-django">Как настроить аутентификацию в веб-приложениях на Django</a>»</p>]]></description>
      <category><![CDATA[Безопасный код]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 11 Dec 2024 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Во время аутентификации происходит проверка пользователя: учетные данные сопоставляются с теми, что хранятся в системе. Если указана неверная комбинация логина и пароля, доступ к функционалу веб-приложения будет ограничен.</p><p>Такой механизм реализован и на сайте Tproger: читатели не могут создавать, комментировать и лайкать посты, пока не пройдут аутентификацию.</p><h2>Базовая аутентификация в Django</h2><p><a href="https://tproger.ru/tag/django">Фреймворк Django</a> выбирают для аутентификации из-за его встроенной, безопасной и гибкой системы управления пользователями. Это готовые инструменты для регистрации, авторизации и настройки прав доступа, включая защиту от основных типов атак, безопасное хранение паролей и управление сессиями. При этом в Django система аутентификации легко настраивается под нужды проекта, подробно документирована и регулярно обновляется.</p><p>Установим фреймворк командой pip:</p><p>Создадим новый проект:</p><p>Создадим новое приложение для работы с аутентификацией:</p><p>Django уже содержит встроенную систему аутентификации. Она находится в приложении django.contrib.auth, которое по умолчанию включено в INSTALLED_APPS в файле settings.py.</p><p>Добавим приложение в список INSTALLED_APPS:</p><h2>Добавление и настройка страниц для входа, регистрации и выхода</h2><p>Используем встроенные формы Django, чтобы настроить аутентификацию. Сначала создадим поля для входа и регистрации в файле forms.py приложения myapp:</p><p>Код выше создает две формы: LoginForm для входа и RegisterForm для регистрации нового пользователя.</p><p>Форма <b>LoginForm </b>содержит два поля: username и password. Поле password отображается как поле ввода пароля с помощью виджета PasswordInput.</p><p>Форма <b>RegisterForm </b>наследуется от встроенной формы UserCreationForm и добавляет дополнительное поле email. В классе Meta указываем модель User и поля, которые нужно включить в форму.</p><p>Создадим представления для обработки запросов входа, регистрации и выхода. В файле views.py приложения myapp добавим код:</p><p>Код выше создает три функции представления: <b>login_view</b>, <b>register_view </b>и <b>logout_view</b>.</p><p>Функция <b>login_view </b>обрабатывает запрос входа пользователя. Для POST-запроса создается экземпляр формы LoginForm с переданными данными. Если форма валидна, извлекаются имя, пароль и выполняется аутентификация пользователя с помощью функции authenticate(). Если пользователь успешно аутентифицирован, выполняется вход login(), и пользователь перенаправляется на главную. Для GET-запроса, создается пустая форма LoginForm, которая передается в шаблон login.html.</p><p>Функция <b>register_view </b>обрабатывает запрос регистрации.</p><ul><li>Если это POST-запрос, создается экземпляр формы RegisterForm с переданными данными.</li><li>Если форма валидна, новый пользователь сохраняется в базе данных с помощью метода save(), и перенаправляется на страницу входа.</li><li>Если это GET-запрос, создается пустая форма RegisterForm, которая передается в шаблон register.html.</li></ul><p>Функция logout_view<b> </b>обрабатывает запрос завершения сессии. Она вызывает функцию logout() для выхода пользователя, и перенаправляет его на страницу входа.</p><p>Создадим шаблоны login.html, register.html и добавим ссылку на выход в шаблоне base.html:</p><p>В шаблоне base.html добавляем условие {% if user.is_authenticated %} — оно проверит, авторизован ли пользователь. Если авторизован, отобразится приветствие и ссылка на выход. Если не авторизован, то появятся ссылки на страницы входа и регистрации.</p><p>Обновим файл urls.py приложения myapp, чтобы добавить маршруты для новых представлений:</p><p>Запустим сервер, чтобы протестировать вход и регистрацию:</p><p>Страницы размещаются по адресу http://localhost:8000/login/ и http://localhost:8000/register/ соответственно.</p><p>В Django также есть встроенные классы представлений для аутентификации, такие как LoginView и LogoutView. Чтобы использовать их, обновим файл urls.py приложения myapp:</p><p>Заменили функцию представления login_view на класс представления LoginView и указали шаблон login.html. Аналогично, заменили функцию представления logout_view на класс представления LogoutView и указали страницу, на которую будет перенаправлен пользователь после выхода (next_page='login').</p><h2>Управление доступом с помощью авторизации</h2><p>Один из распространенных способов ограничения доступа — использование декоратора <b>@login_required</b>. Его можно применять к функциям представления, чтобы разрешить доступ только авторизованным пользователям.</p><p>Для использования декоратора @login_required обновим файл settings.py и укажем URL-адрес для перенаправления неавторизованных пользователей:</p><p>Теперь в файле views.py приложения myapp добавим следующий код:</p><p>Код создает функцию представления home_view, которая отображает главную страницу сайта. Применяем декоратор @login_required к этой функции, чтобы разрешить доступ только авторизованным пользователям.</p><p>Создадим шаблон home.html в директории templates приложения myapp:</p><p>Добавим путь для главной страницы в файле urls.py приложения myapp:</p><p>Если неавторизованный пользователь попытается получить доступ к главной странице, он будет перенаправлен на страницу входа.</p><p>В Django есть система разрешений (permissions) для расширенного управления доступом. С их помощью можно определять, какие действия могут выполнять пользователи или группы пользователей.</p><p>Создадим группу и назначим ей разрешения. В файле admin.py приложения myapp добавим следующий код:</p><p>Создадим функцию представления, которая будет доступна только пользователям с определенным разрешением. В файле views.py приложения myapp добавим код:</p><p>Создаем функцию представления special_page_view, которая отображает специальную страницу. Применяем декоратор @permission_required к этой функции и указываем необходимое разрешение myapp.view_special_page. Только пользователи или группы с этим разрешением смогут получить доступ к данной странице.</p><p>Создадим шаблон special_page.html в директории templates приложения myapp:</p><p>Добавим маршрут для специальной страницы в файле urls.py приложения myapp:</p><p>Теперь только пользователи или группы с разрешением myapp.view_special_page смогут получить доступ к специальной странице.</p><h2>Расширение модели пользователя</h2><p>Можно создать собственную модель пользователя, наследуя от AbstractUser или AbstractBaseUser.</p><p>Давайте ассмотрим создание кастомной модели пользователя с помощью AbstractUser. В файле models.py приложения myapp добавим код:</p><p>Создаем класс CustomUser, который наследуется от AbstractUser. Добавляем дополнительные поля phone_number и address к модели пользователя.</p><p>Обновим файл settings.py и укажем кастомную модель:</p><p>С этого момента система аутентификации будет использовать кастомную модель пользователя вместо встроенной модели User.</p><p>Создадим миграции и применим их для обновления базы данных:</p><p>Для работы с кастомной моделью нужно обновить формы. В файле forms.py приложения myapp изменим поля регистрации:</p><p>Создаем класс CustomUserCreationForm, который наследуется от UserCreationForm. Добавляем поля phone_number и address к форме и указываем кастомную модель CustomUser в классе Meta.</p><p>Чтобы система аутентификации приняла изменения, обновим функцию представления register_view в файле views.py:</p><p>Меняем форму UserCreationForm на кастомную форму CustomUserCreationForm. Теперь Django работает, используя собственную модель пользователя с дополнительными полями во всем проекте.</p><h2>Социальная аутентификация</h2><p>Для реализации входа через сторонние сервисы есть библиотека django-allauth. Она предоставляет готовые решения для интеграции с провайдерами социальной аутентификации.</p><p>Установим библиотеку django-allauth:</p><p>Добавим django-allauth в список установленных приложений в файле settings.py:</p><p>Добавляем приложения django.contrib.sites, allauth и провайдеры социальной аутентификации, которые хотим использовать. В нашем случае это интеграция Google.</p><p>Также устанавливаем значение SITE_ID = 1, чтобы указать идентификатор сайта.</p><p>Добавим URL-адреса для django-allauth в файле urls.py проекта:</p><p>Включаем URL-адреса django-allauth с префиксом accounts/.</p><p>Выполним миграции для создания таблиц в базе данных:</p><p>После этого можно настраивать провайдеров социальной аутентификации через административный интерфейс Django.</p><p>Добавим кнопки для социальной аутентификации на страницу входа. В шаблоне login.html добавим следующий код:</p><p>Добавляем ссылки на страницы регистрации через социальные аккаунты, используя URL-адреса socialaccount_signup с указанием провайдера. Теперь пользователи могут войти на сайт, используя свою учетную запись Google.</p><h2>Безопасность аутентификации</h2><p>Рекомендации по повышению безопасности аутентификации:</p><ul><li>Настройте SSL/TLS-сертификат для сайта для безопасного соединения между клиентом и сервером. Используйте протокол HTTPS для всех страниц, где есть аутентификации и передача конфиденциальных данных.</li><li>Система на Django работает со встроенной защитой от межсайтовой подделки запросов (CSRF). Убедитесь, что в шаблонах форм используется тег {% csrf_token %}.</li><li>Экранируйте пользовательский ввод перед его выводом на страницах сайта, чтобы защититься от межсайтового скриптинга (XSS). Django автоматически экранирует переменные в шаблонах, но будьте осторожны при явном выводе HTML.</li><li>Для защиты от атак методом перебора (брутфорса) ограничьте количество неудачных попыток входа для каждого пользователя или IP-адреса. Используйте библиотеки django-axes или django-ratelimit, чтобы реализовать ограничения числа попыток входа.</li><li>Никогда не храните пароли в открытом виде — вместо этого используйте хеш-функции. В Django есть встроенные функции для хеширования паролей: django.contrib.auth.hashers.make_password() и django.contrib.auth.hashers.check_password().</li><li>Возможно, стоит реализовать двухфакторную аутентификацию, чтобы повысить безопасность учетных записей. Используйте библиотеки django-two-factor-auth или django-otp для добавления 2FA.</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Баттл: кто победит — Django или Flask</title>
      <link>https://tproger.ru/articles/batl--django-vs--flask</link>
      <comments>https://tproger.ru/articles/batl--django-vs--flask?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Света Соколовская]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/batl--django-vs--flask</guid>
      <description><![CDATA[<p>Фреймворки на Python. Сравниваем Django и Flask по ключевым критериям: возможности, скорость разработки и поддержка асинхронных операций. </p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/batl--django-vs--flask">Баттл: кто победит — Django или Flask</a>»</p>]]></description>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Баттл технологий]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 05 Dec 2024 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>В мире веб-разработки на Python два фреймворка интереснее всего: Django и Flask. Сейчас в интернете на Джанго <a href="https://medium.com/@sshui/django-vs-flask-who-has-more-users-721555f2fe0f">написаны</a> более 107 тысяч приложений, а на Фласке — чуть больше 4 тысяч. В любом случае оба инструмента популярны и широко используются, но у каждого из них свои уникальные возможности и подходы к разработке.</p><p>В статье сравним две технологии по нескольким ключевым критериям, чтобы помочь веб-разработчикам выбрать наиболее подходящий инструмент для своих задач.</p><h2>Возможности</h2><p><b>Django — это «‎все включено» фреймворк</b>, который предлагает множество встроенных функций: система аутентификации, админ-панель, управление базами данных и многое другое. Это делает его идеальным выбором для создания сложных приложений с минимальными усилиями на настройку. Он также следует принципу «‎не повторяйся» (DRY), что упрощает повторное использование кода.</p><p>Основные возможности Django:</p><ul><li>Полноценный ORM позволяет работать с базами данных без необходимости писать SQL-код.</li><li>Автоматически генерируемый веб-интерфейс для управления моделями данных.</li><li>Система маршрутизации упрощает настройку URL и маршрутов.</li><li>Есть встроенные механизмы защиты от общих веб-угроз: CSRF, SQL-инъекции и т.д.</li><li>Масштабируемый, подходит для больших проектов и команд.</li></ul><p><b>С другой стороны, Flask — это микро-фреймворк</b>, который предоставляет разработчикам больше свободы в выборе компонентов. Он легкий и гибкий: можно легко интегрировать сторонние библиотеки для решения конкретных задач.</p><p>Его особенности:</p><ul><li>Основной функционал минимален, скорее предоставляет базу для расширений.</li><li>Можно легко интегрировать сторонние библиотеки для специфических нужд.</li><li>Использует Jinja2 для создания гибких и мощных интерфейсов.</li><li>Удобные инструменты для создания API-сервисов.</li><li>Возможность тонкой настройки конфигураций приложения.</li></ul><p>Например, как можно интегрировать во Flask сторонние библиотеки для решения конкретных задач:</p><p>В коде используем библиотеку requests для выполнения HTTP-запросов к внешнему API. Flask позволяет легко добавлять функции, как, например, эндпоинт для вычисления без необходимости сложных настроек и конфигураций. Разработчик может выбрать любые библиотеки и инструменты в зависимости от потребностей проекта.</p><p>Выбор между Flask и Django во многом зависит от требований проекта: если вам необходимо быстрое создание сложного приложения, Django может быть удобнее. Если же вам нужно создать что-то более простое или экспериментальное, Flask станет отличным выбором.</p><h2>Скорость разработки</h2><p>Скорость разработки — это один из ключевых факторов, который берется во внимание при выборе между Django и Flask. Оба фреймворка имеют свои нюансы, которые могут повлиять на скорость создания проекта и его дальнейшую поддержку.</p><h4>Django</h4><p>Несмотря на то что Django может казаться более сложным из-за большого количества функционала, его общая структура и удобные утилиты позволяют быстро ввести проект в эксплуатацию. Разработчики могут использовать системные команды для генерации приложений и моделей, что экономит время.</p><p>Благодаря встроенной системе миграций изменения в моделях можно легко переносить в базу данных. Django упрощает создание и рендеринг многоразовых шаблонов, обычно это используют в проектах с повторяющимися элементами интерфейса: сайты с контентом или интернет-магазины.</p><p>Хотя у Django есть много функций, хорошая документация и большое количество пакетов позволяют разработчикам быстро найти и реализовать нужное решение.</p><h4>Flask</h4><p>Начальная настройка Flask проще, и сама структура проекта предоставляет разработчику возможность быстро внедрять минимальные функции. Это способствует ускоренному первичному этапу разработки, особенно если проект небольшой или временный. На Flask можно разработать легкое приложение, добавляя библиотеки по мере необходимости. Это сокращает время на внедрение неиспользуемых функций и делает проект компактным.</p><p>Также Flask ориентирован на тестирование, и его простая конфигурация дает возможность быстро запускать и проверять отдельные компоненты приложения. Это полезно для опытных разработчиков, которые часто работают с TDD (разработка через тестирование).</p><p>А одно из главных преимуществ Flask — он хорошо подходит для создания MVP. Временные ограничения или необходимость быстро проверить концепцию делают Flask идеальным выбором.</p><h2>Поддержка асинхронных операций</h2><p>С поддержкой асинхронного программирования ситуация выглядит иначе.</p><h4>Django</h4><p>Django постепенно внедряет асинхронные возможности с выходом версии 3.1, что позволяет разработчикам писать асинхронные представления. Однако этот функционал еще не полностью реализован во всем фреймворке, и не все компоненты могут работать асинхронно.</p><p>Вот пример кода, который показывает создание асинхронного представления в Django. Здесь пишем асинхронное представление AsyncExampleView, которое использует async и await для выполнения асинхронных операций.</p><h4>Flask</h4><p>Flask изначально не задумывался как асинхронный фреймворк, но с помощью расширения Flask-SocketIO можно реализовать асинхронное поведение. Также существуют фреймворки FastAPI и Sanic, которые лучше подходят для высоконагруженных асинхронных приложений. Следовательно, если асинхронные операции являются приоритетом, Flask с дополнительными библиотеками может стать правильным выбором, хотя более специализированные решения будут более уместными.</p><p>А вот пример кода — использование Flask с расширением Flask-SocketIO для реализации асинхронного поведения. Функция handle_message является асинхронной и использует await для задержки:</p><h2>Что выбрать?</h2><p>Как и всегда, выбор между Django и Flask зависит от конкретных потребностей вашего проекта. Если вы ищете мощный, готовый к использованию фреймворк для создания больших приложений, которые быстро развиваются, Django станет топовым выбором. Если же вам нужна легкость, гибкость и возможность поэтапной сборки приложения — смело выбирайте Flask.</p><p>Оба фреймворка имеют свои сильные и слабые стороны. Главное — определить, какие приоритеты имеют значение для вашего проекта.</p>]]></content:encoded>
    </item>
    <item>
      <title>Django vs FastAPI в 2025 году: какой фреймворк выбрать?</title>
      <link>https://tproger.ru/articles/django-vs-fastapi-v-2025-godu--kakoj-frejmvork-vybrat-</link>
      <comments>https://tproger.ru/articles/django-vs-fastapi-v-2025-godu--kakoj-frejmvork-vybrat-?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Александр Киселев]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/django-vs-fastapi-v-2025-godu--kakoj-frejmvork-vybrat-</guid>
      <description><![CDATA[<p>Django и FastAPI — одни из самых популярных фреймворков Python. Разбираемся, какой фреймворк выбрать начинающим разработчикам в 2025 году. </p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/django-vs-fastapi-v-2025-godu--kakoj-frejmvork-vybrat-">Django vs FastAPI в 2025 году: какой фреймворк выбрать?</a>»</p>]]></description>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Фреймворки и библиотеки]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 20 Nov 2024 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>В этой статье мы подробно разберем все основные критерии при выборе между фреймворками Django и FastAPI для начинающих свой путь разработчиков — востребованность фреймворка на рынке труда, тренды, которые повлияют на их востребованность в будущем, а так же важные особенности, которые нужно учитывать при выборе.</p><h2>Популярность и востребованность</h2><h3>Вакансии на рынке труда</h3><p>Начнем с самого важного. Количество вакансий с упоминанием фреймворка напрямую отражает, насколько просто будет найти/сменить работу в том или ином стеке. <br /></p><p>Стоит иметь ввиду, что на многие позиции рассматривают разработчиков с опытом или Django, или FastApi (выглядят, как «опыт работы с Django/FastAPI»), так что точно понять, сколько проектов на одном фреймворке, а сколько на другом, затруднительно.</p><p>На российском рынке труда FastAPI на конец 2024 года в итоге смог обогнать Django по количеству вакансий. Вот цифры с HeadHunter:</p><figure><img src="https://media.tproger.ru/user-uploads/109103/2024-11-18/dad48141-91c3-4653-bb66-3e1c336b12c6.png" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/109103/2024-11-18/e0c7e736-e4f5-4fd7-8b66-1113b5f12c75.png" alt="" /></figure><p>Ровно год назад Django опережал FastAPI в два раза. Сейчас отрыв небольшой, но есть все основания полагать, что он будет увеличиваться.</p><p>Для разработчиков уровня junior ситуация в целом одинаковая:</p><figure><img src="https://media.tproger.ru/user-uploads/109103/2024-11-18/f3b1dcb4-c47e-493f-b921-ce33b4a3f45e.png" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/109103/2024-11-18/e7250c0e-1874-4e34-959d-206a035f4628.png" alt="" /></figure><p>Кратко об используемых фильтрах:</p><ul><li>Уровень дохода: любой</li><li>Регион: Россия<br /></li><li>Опыт: не имеет значения<br /></li><li>Ключевые слова: в названии вакансии, в названии компании, в описании вакансии.<br /></li></ul><h3>GitHub-звёзды</h3><p>Косвенный критерий «популярности» фреймворка в мире.<br /></p><ul><li>Django: <b>80,998</b> звёзд.<br /></li><li>FastAPI: <b>77,700</b> звёзд.</li></ul><p>Учитывая немалый возраст Django, он практически наравне с FastAPI. <br />За год Django прибавил 15% (было 70 тысяч звёзд), а FastAPI — около 25% (было 60 тысяч звёзд). Так что можем сделать вывод, что FastAPI выходит вперед не только на нашем рынке.<br /></p><h2>Особенности фреймворков</h2><h4>Django: держи всё сразу, даже если не нужно</h4><p>Django предлагает готовую архитектуру и тонну встроенных инструментов, которые помогают разработчикам быстро освоить основные концепции и паттерны разработки.</p><p>Работа с миграциями в Django вместе с DjangoORM помогает научиться работать с базами данных без лишних страданий. Так же в мире Django преобладает синхронный код, так как асинхронность доступна с ограничениями. Автоматическая документация, которую так часто ставят в плюс FastAPI, подключается за 15 минут с помощью drf-spectacular.</p><p>На Django часто пишут продукты для использования внутри компании, а так же b2b.  Шанс встретить здесь реально большие нагрузки и сложную архитектуру крайне не велик.<br /></p><h4>FastAPI: гибко, но пустовато</h4><p>FastAPI менее регламентирован, что позволяет разработчикам выбирать подходящую архитектуру самостоятельно. Стартуем с одним файлом, так что есть манёвр и для творчества, и для костылей:) Лучше найти готовые шаблоны проекта на GitHub.<br /></p><p>Большинство проектов на FastAPI асинхронные. С одной стороны, это отличный навык в копилку любому разработчику. С другой стороны, на мой субъективный взгляд, новичкам сложнее вникать в такие проекты.<br /></p><p>Многие проекты на FastAPI используют микросервисы. Также с таким стеком чаще всего встречаются хайлоад-проекты. <br /></p><h2>Что будет дальше?</h2><p>FastAPI набирает популярность, и это уже не остановить. Основные причины:</p><ol><li>Выше производительность, чем у Django. Здесь дает преимущество асинхронность. Разница может быть в 5 раз и более.<br /></li><li>Лёгкий и минималистичный. Лучше вписывается в концепцию микросервисов. Django в микросервисы никто не тащит (я надеюсь).<br /></li><li>Быстрее развивается. В FastAPI всего около 20к строк кода. Тем временем разработчикам Django приходится тащить за собой 300к строк кода.<br /></li></ol><p>Всё это приводит к тому, что Django постепенно теряет позиции. Тренд продолжится и дальше, а его итоги подведём ближе к декабрю 2025 года.<br /></p><h2>Заключение</h2><p>Еще год назад я бы без раздумий всем начинающим порекомендовал Django. Но сейчас выбор становится очень сложным. С одной стороны, Django намного лучше подходит начинающим, с другой стороны, количество вакансий продолжит снижаться. Через год отрыв может быть 3 к 1 в пользу FastAPI. <br /></p><p>Также в выборе важно учитывать и свои предпочтения, так как легче всего развиваться в проектах, которые вам нравятся.</p><p>Чтобы оставаться на связи, приглашаю в свой <a href="https://t.me/kisel_it">telegram-канал</a>. Пишу про разработку интересно и без воды :)</p>]]></content:encoded>
    </item>
    <item>
      <title>Вышла Visual Studio Code 1.93: поддержка профилей, улучшенная работа с Python и прочие нововведения</title>
      <link>https://tproger.ru/news/vywla-visual-studio-code-1-93--podderzhka-profilej--uluchwennaya-rabota-s-python-i-prochie-novovvedeniya</link>
      <comments>https://tproger.ru/news/vywla-visual-studio-code-1-93--podderzhka-profilej--uluchwennaya-rabota-s-python-i-prochie-novovvedeniya?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/vywla-visual-studio-code-1-93--podderzhka-profilej--uluchwennaya-rabota-s-python-i-prochie-novovvedeniya</guid>
      <description><![CDATA[<p>Visual Studio Code версии 1.93 представила множество нововведений, включая редактор профилей для переключения между различными наборами настроек, что особенно полезно для разработчиков с разными рабочими процессами. Также улучшена поддержка Python, добавлена возможность работы с тестами Django, и улучшена отладка</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/vywla-visual-studio-code-1-93--podderzhka-profilej--uluchwennaya-rabota-s-python-i-prochie-novovvedeniya">Вышла Visual Studio Code 1.93: поддержка профилей, улучшенная работа с Python и прочие нововведения</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 06 Sep 2024 05:30:46 GMT</pubDate>
      <content:encoded><![CDATA[<p>Накануне состоялся релиз редактора Visual Studio Code версии 1.93. Главным нововведением апдейта стал редактор профилей — он теперь позволяет легко переключаться между различными наборами настроек.</p><p>Эта функция будет полезна разработчикам, работающим над разными проектами или использующим разные среды разработки. Вы сможете настроить свои профили для различных рабочих процессов, сохраняя уникальные расширения, темы и конфигурации для каждого из них.</p><figure><img src="https://media.tproger.ru/user-uploads/98945/2024-09-06/a7868a85-8bb0-4dda-8496-a32e64b7fb4d.jpg" alt="" /></figure><h2>Поддержка тестов Django и расширение для Python</h2><p>Visual Studio Code продолжает расширять возможности для Python-разработчиков. В версии 1.93 появилась полноценная поддержка модульных тестов Django, что значительно упрощает процесс тестирования для тех, кто работает с этим фреймворком.</p><p>Теперь можно легко находить и запускать тесты прямо из редактора, а также просматривать результаты и ошибки без необходимости переключаться на другие инструменты.</p><p>Кроме того, расширение для Python получило новые возможности для отладки и улучшены предложения автозаполнения кода, что сделает разработку более эффективной.</p><figure><img src="https://media.tproger.ru/user-uploads/98945/2024-09-06/50a9f00a-3b21-4081-b258-61956d03f50b.jpg" alt="" /></figure><h2>Улучшение IntelliSense в браузере</h2><p>Одна из самых ожидаемых функций — улучшение поддержки IntelliSense на платформе vscode.dev.</p><p>У JavaScript- и TypeScript-разработчиков появилась возможность использовать автодополнение и подсказки прямо в браузере. Это особенно полезно для тех, кто работает на устройствах с ограниченными возможностями, не позволяющими установить полноценную IDE.</p><figure><img src="https://media.tproger.ru/user-uploads/98945/2024-09-06/01aba7ad-4636-43e9-a075-cc06417aceca.jpg" alt="" /></figure><h2>Работа с контейнерами и Dev Containers</h2><p>В свежем апдейте значительно улучшены функции работы с контейнерами. А значит и процесс разработки в изолированных средах стал проще.</p><p>Поддержка Dev Containers позволяет легко настраивать окружения для разработчиков, что упрощает совместную работу в команде и помогает избежать проблем с настройкой окружения на разных машинах.</p><h2>Прочие нововведения</h2><p>Не обошлось и без общей оптимизации. Улучшена производительность, устранены баги, а интерфейс стал ещё более отзывчивым.</p><p>Также в обновлении были исправлены проблемы с зависаниями и улучшена работа с расширениями. Появилась поддержка новых функций для работы с крупными проектами, что сделало Visual Studio Code ещё более мощным инструментом для профессиональных разработчиков.</p><p>Ознакомиться подробнее с обновлением и скачать новую версию можно по <a href="https://code.visualstudio.com/updates/v1_93">ссылке</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Болевые точки Django в современной разработке</title>
      <link>https://tproger.ru/articles/bolevye-tochki-django-v-sovremennoj-razrabotke</link>
      <comments>https://tproger.ru/articles/bolevye-tochki-django-v-sovremennoj-razrabotke?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Николай Долганов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/bolevye-tochki-django-v-sovremennoj-razrabotke</guid>
      <description><![CDATA[<p>Сегодня хочу поговорить про Django. Django — замечательный фреймворк. А еще крайне популярный, его часто осваивают новички и используют в своих проектах. На самом деле у Django есть и несколько минусов, а точнее нюансов, на которые важно обращать внимание и о которых важно знать, приступая к разработке.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/bolevye-tochki-django-v-sovremennoj-razrabotke">Болевые точки Django в современной разработке</a>»</p>]]></description>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 11 Jul 2024 13:05:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Привет! Меня зовут Николай Долганов, я старший разработчик Python в Группе НЛМК.</p><figure><img src="https://media.tproger.ru/user-uploads/102670/2024-07-03/2b872e8c-cc47-4818-85af-9dd772928c2d.jpg" alt="" /></figure><p>Сегодня хочу поговорить про Django. Django — замечательный фреймворк. А еще крайне популярный, его часто осваивают новички и используют в своих проектах. На самом деле у Django есть и несколько минусов, а точнее нюансов, на которые важно обращать внимание и о которых важно знать, приступая к разработке.</p><h2>Django как инструмент для быстрого старта</h2><p>Только <a href="https://habr.com/ru/companies/habr_career/articles/746038/">по данным ресурса Хабр Карьера на июнь 2023 года</a>, Django входил в топ-8 по вакансиям. Популярность фреймворка легко объяснима.</p><p>1.    Низкий порог вхождения. Можно сказать, порожек, маленькая неровность на пути начинающего программиста.</p><p>2.    Огромный объем материалов от сообщества и разработчиков. Например, <a href="https://docs.djangoproject.com/en/4.2/">отличная официальная документация на английском</a>. Или <a href="https://django.fun/docs/django/4.2/">на русском</a>.</p><p>3.    Фреймворк — это коробка с батарейками, которая решает большинство функциональных задач.</p><p>4.    Множество готовых решений, которые можно интегрировать с вашим проектом.</p><p>Именно это позволяет быстро создать рабочее решение на Django. Особенно если предыдущее решение стало недоступным из-за санкций.</p><p>Однако почти каждый аргумент в пользу Django, исключая разве что документацию и материалы сообщества, имеет контраргумент.</p><p>1.    В большинстве случаев квалификации программиста на Django недостаточно для того, чтобы в срок и качественно решить задачи бизнеса.</p><p>2.    Батарейки Django зачастую работают не так, как нужно, проигрывая наивным самописным решениям.</p><p>3.    Готовые расширения Django либо слишком велики для решения локальных задач, либо создают проблемы в зависимостях. Кроме того, они могут создавать риск для безопасности инфраструктуры.</p><h2>Проблемы Django Admin</h2><p>Один из проектов в нашей компании создан с помощью Django.</p><p>В процессе работы мы столкнулись с некоторыми болевыми точками фреймворка, о которых стоит рассказать.</p><p>Django представляет собой готовое решение, но не все его компоненты подходят для Production. Например, Django Admin позволяет сэкономить время на написании собственной контрольной панели. В теории. На практике вы столкнетесь с тем, что схема данных в БД отличается от представления формы для редактирования данных.</p><p>Например, в БД есть поля типа <a href="https://www.postgresqltutorial.com/postgresql-tutorial/postgresql-interval/">Interval</a> и Boolean. Запись может иметь срок действия (после наступления которого запускается какая-то проверка), может быть бессрочной (поле Boolean) либо не имеет ни срока, ни признака бессрочного действия (проверка запускается вручную). Первая проблема, с которой вы столкнетесь при реализации, — это отсутствие в Django ORM поля модели, которое полностью эксплуатировало бы тип данных Interval. Вторая проблема состоит в необходимости написания формы для «админки», чтобы пользователь заполнял одно поле, а не два одновременно. Разумеется, подобные проблемы в энтерпрайзе давно решаются отказом от Django Admin в пользу DRF + SPA.</p><p>Еще одна существенная проблема Django Admin — это отсутствие оптимизации запросов по умолчанию. Впрочем, учитывая особенности архитектуры компонента (с шаблонизатором), оптимизировать запросы простыми способами не получится. Так что решение так или иначе будет тормозить, если у вас много связей и данных.</p><p>Так мы постепенно приблизились к главной «батарейке» Django и к ее главной болевой точке — ORM.</p><h2>Анализ запросов к БД, созданных Django ORM</h2><p>Прежде чем понять, как нам могут угрожать запросы к БД, предлагаю научиться анализировать их, используя ORM Django.</p><p>Рассмотрим пример, который никогда не существовал в реальности. Файл <b>models.</b><b>py</b>, которого никогда не было:</p><p>Давайте составим запрос на получение всех заводов группы Glam Metal:</p><p>Запуск этого кода внутри консоли современной IDE позволяет произвести анализ переменных (дебаг):</p><figure><img src="https://media.tproger.ru/user-uploads/102670/2024-07-03/0be55d17-f304-4562-93c3-9266ff2fe6b3.png" alt="" /></figure><p>Посмотрите: переменная glam_metal_factories — это экземпляр класса QuerySet. Это тот самый механизм «ленивых» запросов Django ORM. Сначала мы получаем экземпляр класса QuerySet, потом, если, например, обратиться к первому элементу выборки или запустить цикл for, запрос уйдет в БД.</p><p>Но сейчас нас интересует свойство query. Это экземпляр класса Query, но его репрезентативный дандер-метод возвращает запрос, который будет выполнен в БД, если мы сделаем обращение к ней.</p><p>Если у вас нет под рукой дебагера, можно сделать так:</p><p>И мы получим вот такой результат:</p><p>Помните: важным умением для разработчика Django является анализ SQL-запросов. Давайте разберемся почему.</p><h2>Первые проблемы</h2><p>Итак, у нас есть три модели. У нас есть запрос, который получает только заводы, входящие в группу Glam Metal. Этого мало, чтобы построить приложение. Ведь приложением пользуются люди, и для них наши Frontend-разработчики подготовили приятный пользовательский интерфейс на JavaScript.</p><p>Интерфейс связывается с Backend посредством REST API. В качестве «батарейки» для REST мы используем <a href="https://www.django-rest-framework.org/">Django Rest Framework</a> (в простонародье DRF).</p><p>Давайте представим, что у нас есть некий эндпоинт, который возвращает только заводы группы Glam Metal. Только список. Нам потребуется следующий модуль serializers.py:</p><p>А также представление во views.py:</p><p>Теперь нам потребуется занести в систему некоторое количество заводов. Не будем мелочиться и заведем сразу 5000. Для этого воспользуемся библиотекой <a href="https://factoryboy.readthedocs.io/en/stable/">Factory Boy</a>:</p><p>Выполним:</p><p>И дождемся окончания операции.</p><p>Здесь мы предполагаем, что в системе есть пользователь с id=1. На самом деле под пользователя тоже лучше завести фабрику.</p><p>Итак, открыв в браузере наш API, мы увидим следующее:</p><figure><img src="https://media.tproger.ru/user-uploads/102670/2024-07-11/488f03ba-d538-47ae-84cb-d18ff1b5dc1f.png" alt="" /></figure><p>Однако пролистайте статью выше и вспомните, как выглядел наш запрос. Он выбирал все поля из таблицы с заводами. И хотя наш пример является виртуальным, в жизни бывает так, что полей у модели может быть очень много.</p><p>Так мы сталкиваемся с первой проблемой оптимизации запросов в Django ORM: <b>она по умолчанию выбирает все поля!</b></p><h2>Усложняем задачу</h2><p>Нам пришла доработка: мы должны выводить список всех контактных лиц (их телефоны), а также ФИО пользователя, которые хранятся в модели User. Также мы должны вывести имя группы заводов, чтобы в следующей доработке сделать поле group_name динамическим — будем его прокидывать в Query Params.</p><p>Модернизируем serializers.py:</p><p>Обратите внимание на метод get_full_name. Он ссылается на property fio, которое программист создал для модели User, чтобы не повторять фрагмент кода для получения ФИО в разных местах. Выглядит это свойство так:</p><p>Мы получили результат:</p><figure><img src="https://media.tproger.ru/user-uploads/102670/2024-07-11/d91495ae-3b14-4895-aa93-8a1ae008b494.png" alt="" /></figure><p>Задачу можно закрывать? На самом деле нет. Все только начинается.</p><h2>Используем Django Debug Toolbar</h2><p>Если вы спросите у опытного джангиста, как он проверяет запросы к БД, он, скорее всего, скажет о <a href="https://django-debug-toolbar.readthedocs.io/">Django Debug Toolbar</a>. И не ошибется, поскольку это достаточно мощный инструмент для определения того, что делала Django прежде, чем отдать пользователю ответ.</p><figure><img src="https://media.tproger.ru/user-uploads/102670/2024-07-11/72e59cb5-3d24-4d4b-a23e-6781ca0b8168.png" alt="" /></figure><p>Посмотрите: у нас вышло 5839 запросов. Притом что заводов группы Glam Metal всего 834:</p><figure><img src="https://media.tproger.ru/user-uploads/102670/2024-07-03/a47a859b-fea5-47a5-bfbc-1a2ac94bb44e.png" alt="" /></figure><p>Открыв детализацию SQL-запросов, мы увидим вот такую картину:</p><figure><img src="https://media.tproger.ru/user-uploads/102670/2024-07-11/83529de2-4d61-41bf-8eb2-2d31b0228cec.png" alt="" /></figure><p>Одной из ключевых особенностей Django Debug Toolbar является группировка одинаковых запросов (similar queries):</p><figure><img src="https://media.tproger.ru/user-uploads/102670/2024-07-11/3c956564-1098-4ea5-a958-582114631ab1.png" alt="" /></figure><p>Открыв детальную информацию по группе, мы можем просмотреть Traceback вызовов, которые привели к появлению этой группы:</p><figure><img src="https://media.tproger.ru/user-uploads/102670/2024-07-11/6fca85e7-4a60-4153-b96c-72f53f3d6340.png" alt="" /></figure><p>В нашем случае, если источником проблемы является to_representation модуля serializers, то мы говорим об известной <b>проблеме </b><b>n+1</b>. Дело в том, что в момент, когда мы пытаемся получить данные из связанной модели, ORM отправляет еще один запрос.</p><p>Как вы видите, при выводе списка ситуация становится критической. Но мы можем исправить это, добавив для всех связей ForeignKey/OneToOneField правило <a href="https://docs.djangoproject.com/en/4.2/ref/models/querysets/#select-related">select_related()</a>:</p><p>Посмотрите, как изменился оригинальный запрос:</p><p>Как вы можете видеть, мы выбрали поля id и name для таблицы, которую присоединили к нашей выборке посредством join. Теперь для получения данных группы заводов не будет создаваться лишних запросов.</p><p>Еще мы можем сократить число выбираемых полей, используя <a href="https://docs.djangoproject.com/en/4.2/ref/models/querysets/#django.db.models.query.QuerySet.only">.only()</a> и <a href="https://docs.djangoproject.com/en/4.2/ref/models/querysets/#django.db.models.query.QuerySet.defer">.defer()</a>:</p><p>Давайте обновим страницу с Debug Toolbar и посмотрим, как изменилась статистика:</p><figure><img src="https://media.tproger.ru/user-uploads/102670/2024-07-11/99b44bfc-1839-428d-ac0d-f5f540b4791b.png" alt="" /></figure><p>Нам удалось убрать 834 запроса. Теперь очень хочется убрать, например, обращения к User, которых чересчур много. Но, к сожалению, мы не можем этого сделать сейчас, поскольку User — это связь контактного лица, а контактные лица связаны с заводами через связь ManyToMany.</p><p>На этот случай Django ORM имеет реализацию паттерна <a href="https://docs.djangoproject.com/en/4.2/ref/models/querysets/#prefetch-related">Prefetch</a>:</p><figure><img src="https://media.tproger.ru/user-uploads/102670/2024-07-03/5742b127-6cae-4403-9d78-268e8fb7d12d.png" alt="" /></figure><p>Давайте попробуем:</p><p>Если вы посмотрите на SQL-запрос, который порождает эта инструкция, то увидите, что он не отличается от предшественника. Зато, обновив страницу, увидите это:</p><figure><img src="https://media.tproger.ru/user-uploads/102670/2024-07-11/d1f3b30b-5cd1-4c0f-af04-afad16e8582c.png" alt="" /></figure><p>Уже неплохо, но куда делись 833 запроса (что на единицу меньше 834 — общего числа наших записей?</p><figure><img src="https://media.tproger.ru/user-uploads/102670/2024-07-11/b79e7509-ce6f-4680-8945-1bfb7dbc7751.png" alt="" /></figure><p>Вот они. Django выполняет алгоритм Prefetch в точности: сначала запрашивает заводы, потом отдельным запросом «вытаскивает» всех контактных лиц. А уже объединение этих данных происходит на стороне python.</p><p>Осталась последняя проблема: необходимо избавиться от запросов к User.</p><p>Для этого мы должны научиться контролировать второй запрос, выполняемый неявно, для получения контактных лиц. К счастью, Django имеет для этого встроенный механизм — объект <a href="https://docs.djangoproject.com/en/4.2/ref/models/querysets/#prefetch-objects">Prefetch()</a>:</p><p>Посмотрим на результаты:</p><figure><img src="https://media.tproger.ru/user-uploads/102670/2024-07-11/47b72cbc-7463-4040-a8bb-eb9c1e19de85.png" alt="" /></figure><p>Два запроса, которые были выполнены за 30,44 мс. Посмотрим на запросы:</p><figure><img src="https://media.tproger.ru/user-uploads/102670/2024-07-11/e27a232f-ab6c-4be2-9608-d9201af8b930.png" alt="" /></figure><p>Итак, у нас было 5839 запросов к БД, которые исполнялись на локальной машине 9291,13 мс. Используя Django Debug Toolbar, мы выявили проблемную область и сократили число запросов до двух, а время выполнения — до 30,44 мс.</p><h2>Тонкости Django</h2><p>К сожалению, описанная выше проблема встречается в разработке на Django очень часто, поскольку джангисты недолюбливают чистый SQL и игнорируют оптимизацию запросов. Django ORM очень далека от SQL и использует абстракции, непохожие на операторы этого языка. Так, мы видим, что для ограничения полей, выбираемых в SELECT, нам приходится использовать необязательные методы .only()/.defer(). А join’ами мы вообще не можем управлять напрямую (как, кстати, и операцией group_by()).</p><p>Эти тонкости требуют от разработчика особенного внимания и достаточной квалификации, чтобы определить болевые точки проекта.</p><p>Также могу посоветовать разработчикам на Django, если они используют Pytest, обратить внимание на пакет <a href="https://pypi.org/project/pytest-django-queries/">pytest-django-queries</a>, который предоставляет фикстуру, показывающую количество и состав запросов в БД. Фикстура подключается всегда с обнуленным счетчиком, что позволяет использовать ее как на этапе создания тестовых данных, так и на этапе запуска кода.</p><h2>Послесловие: о чем мы не успели поговорить?</h2><p>К сожалению, проблемы ORM — это не единственный недостаток Django. Выше мы видели, как программист использовал property внутри модели, чтобы внедрить в нее бизнес-логику и показать ФИО пользователя. Подобные решения зачастую приводят к ситуации, когда количество запросов к БД растет не из-за отсутствия select_related/prefetch_related, а из-за того, что обращения к БД разбросаны по всему коду. В этом случае исправление архитектурных проблем может затянуться.</p><p>При всей своей простоте Django очень чувствительна к организации кода и к архитектурным ошибкам.</p><p>Еще один интересный момент — это слабая поддержка асинхронного программирования. Нет, сама Django поддерживает асинхронные операции. Проблема состоит в «батарейках» Django, которые не всегда догоняют коробку по поддержке тех или иных фич. Например, тот же DRF поддерживает async только при добавлении новых зависимостей: adrf или Django-rest-framework-async. Однако ситуация остается проблемной потому, что Serializers не поддерживают async при обращении к .data. И это вынуждает нас использовать иной подход к архитектуре решения. Например, вводить слой Use-Cases, чтобы передавать в Serializers уже подготовленные данные и выносить формирование QuerySet из слоя представлений, где ему не место.</p><p>Еще одна сложность Django — это тяжеловесная система Middleware. Многие готовые Middleware совершенно не оптимизированы, и их использование нередко влечет за собой проблемы с производительностью.</p><p>Также для Serializers Django лучше заменить движок json на ujson или orjson. Использование простого Serializer вместо ModelSerializer может поднять производительность (но, скорее всего, потребует ввода паттерна Repository для предварительного перевода данных в более простой формат).</p><p>В общем, Django — хороший фреймворк. Для средних проектов. Для маленьких он слишком большой. Для больших он слишком медленный и содержит слишком универсальные решения, которые наверняка придется переписывать.</p><p>Django хорош для начала больших разработок, когда необходимо быстро реализовать функционал, снизив расходы на сопутствующие работы (например, на реализацию админ-панели, или на авторизацию, или на пагинацию). Однако, начиная писать на нем большой проект, убедитесь сначала, что у вас достаточно квалификации и смелости, чтобы реализовать хотя бы часть функционала самостоятельно, не используя готовых решений.</p>]]></content:encoded>
    </item>
    <item>
      <title>30 самых полезных библиотек Python для веб-разработки в 2024 году</title>
      <link>https://tproger.ru/articles/30-samyh-poleznyh-bibliotek-python-dlya-veb-razrabotki-v-2024-godu</link>
      <comments>https://tproger.ru/articles/30-samyh-poleznyh-bibliotek-python-dlya-veb-razrabotki-v-2024-godu?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Лена Капаца]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/30-samyh-poleznyh-bibliotek-python-dlya-veb-razrabotki-v-2024-godu</guid>
      <description><![CDATA[<p>Полный список библиотек Python для веб-разработки: от Django и FastAPI до pandas и cryptography. Сохраните в закладки — пригодится каждому разработчику.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/30-samyh-poleznyh-bibliotek-python-dlya-veb-razrabotki-v-2024-godu">30 самых полезных библиотек Python для веб-разработки в 2024 году</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Фреймворки и библиотеки]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 10 Jul 2024 09:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<p>Если вы только подступились к верстке своего первого сайта на Python, эта статья поможет разобраться, какие библиотеки Python и инструменты — мастхэв, и чем вообще руководствоваться при выборе инструмента.</p><p>Кстати, вы можете проверить свои знания: <a href="https://tproger.ru/quiz/zachem-nuzhna-eta-biblioteka-python-v-veb-razrabotke">попробуйте угадать, для чего нужна та или иная Python-библиотека</a>.</p><p>Гайд написан владелицей Django-сайта. Если вам интересно, как пересесть с nocode-CMS вроде WordPress на самописную админку, посмотрите эту статью.</p><h2>Универсально для всех фреймворков</h2><p>Даже если не все инструменты понятны и нужны сразу, сохраните этот листинг в закладки: тогда тулы вроде gunicorn станут «на вырост».</p><ul><li><a href="https://pillow.readthedocs.io/">pillow</a>: библиотека для работы с изображениями.</li><li><a href="https://www.psycopg.org/docs/">psycopg</a>: один из лучших адаптеров PostgreSQL для Python.</li><li><a href="https://pypi.org/project/python-dateutil/1.4/">python-dateutil</a>: расширение для стандартного py-модуля datetime.</li><li><a href="https://www.npmjs.com/package/bootstrap-icons">boostrap-icons</a>: npm-пакет с иконками, прикручиваемый к HTML-темплейту.</li></ul><ul><li><a href="https://tzdata.readthedocs.io/">tzdata</a>: утилита с информацией о временных зонах.</li><li><a href="https://urllib3.readthedocs.io/">urllib3</a>: для выполнения запросов к веб-серверам.</li><li><a href="https://requests.readthedocs.io/">requests</a>: одна из самых популярных библиотек для HTTP-запросов на Python.</li><li><a href="https://pypi.org/project/sqlparse/">sqlparse</a>: форматирование и парсинг SQL-запросов.</li><li><a href="https://pypi.org/project/text-unidecode/">text-unidecode</a>: транслитерация из Unicode в ASCII.</li></ul><ul><li><a href="https://pandas.pydata.org/docs/">pandas</a>: библиотека для работы с табличными данными.</li><li><a href="https://eff-certbot.readthedocs.io/">certbot</a>: бесплатные SSL-сертификаты.</li></ul><ul><li><a href="https://plotly.com/python/">plotly</a>: дизайнерские графики с тонкой настройкой почти любого аспекта.</li></ul><ul><li><a href="https://fastapi.tiangolo.com/">FastAPI</a>: современный, быстрый веб-фреймворк для создания API.</li><li><a href="https://docs.pytest.org/en/stable/contents.html">pytest</a>: быстрее способа писать тесты для ваших функций просто нет.</li><li><a href="https://docs.gunicorn.org/">gunicorn</a>: сервер для запуска Python веб-приложений.</li></ul><ul><li><a href="https://pypi.org/project/six/">six</a>: библиотека для совместимости кода между Python 2 и 3.</li></ul><ul><li><a href="https://pypi.org/project/PyYAML/">PyYAML</a>: человекочитаемый формат конфигов.</li></ul><p>Для подобных файлов Python нужен отдельный коннектор</p><ul><li><a href="https://pypi.org/project/wheel/">wheel</a>: ускоряет установку библиотек и модулей.</li><li><a href="https://pypi.org/project/charset-normalizer/">charset-normalizer</a>: управляет кодировкой текста.</li></ul><p>Помимо прочего, обеспечивает совместимость с разными браузерами и спасает от вредоносного кода, отправляемого через формы.</p><ul><li><a href="https://pypi.org/project/idna/">idna</a>: обработка доменных имен с интернациональными символами.</li></ul><ul><li><a href="https://pypi.org/project/typing-extensions/">typing-extensions</a>: аннотация типов для разных версий Python.</li></ul><p>Инструмент позволяет, например, на Python 2, использовать аннотацию типов крайней версии языкового пакета.</p><ul><li><a href="https://pypi.org/project/cryptography/">cryptography</a>: шифрование, хэширование — защита ваших данных от третьих лиц.</li></ul><p>Прочитать зашифрованное сообщение без «ключа» у хакера не получится.</p><ul><li><a href="https://pypi.org/project/fsspec/">fsspec</a>: унифицирует обращение с файлами вне зависимости от ОС.</li><li><a href="https://pypi.org/project/MarkupSafe/">MarkupSafe</a>: безопасное отображение HTML/XML-текста.</li><li><a href="https://pypi.org/project/python-slugify/">python-slugify</a>: создание коротких дружелюбных URL.</li></ul><h2>Django-мастхэв</h2><ul><li><a href="https://pypi.org/project/django-tailwind/">django-tailwind</a>: интеграция CSS-фреймворка Tailwind с Django.</li><li><a href="https://django-tinymce.readthedocs.io/">django-tinymce</a>: интеграция WYSIWYG-редактора TinyMCE.</li></ul><ul><li><a href="https://pypi.org/project/django-mathjax/">django_mathjax</a>: пакет для встраивания MathJax.</li></ul><p>Вжух! И читатель увидит следующее:</p><ul><li><a href="https://pypi.org/project/django-orm/">django-orm</a>: переключение между SQLite и PostgreSQL.</li><li><a href="https://pypi.org/project/django-js-asset/">django-js-asset</a>: управление зависимыми от JavaScript файлами.</li></ul><h2>Заключение</h2><p>Стоит признать: подбор стека — задача не для новичков. Пока начинающий веб-разработчик только-только справляется со стандартными для сайта фичами, вроде форм обратной связи и картинками с CDN-ссылок, оперативной памяти мозга на выбор библиотек, как правило, не остается. Вы можете воспользоваться предложенными в статье общепринятыми решениями, однако функционал моего блога и вашего проекта наверняка различаются. Списка выше будет недостаточно.</p><p>В такой ситуации полезны LLM: ChatGPT и прочие ассистенты даже с меньшим числом параметров справляются с выдачей общепринятых решений «на пять». Так что начинаем с проверенного комьюнити решения по умолчанию, и только потом, когда ощутим свободу и желание экспериментировать, пробуем менять pandas на polars.</p><p>Мне не хочется обманывать новоприбывших, что переписывать под новую библиотеку весь код — нормально. Это ресурсоемко и больно. Тем более, если это ваш пет-проект, и на него приходится разыскивать время.</p><p><i>Если вас как веб-разработчика порадовал какой-то новый питонический инструмент, способный потеснить укоренившиеся решения, поделитесь в комментариях.</i></p>]]></content:encoded>
    </item>
    <item>
      <title>Как защитить Django-приложения? CSP стоит того?</title>
      <link>https://tproger.ru/articles/kak-zashhitit-django-prilozheniya--csp-stoit-togo-</link>
      <comments>https://tproger.ru/articles/kak-zashhitit-django-prilozheniya--csp-stoit-togo-?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Сергей Лалетин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-zashhitit-django-prilozheniya--csp-stoit-togo-</guid>
      <description><![CDATA[<p>Всем привет!

Учусь работать над повышением безопасности Django-приложения. Сейчас использую OAuth и библиотеки типа django-axes и django-security. Но сможет ли это защитить от CSRF и XSS атак? Не понятно… </p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-zashhitit-django-prilozheniya--csp-stoit-togo-">Как защитить Django-приложения? CSP стоит того?</a>»</p>]]></description>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Флудильня]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 11 Jun 2024 12:40:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Я читал, что внедрение <i>Content Security Policy</i> может помочь, но не уверен, стоит ли тратить время на это.</p><p>Какие методы и инструменты вы используете для улучшения безопасности? Есть ли у вас конкретные примеры, где внедрение CSP действительно оправдало себя?</p>]]></content:encoded>
    </item>
    <item>
      <title>Django или Node.js: что выбрать в 2024 году</title>
      <link>https://tproger.ru/articles/django-ili-node-js--chto-vybrat-v-2024-godu</link>
      <comments>https://tproger.ru/articles/django-ili-node-js--chto-vybrat-v-2024-godu?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Дух айтишной эмо школы]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/django-ili-node-js--chto-vybrat-v-2024-godu</guid>
      <description><![CDATA[<p>Рассмотрели преимущества, недостатки, сходства, различия, возможности карьерного роста для Django и Node.js, чтобы выяснить, какую из них лучше использовать.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/django-ili-node-js--chto-vybrat-v-2024-godu">Django или Node.js: что выбрать в 2024 году</a>»</p>]]></description>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 25 Jan 2024 11:22:38 GMT</pubDate>
      <content:encoded><![CDATA[<p>В новом видео англоязычный блогер Daniel Dan сравнил технологии Django и Node js. Также он рассмотрел преимущества, недостатки, сходства, различия, возможности карьерного роста для Django и Node.js, чтобы выяснить, какую из них лучше использовать для того или иного проекта.</p><p>Вот, о чём говорится в ролике:</p><ol><li>Спикер сравнивает Node.js и Django для разработки веб-приложений.</li><li>Node.js – это инструмент для выполнения JavaScript на сервере, позволяющий писать код для бэкенда и фронтенда на одном языке.</li><li>Django – это фреймворк для веб-разработки на Python, следующий принципам ‘не повторяй себя’ и ‘всё включено’.</li><li>Node.js обладает событийно-ориентированной архитектурой и подходит для приложений требующих реального времени, таких как чаты или игры.</li><li>Django использует систему ORM для работы с базами данных и подходит для масштабных приложений с большим количеством пользователей.</li><li>Node.js имеет преимущества в управлении асинхронными запросами и масштабируемости, но может столкнуться с трудностями при тяжелых вычислениях.</li><li>Django предлагает удобную админку и безопасность ‘из коробки’, но может быть не так хорош в мелкомасштабных проектах и не умеет обрабатывать множество запросов одновременно.</li><li>Node.js имеет большое сообщество и обширный набор готовых модулей через NPM, в то время как Django также имеет сильное сообщество, но его экосистема модулей не так велика.</li><li>Выбор между Node.js и Django зависит от конкретных требований проекта и личных предпочтений разработчика.</li><li>Карьерные перспективы для разработчиков Node.js и Django выглядят обнадеживающе, с высоким спросом и конкурентоспособной заработной платой в обоих направлениях.</li></ol><p>Ниже — транскрибированный перевод ролика на русском языке.</p><p>Сегодня нет сомнений в том, что Node.js и Django – это оба потрясающие технологии для работы с веб-приложениями. У них обоих есть мощные преимущества и отличные функции.</p><p>Но если вы хотите выбрать для изучения только одну, всегда возникает вопрос, какую выбрать. Меня зовут Даниэль, и сегодня мы сравним Node.js и Django. Мы изучим их функции, их преимущества, ограничения, а также их сходства и различия. В противном случае я сделаю все, чтобы помочь вам решить, какая из этих двух технологий лучше подойдет для вашего проекта. И если вы хотите изучить их с нуля или улучшить свои навыки, я оставлю полезные ссылки в описании, чтобы помочь вам с этим. Ладно, ребята, приступим!</p><h2>Node.js против Django</h2><p>Для чего они? Прежде чем мы углубимся в это сравнение, позвольте мне кратко рассказать о этих двух технологиях.</p><p>Прежде всего, ребята, я хотел бы сказать, что мы здесь не для того, чтобы найти проигравшего. Важно понимать, что Django и Node.js оба отлично подходят для написания сложных веб-приложений. Django – ваш выбор, если вы предпочитаете Python. Это фреймворк разработки веб-приложений, загруженный эффективными инструментами для разработки бэкенда вашего проекта. Теперь Node.js – немного другое животное.</p><p>Это не фреймворк. Это инструмент для запуска JavaScript на серверной стороне, вне браузера. С помощью Node.js вы можете писать код как для бэкенда, так и для фронтенда, используя только один язык программирования – JavaScript.</p><p>И многие разработчики находят это очень удобным и эффективным одновременно. Ладно, после этого краткого введения давайте ближе рассмотрим, что эти два инструмента предлагают. Node.js против Django.</p><h2>Основные функции</h2><p>Node.js. Ладно, ребята, вот основные функции Node.js. Во-первых, он построен на движке JavaScript V8. И для нас разработчиков это означает быструю загрузку страниц. Во-вторых, благодаря своей событийно-ориентированной архитектуре, Node.js может обрабатывать несколько событий одновременно. Это делает его идеальным для вещей, которые требуют реального времени.</p><p>Как, например, онлайн-чаты, онлайн-игры или стриминг. Независимо от того, является ли ваше приложение простым блогом или сложной системой, Node.js поддерживает вас. Node.js поставляется с огромной коллекцией бесплатных инструментов и библиотек, которые регулярно обновляются. Это означает, что вы легко можете добавлять новые функции. И, как и Django, Node.js является кроссплатформенным.</p><p>Он хорошо работает с Linux, Windows или macOS. Django. В то время как Node.js основан на JavaScript, Django полностью посвящен Python. Разработчики этого фреймворка придерживаются принципа “не повторяйся”. И это означает, что в основном нет повторяющегося кода.</p><p>Нет необходимости писать одно и то же снова и снова. Django позволяет вам повторно использовать код, экономя ваше время при создании проекта. Более того, Django также основан на принципе “включены все батарейки”.</p><p>Представьте себе, ребята, вы открываете ящик инструментов Django, и у вас есть все, что вам нужно. Это дает вам свободу сосредоточиться на том, что действительно важно. Это означает, что вам не нужно тратить столько времени и усилий на настройку вашей среды разработки или установку дополнительных библиотек и зависимостей. Вместо этого вы можете сосредоточиться на создании вашего приложения и воспользоваться множеством встроенных функций, которые предоставляет Django. И вот еще некоторые другие важные функции, которые предлагает Django. Django использует систему модель-представление-шаблон. Попробуйте представить это как разделение вашего приложения на три части. Бизнес-логика, пользовательский интерфейс и макет. Это помогает держать ваш код аккуратным, легким в управлении и масштабируемым. Django использует ORM, или систему объектно-реляционного отображения.</p><p>Это означает, что вам не нужно работать с каким-либо дополнительным SQL-кодом для операций с базой данных. Django идеально подходит для приложений с огромным количеством пользователей, будь то социальный хаб, интернет-магазин или образовательная платформа. Независимо от того, используете ли вы Windows, Mac или Linux, Django поддерживает вас.</p><p>Он хорошо работает с любой операционной системой.</p><h2>Преимущества и ограничения</h2><p>Люди, как я сказал в начале этого видео, Node.js и Django – оба отличные инструменты для работы. У них обоих есть потрясающие преимущества, поэтому веб-разработчики со всего мира любят их. С другой стороны, как и любая другая технология, существующая в мире, Node.js и Django не идеальны ни в коем случае.</p><p>У них есть свои ограничения, и некоторые из них могут стать решающими факторами для определенных проектов. Давайте посмотрим, в чем заключаются преимущества и ограничения. И начнем с Node.js. Преимущества Node.js Он основан на JavaScript, который является одним из самых популярных языков программирования. В сравнении с другими языками, его легко изучить и поддерживать, и у него достаточно большое и полезное сообщество разработчиков.</p><p>Он эффективно управляет вашими приложениями, инструментами и функциями. Он обрабатывает несколько запросов одновременно без проблем. Он легко масштабируется по мере увеличения нагрузки на проект. И он предлагает быстрое кэширование, которое ускоряет обработку, а не только недостатки. Иногда работа с асинхронными запросами может быть вызовом.</p><p>Тяжелые вычислительные задачи могут замедлить производительность. Поддержка кода становится сложной с Node.js в связи с его моделью программирования. И ограниченная поддержка библиотек также может быть вызовом для разработчиков. Ладно, теперь, ребята, давайте перейдем к Django и посмотрим, что он может предложить. Преимущества Django Установка и использование Django довольно просты. Его дружественный интерфейс плавно обрабатывает административные задачи. Django поддерживает всестороннее тестирование приложений от начала до конца. Он поддерживает различные методы аутентификации в REST-фреймворке.</p><p>У вас есть доступ к нескольким техникам кэширования через фреймворк кэширования. И Django помогает создавать динамические HTML-страницы. Недостатки Django Хотя Django масштабируем, могут возникнуть проблемы с небольшими приложениями. Django – монолитный фреймворк, что означает, что это большое, единое приложение, которое можно развернуть только целиком.</p><p>И это может быть немного рискованно, потому что если что-то пойдет не так, вся система может упасть. И, наконец, Django не может обрабатывать несколько запросов одновременно. Так что, ребята, помните об этом, прежде чем решить использовать Node.js или Django для ваших проектов. Сравнение Django и Node.js Ладно, ребята, и теперь мы наконец-то пришли к основной теме этого видео.</p><h2>Оценка ключевых параметров</h2><p>Давайте сравним Node.js и Django по ключевым параметрам. Производительность Django предлагает намного лучшую производительность для веб-приложений большого масштаба. У него есть метод создания встроенных шаблонов, что упрощает выполнение задач быстрее. Скорость Node хороша, потому что он дает разработчикам свободу, однако разработка приложения занимает больше времени.</p><p>Архитектура Django берет представление шаблона из модели MVT. Node.js работает на основе системы, основанной на событиях, и использует стек управляемых запросов ОС. Скорость разработки Django работает быстрее благодаря своей встроенной системе, но для разработчиков, не знакомых с Python, это может занять много времени. Node.js может занять больше времени для работы, но он полезен для разработчиков, знакомых с JavaScript.</p><p>Безопасность Django поставляется с надежной встроенной системой безопасности, которая защищает от уязвимостей и предлагает отличную безопасность. Node.js требует ручных исправлений безопасности, так как он не такой безопасный, как экосистема Django. У Django большая экосистема модулей, но она не так обширна, как у Node.js. У Node.js есть огромная коллекция готовых модулей через NPM.</p><p>Это означает, что разработчики могут легко найти готовые функции для добавления в свои приложения. Сообщество У Node.js и Django отличные сообщества. Однако, основываясь на некоторых исследованиях, которые я провел, могу сказать, что у Node.js все еще большее сообщество. И как вы знаете, чем больше людей, тем больше ресурсов. И это делает легче найти помощь или узнать больше о фреймворке.</p><p>Вот почему, ребята, есть над чем подумать. Что лучше, Node.js или Django? Так что теперь, когда вы знаете гораздо больше о этих двух технологиях, пришло время ответить на последний вопрос для этого видео. Что лучше выбрать, Node.js или Django?</p><p>Ребята, моя цель в этом видео – не искать проигравшего, потому что, на мой взгляд, его нет. Теперь, когда мы сравнили Django и Node.js, это очень ясно. Оба этих фреймворка отличные. Но вот мои мысли о том, когда лучше использовать один или другой. Для быстрого и масштабируемого MVP или надежных приложений с довольно высоким уровнем безопасности выбирайте Django.</p><p>Особенно если вы занимаетесь финансовой технологией. И если вы работаете с API, боретесь с высокоскоростными сервисами или занимаетесь микросервисами, Node.js – ваше решение. В конце концов, ребята, все зависит от того, что соответствует вашим личным целям и потребностям вашего проекта. Карьерные возможности Ладно, и теперь, когда мы сравнили эти два инструмента, давайте посмотрим, какие карьерные возможности есть для разработчиков Node.js и Django.</p><h2>Карьерные возможности</h2><p>Ну, мои коллеги-разработчики, я рад сообщить, что будущее обеих технологий выглядит довольно хорошо. Согласно опросу разработчиков Stack Overflow, сегодня Node.js является одной из самых популярных веб-технологий. В то же время спрос на разработчиков Django стабильно растет из года в год.  По данным Glassdoor, опытные разработчики Node.js могут зарабатывать до $143,000 в год. В то же время, разработчики на Django зарабатывают до $122,000 в год. Фрилансеры по Node.js зарабатывают от $18 до $38 в час. Фрилансеры на Django зарабатывают от $20 до $40. Так что, ребята, как вы можете видеть, внутренние вакансии оплачивают немного больше для специалистов по Node.js, чем для разработчиков на Django.</p><p>Но когда речь идет о фрилансе, разница незначительна.</p><p>Ладно, мои коллеги-разработчики, это все, что у меня есть по сравнению Node.js и Django.</p><p>https://www.youtube.com/@Daniel-Dan./videos</p>]]></content:encoded>
    </item>
    <item>
      <title>Мигрируем с no-code CMS на Django: пошаговый гайд, часть 1</title>
      <link>https://tproger.ru/articles/migriruem-s-no-code-cms-na-django-powagovyj-gajd-chast-1</link>
      <comments>https://tproger.ru/articles/migriruem-s-no-code-cms-na-django-powagovyj-gajd-chast-1?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Лена Капаца]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/migriruem-s-no-code-cms-na-django-powagovyj-gajd-chast-1</guid>
      <description><![CDATA[<p>Разложили по полочкам, как выглядит миграция данных Django, где взять готовые модели и куда деплоить проект.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/migriruem-s-no-code-cms-na-django-powagovyj-gajd-chast-1">Мигрируем с no-code CMS на Django: пошаговый гайд, часть 1</a>»</p>]]></description>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[JSON]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[CMS]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 10 Oct 2023 08:48:01 GMT</pubDate>
      <content:encoded><![CDATA[<p>Впервые познакомившись с Django в 2015 году, я была удивлена его простоте. Разработчик стартапа развернул проект, и меня пустили поглазеть на админку:</p><figure><img src="https://media.tproger.ru/user-uploads/79101/2023-10-08/b0294e65-7c41-4566-bd86-0d40e2d019cd.png" alt="" /></figure><p>На первый взгляд, она проще, чем low-code CMS вроде WordPress, но таит в себе бездну возможностей для кастомизации. Как и в случае Python, для Django написано множество плагинов, которые удовлетворят почти любой запрос.</p><p>Сейчас, спустя 8 лет, переношу свой сайт с Ghost CMS на Django. И хочу показать процесс изнутри и разобрать, какие сложности будут вас ждать после перехода.</p><p>Дабы сократить верстку фронтенда, я выбрала Django-шаблон –готовый проект на GitHub. Он поддерживается разработчиками и содержит документацию оптимального размера.</p><h2>Разворачиваем проект на локальном сервере</h2><p>Следуя инструкции, я форкаю репозиторий в выделенную на ноутбуке папку:</p><p>Затем создаю виртуальное окружение:</p><p>Устанавливаю необходимые компоненты и сам django-tailwind:</p><p>Указываю в …/blogApp/settings.py, что инструмент установлен:</p><p>Дело за малым: задаю настройки CSS и базы данных:</p><p>Запускаю сервер и смотрю на сайт в браузере:</p><figure><img src="https://media.tproger.ru/user-uploads/79101/2023-10-08/e2c76c78-43fa-4ccd-bf5c-26496e4311bf.png" alt="" /></figure><p>Репозиторий поддерживается в актуальном состоянии и болванка разворачивается без проблем. На 01.10.2023 не было ни конфликтов зависимостей, ни других ошибок.</p><h2>Верстаем посадочную и основную страницы сайта</h2><p>Поскольку текст зашит в код статически, то и заменить фразы вроде «I’m a Full Stack Developer…» на свой текст достаточно просто: в редакторе кода запускаем поиск по всем файлам. Для VSCode это Ctrl + Shift + F / Cmd + Shift + F:</p><figure><img src="https://media.tproger.ru/user-uploads/79101/2023-10-08/b550dcee-27d1-4118-b960-7364b2b5ecc9.png" alt="" /></figure><p>Не буду подробно останавливаться на всех изменениях статики, ибо это простой текст, который меняется сочетанием Ctrl + F. По окончании переверстки сайт выглядит так:</p><figure><img src="https://media.tproger.ru/user-uploads/79101/2023-10-08/12655bb4-a9f8-4bf8-ad1f-d86337e18f03.png" alt="" /></figure><p>Кстати, вместо картинки с космонавтом я использовала свою айдентику с роботом. Практика показывает: долговечнее выходит залить на бесплатный CDN вроде webfx.com или даже Dropbox. HTML-код для картинки стал выглядеть так:</p><p>Разработчикам, которые решили завести блог, не стоит концентрироваться на дизайне. Разве что сайт будет являться портфолио фронтенд-девелопера. Для остальных категорий контент-мейкеров вполне сгодятся бесплатные темы, которые распространяются на Envato, GitHub и прочих ресурсах.</p><h2>Заключение</h2><p>Теперь, когда основная часть перехода выполнена, остались «косметические» работы, которые мы разберем в следующей статье:</p><ul><li>как добавить данные в базу;</li><li>как задеплоить сайт на условно бесплатной платформе Railway;</li><li>как опубликовать проект на своем домене;</li><li>как верстать статью.</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Мигрируем с no-code CMS на Django: пошаговый гайд, часть 2</title>
      <link>https://tproger.ru/articles/migriruem-s-no-code-cms-na-django-powagovyj-gajd-chast-2</link>
      <comments>https://tproger.ru/articles/migriruem-s-no-code-cms-na-django-powagovyj-gajd-chast-2?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Лена Капаца]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/migriruem-s-no-code-cms-na-django-powagovyj-gajd-chast-2</guid>
      <description><![CDATA[<p>Привели код для переноса данных из JSON в Django SQL, задеплоили блог на Railway + Cloudflare, научили рендерить формулы на MathJax.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/migriruem-s-no-code-cms-na-django-powagovyj-gajd-chast-2">Мигрируем с no-code CMS на Django: пошаговый гайд, часть 2</a>»</p>]]></description>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 09 Oct 2023 07:47:28 GMT</pubDate>
      <content:encoded><![CDATA[<p>Если вы задумываетесь над переходом на самописный сайт и понимаете основы Python, эта статья поможет узнать, как сделать блог на Django 4.</p><p>Это продолжение статьи о миграции с low-code CMS на Django. В первой части мы развернули проект с симпатичным дизайном на локальном сервере, подготовили данные для загрузки в хранилище SQL (<a href="https://tproger.ru/articles/migriruem-s-no-code-cms-na-django-powagovyj-gajd-chast-1">ссылка</a>).</p><h2>Запустим сайт, что получили в первой части</h2><p>При каждом запуске сервера командой:</p><p>Запуск проекта Django отправляет нас по ссылке <a href="http://127.0.0.1:8000/">http://127.0.0.1:8000/</a>. Конечно, другие пользователи ее не увидят, даже если компьютер будет запущен круглосуточно. Потому настало время привязать к проекту домен.</p><h2>Переносим данные</h2><p>Мой сайт сидел на CMS под названием Ghost. Главным преимуществом я всегда считала возможность сменить тему без необходимости программировать и достаточно отлаженные для мобильных устройств шаблоны страниц.</p><p>Теперь, когда ценник возрос (в связи с ростом числа читателей) и отключением Visa / Mastercard на территории РФ, оплачивать подписку на эту систему стало невыгодно. Конечно, обходные пути для оплаты всегда найдутся, но умельцы навешивают комиссию в 20%. Со временем это начинает раздражать.</p><p>За «только платный» план Ghost делает свою работу очень достойно: в секции Labs блогер может скачать весь контент. Нечасто CMS настолько дружелюбны к перспективе миграции.</p><figure><img src="https://media.tproger.ru/user-uploads/79101/2023-10-08/dbf3a664-3ab0-43a0-a39d-abf2570780b2.png" alt="" /></figure><p>При скачивании получаем такой JSON-массив со статьями:</p><figure><img src="https://media.tproger.ru/user-uploads/79101/2023-10-08/22f50df5-ff5b-4821-a081-e787007f1431.png" alt="" /></figure><p>Django-проект сидит на SQLite (придется пересаживать на PostgreSQL), так что придется вытащить некоторые поля и загнать их в SQL-запрос.</p><p>Чтобы залить все 246 статей в базу, нужно проитерировать файл на 6800+ строк и вытащить обязательные параметры: название поста, описание, текст с HTML-разметкой, URL картинки и slug (псевдоним статьи на латинице для формирования ссылки вида <a href="https://ww.helenkapatsa.ru/blogpost/slug">https://ww.helenkapatsa.ru/blogpost/slug</a>).</p><p>Внимательные могли заметить, что при выделении параметров category, thumbnail_url остаются пустыми: в Ghost-выгрузке попросту нет аналогичных полей.</p><p>Созданный список из словарей заливаем в файл:</p><p>Теперь, когда данные в нужном формате готовы, производим инъекцию в хранилище на SQLite. Поскольку блог на русском языке, то стоит указать кодировку файла-источника прямо в шапке скрипта:</p><p>Теперь, подключив модуль sqlite3, заливаем посты:</p><p>Основной объем работ по переносу выполнен, админка наводнилась постами:</p><figure><img src="https://media.tproger.ru/user-uploads/79101/2023-10-08/eefd816f-6d89-4ecb-8a58-d1f550de63e5.png" alt="" /></figure><p>На сайте появились статьи, большая часть из них, к сожалению, без обложки. Придется писать скрипт, как с Unsplash, выделить картинки ссылками и обновить данные постов:</p><h2>Деплоим на сервере</h2><p>Первый шаг в этом процессе — развернуть репозиторий на круглосуточно работающем сервере. С этим здорово помогают сервисы вроде Railway: достаточно привязать свой GitHub-аккаунт, чтобы подтянулся нужный:</p><figure><img src="https://media.tproger.ru/user-uploads/79101/2023-10-10/666f1190-69b8-429e-aab7-f64c2461adef.png" alt="" /></figure><p>После построения проекта, которое заняло около двух минут, можем посмотреть статус развертывания:</p><figure><img src="https://media.tproger.ru/user-uploads/79101/2023-10-08/d2160da8-61e0-49c6-a204-84c0829c648b.png" alt="" /></figure><p>Сам сайт теперь доступен и на выделенном поддомене web-production-99b09.up.railway.app. Но нас интересует – helenkapatsa.ru.</p><p>Регистратор – reg.ru, и стандартная процедура вставки CNAME-записи не сработает:</p><figure><img src="https://media.tproger.ru/user-uploads/79101/2023-10-08/4e6289bf-409e-4661-8e3f-997b71dc18b0.png" alt="" /></figure><p>Поэтому используем Cloudflare. Он предоставляет бесплатные DNS-сервера. После регистрации и ввода доменного имени получаем инструкцию:</p><figure><img src="https://media.tproger.ru/user-uploads/79101/2023-10-08/20c11a5f-98b4-47d1-b805-1ead6b024840.png" alt="" /></figure><p>Замена ns1/2.reg.ru на адреса Cloudflare заняла менее 10 минут. Осталось добавить CNAME-запись, указывающую на Railway-приложение:</p><figure><img src="https://media.tproger.ru/user-uploads/79101/2023-10-08/07626032-480e-45ce-871d-7407b74cde87.jpeg" alt="" /></figure><p>Спустя примерно 10 минут сайт доступен по адресу helenkapatsa.ru:</p><figure><img src="https://media.tproger.ru/user-uploads/79101/2023-10-08/7bd57b0b-8b2a-403c-9a2f-ddc352bf298b.jpeg" alt="" /></figure><h2>Устанавливаем плагин</h2><p>Когда речь заходит о статистическом/математическом термине, зачастую к посту я прикладываю формулу. Чтобы Django рендерил MathJax (один из способов записать такое выражение), нам потребуется библиотека django-mathjax. Ее устанавливаем классической командой:</p><p>Пополняем перечень требуемых инструментов (requirements.txt), чтобы Railway при редеплое прошелся по этому файлу и установил инструмент:</p><figure><img src="https://media.tproger.ru/user-uploads/79101/2023-10-08/b7c60f2c-7203-4b89-abc6-dfeae1578dce.png" alt="" /></figure><p>Затем в шапку шаблона поста добавляем инструкцию, которая просит движок рендерить формулы при нахождении, как это заведено среди ученых:</p><p>/path/to/file/templates/blogpost.html:</p><p>Теперь при попадании такого синтаксиса в текст:</p><p>Код превратится в красоту:</p><figure><img src="https://media.tproger.ru/user-uploads/79101/2023-10-08/0c8645df-5efb-4610-b9cc-f1caa89ada68.png" alt="" /></figure><h2>Заключение</h2><p>Идеально не бывает, потому я планирую вернуть всем статьям обложки — фотографии животных с Unsplash — поэкспериментировать с диалоговым ассистентом, снова внедрить сниппет рекламной сети Яндекс и прочие улучшения.</p><p>Поддержка сайта не усложнится, пока вы регулярно практикуете Python. Такая миграция – это возможность попробовать инструменты, которые на работе внедрить не удается. Тем самым вы можете пополнять резюме до нужной комбинации технологий.</p>]]></content:encoded>
    </item>
    <item>
      <title>5 архитектурных ошибок, которые мы совершаем на старте проектов</title>
      <link>https://tproger.ru/articles/5-arhitekturnyh-owibok--kotorye-my-soverwaem-pri-starte-proektov</link>
      <comments>https://tproger.ru/articles/5-arhitekturnyh-owibok--kotorye-my-soverwaem-pri-starte-proektov?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Татьяна Жукова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/5-arhitekturnyh-owibok--kotorye-my-soverwaem-pri-starte-proektov</guid>
      <description><![CDATA[<p>Какие архитектурные ошибки чаще всего совершают разработчики при запуске проектов и как их избежать? Разбираем пять критичных промахов, которые мешают продукту масштабироваться и усложняют поддержку.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/5-arhitekturnyh-owibok--kotorye-my-soverwaem-pri-starte-proektov">5 архитектурных ошибок, которые мы совершаем на старте проектов</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Микросервисы]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Redux]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Redis]]></category>
      <category><![CDATA[Маркетинг]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Kubernetes]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Vue]]></category>
      <category><![CDATA[микро]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[CI/CD]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 14 Jul 2023 12:10:24 GMT</pubDate>
      <content:encoded><![CDATA[<p>Можно запустить MVP за пару недель, но потом годами разгребать архитектурные долги. Ошибки на старте проекта легко не заметить: код вроде бы работает, фичи выкатываются, пользователи приходят. Но когда продукт растёт, каждая непродуманная деталь в архитектуре оборачивается багами. Разбираем пять ключевых ошибок, которые разработчики совершают чаще всего, и объясняем, как их избежать.</p><h2>Ошибка 1. Нет четких границ между слоями приложения</h2><p>На старте проекта код часто пишется «в лоб»: контроллеры ходят в базу напрямую, внутри функций появляются бизнес-правила и расчёты, а валидация размазывается по коду. Это кажется удобным, пока приложение небольшое. Но при росте команды и количества фич изменения начинают ломать соседние части кода, баги растут, а скорость разработки падает.</p><p>Можно выделить три базовых уровня:</p><ul><li>Контроллеры (или хэндлеры) принимают запросы, проводят базовую валидацию (например, через pydantic-схемы) и передают данные дальше.</li><li>Слой бизнес-логики реализует правила работы приложения: транзакции, расчёты скидок, проверку лимитов, работу с несколькими сервисами.</li><li>Слой доступа к данным отвечает за запросы к базе и возвращает данные в удобной для бизнес-логики форме.</li></ul><p>Например, в FastAPI проще начать с хэндлеров, которые сразу ходят в SQLAlchemy-модель. Но если сразу заложить сервисный слой, расчёты комиссий и проверку бизнес-правил можно будет тестировать изолированно, не поднимая всю API. Слой репозиториев позволяет в будущем легко заменить Postgres на другую базу или добавить кэш, не переписывая логику приложения.</p><p>Чёткое разделение позволяет быстро находить, где живёт бизнес-логика, где происходит доступ к данным и куда добавлять новые фичи. Продукт растёт, а код остается предсказуемым, удобным для изменений и масштабирования.</p><h2>Ошибка 2. Игнор масштабирования с первого дня</h2><p>Когда проект только запускается, кажется, что про масштабирование можно подумать потом. Приложение обслуживает сотню пользователей, запросы проходят быстро, всё работает. Но как только запускается маркетинг или приходит первый крупный клиент, внезапно всё начинает тормозить, а в коде нет ни одной зацепки, куда безопасно вставить кэш или вынести тяжёлые операции в фон.</p><p>Важно сразу закладывать в архитектуру точки роста, даже если пока они не нужны на каждый день.</p><p>Например:</p><ul><li>Добавить очереди и фоновые задачи через Celery или RQ, если есть риск появления тяжёлых операций (генерация отчётов, массовая рассылка).</li><li>Разносить чтение и запись: даже простое разделение на эндпоинты, где читающие операции не блокируются длительными транзакциями, уже помогает при росте нагрузки.</li><li>Придумать, как кэшировать самые тяжелые запросы: например, использовать Redis, чтобы хранить агрегированные данные, а не считать их каждый раз.</li><li>Закладывать возможность горизонтального масштабирования: не привязывать логику к локальному состоянию приложения, использовать хранилище с возможностью разделения нагрузки, не писать монолит, который нельзя будет разбить на части при росте.</li></ul><p>На практике проект растёт быстрее, чем кажется. Сначала в API добавляется массовая выгрузка CSV, потом приходят интеграции с другими сервисами, а затем накатывается нагрузка от новых пользователей. Если архитектура не подготовлена, команде приходится ставить костыли, переписывать эндпоинты под фоновые задачи или внедрять кэш в экстренном порядке, исправляя баги в проде.</p><p>Закладывая масштабирование в архитектуру с первого дня,  команда экономит себе месяцы переработок и спасается от бесконечных хотфиксов. Это инвестиция, которая позволяет команде развивать продукт спокойно.</p><h2>Ошибка 3. Преждевременное усложнение архитектуры</h2><p>Многие разработчики боятся, что проект не выдержит нагрузку, поэтому с самого старта закладывают сложные паттерны, микросервисы, брокеры событий и сразу три уровня кэширования. Но пока в системе нет ни пользователей, ни подтверждённой бизнес-модели, такие решения снижают скорость разработки и приводят к куче багов.</p><p>Рядовой пример — проект сразу запускается на Kubernetes с несколькими сервисами, которые обмениваются сообщениями через Kafka. В реальности такие проекты вначале требуют десятков часов на поддержание инфраструктуры, а баги приходится искать сразу в нескольких сервисах, между которыми гуляют события. При этом единственная реальная задача в начале — быстро проверить гипотезы и получить первых пользователей.</p><p>Упрощённая архитектура на старте позволяет команде сосредоточиться на продукте: монолит с чёткими слоями (контроллеры, сервисы, репозитории) куда быстрее дорабатывается и легче деплоится, чем микросервисы с отдельными контурами.</p><p>Что можно делать:</p><ul><li>Запускать монолит на FastAPI или Django, а не дробить на микросервисы до появления реальных узких мест.</li><li>Использовать Postgres без брокеров событий, пока не появятся требования к масштабированию.</li><li>Добавлять кэш Redis точечно, когда видна реальная нагрузка, а не вслепую кэшировать каждый запрос.</li></ul><p>Сложные архитектуры требуют времени на поддержку и экспертизу, чтобы не допустить критичных ошибок (например, потерю событий в брокере или гонки данных между сервисами). Поэтому вложения в сложную архитектуру оправданы, когда проект достигает уровня, где без этого уже не обойтись.</p><p>Если команда делает стартап или MVP, преждевременное усложнение архитектуры только тормозит развитие продукта. Гораздо эффективнее заложить возможности для масштабирования (очереди, фоновые задачи, кэш), но держать архитектуру простой до тех пор, пока проект не начнёт расти и не появятся реальные вещи, требующие изменений.</p><h2>Ошибка 4. Непродуманная работа с зависимостями</h2><p>В начале проекта обычно кажется, что зависимости — это просто. Но со временем проект разрастается, зависимости множатся, версии начинают конфликтовать, а обновление одной библиотеки ломает другую.</p><p>Эта ошибка обычно проявляется в нескольких местах. Например, в проект могут без разбора ставиться зависимости про запас или ради одной строчки удобной функции, хотя можно обойтись стандартной библиотекой. Ещё одна частая проблема — зависимости фиксируются слишком жестко, что не дает обновляться безопасно, или наоборот, версии не фиксируются вовсе, и проект начинает падать после автоматического обновления библиотек.</p><p>Чтобы избежать проблем, важно с самого начала заложить порядок в работе с зависимостями:</p><ul><li>Использовать инструмент управления зависимостями, который позволяет контролировать версии и изолировать окружения.</li><li>Разделять зависимости для разработки и продакшена.</li><li>Периодически обновлять зависимости, чтобы не закапываться в старые версии, но делать это контролируемо и с прогоном тестов.</li></ul><p>Например, при работе с Python удобным подходом будет использование Poetry: можно зафиксировать версии зависимостей в pyproject.toml, автоматически создавать lock-файл, следить за актуальностью библиотек и легко пересоздавать окружение. Если проект запускается на CI/CD, можно установить точные версии и сразу выявить, где обновление ломает тесты.</p><p>В длинных проектах непродуманная работа с зависимостями множится в геометрической прогрессии. Любой новый разработчик тратит время на настройку окружения, зависимости конфликтуют, часть библиотек остаётся неиспользованной. Порядок с зависимостями экономит часы и дни, снижает риск падений в проде и влияет на развитие проекта.</p><h2>Ошибка 5. Нет стратегии управления состоянием</h2><p>Состояние — это данные, которые хранятся между запросами или действиями пользователя: корзина, прогресс пользователя, кэшированные результаты запроса, состояние WebSocket-подключений. Если не продумать, как эти данные хранятся, обновляются и синхронизируются, приложение быстро начинает вести себя непредсказуемо.</p><p>На старте часто используют облегченный подход: данные передаются по цепочке вызовов, хранятся в сессии или глобальных переменных, кэшируются в памяти процесса. Это удобно, пока пользователей мало и сервер один. Но при росте нагрузки и масштабировании начинаются проблемы: сессии теряются между инстансами, кэш расходится, данные теряются при перезапуске приложения.</p><p>Чтобы избежать хаоса, управление состоянием нужно продумать заранее:</p><ul><li>Выяснить, какие данные должны храниться между запросами и как долго.</li><li>Решить, где хранить состояние: в базе данных, Redis, сторонних сервисах.</li><li>Сразу заложить сериализацию и валидацию состояния, чтобы избежать рассинхронизации форматов.</li></ul><p>Например, хранение кэша в памяти может подойти для небольших проектов, но если приложение начинает горизонтально масштабироваться, лучше вынести кэш в Redis, чтобы все инстансы работали с единым источником. Для сессий пользователей можно использовать JWT, если нужно масштабирование без общего состояния, или централизованное хранилище сессий, если требуется возможность их отзыва.</p><p>При работе с фронтендом стратегия управления состоянием не менее важна. Например, при использовании React или Vue проект может сначала обходиться локальным состоянием компонентов, но при росте сложности приложение начинает сыпаться из-за рассинхрона между компонентами. Важно заранее заложить подход с централизованным состоянием, а также понять, какие данные держать в состоянии клиента, а какие запрашивать заново.</p><p>Без стратегии управления состоянием проект становится сложным в отладке и поддержке. Грамотное управление состоянием ускоряет разработку и снижает количество багов в будущем.</p><p>А какие ошибки допускаете вы? Делитесь в комментариях или в тг-канале <a href="https://t.me/+a1v-IRDDUqI0MDhi">Веб-страница</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Дайджест Python #13: инструменты для Data Science и исполняемые файлы из скрипта</title>
      <link>https://tproger.ru/articles/dajdzhest-python-13-instrumenty-dlya-data-science-i-ispolnyaemye-fajly-iz-skripta</link>
      <comments>https://tproger.ru/articles/dajdzhest-python-13-instrumenty-dlya-data-science-i-ispolnyaemye-fajly-iz-skripta?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Рафаил Агазода]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/dajdzhest-python-13-instrumenty-dlya-data-science-i-ispolnyaemye-fajly-iz-skripta</guid>
      <description><![CDATA[<p>Собрали лучшие материалы по Python с 1 по 14 июля. Узнайте, как сделать из скрипта исполняемый файл и как настроить автопостинг в ВК.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/dajdzhest-python-13-instrumenty-dlya-data-science-i-ispolnyaemye-fajly-iz-skripta">Дайджест Python #13: инструменты для Data Science и исполняемые файлы из скрипта</a>»</p>]]></description>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Big Data]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Нейронные сети]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Data Science]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 14 Jul 2023 09:30:36 GMT</pubDate>
      <content:encoded><![CDATA[<p>Собрали дайджест из лучших материалов по Python с 1 по 14 июля, которые только смогли найти. Дайджест включает статьи и видео на русском и английском языках.</p><p>Узнайте, как сделать из Python-скрипта исполняемый файл, какие инструменты использовать в Data Science и как настроить автопостинг в ВК.</p><h2>Big Data / Data Science</h2><ul><li><a href="https://habr.com/ru/articles/747838/">Экстренное шифрование данных</a></li><li><a href="https://habr.com/ru/companies/jetinfosystems/articles/747338/">Инструменты Дата-сайнтиста. Универсальная база</a></li><li><a href="https://habr.com/ru/articles/747350/">Как из метрик Prometheus построить график Latency</a></li><li><a href="https://habr.com/ru/articles/746874/">Dagster и Great Expectations: Интеграция без боли</a></li><li><a href="https://habr.com/ru/companies/piter/articles/745860/">Книга «Python для data science»</a></li><li><a href="https://dev.to/aqsa81/what-is-the-minimum-system-requirements-for-data-science-5b9n">[ENG] What is the Minimum System Requirements for Data Science?</a></li><li><a href="https://dev.to/avinash201199/data-science-roadmap-with-free-material-o0c">[ENG] Data Science Roadmap with Free Study Material</a></li><li><a href="https://dev.to/grayhat/modern-data-stack-a-hands-on-guide-with-airbyte-snowflake-and-dbtdata-build-tool-3obi">[ENG] Modern Data Stack: A Hands-on Guide with Airbyte, Snowflake, and dbt(data build tool)</a></li></ul><h2>AI и ML</h2><ul><li><a href="https://habr.com/ru/articles/747380/">Тестируем на реальных кейсах Chatgpt Code Interpreter</a></li><li><a href="https://habr.com/ru/articles/746842/">Семантическая сегментация на основе архитектуры U-Net и определение расстояния между объектами</a></li><li><a href="https://habr.com/ru/articles/746762/">Первые шаги в импульсных нейронных сетях</a></li><li><a href="https://habr.com/ru/articles/746134/">See and Tell: Сервис просмотра сериалов для слабовидящих</a></li><li><a href="https://habr.com/ru/articles/745768/">Нейронные сети не могут обобщать периодические зависимости. Как это исправить?</a></li><li><a href="https://dev.to/apisix/building-a-chatgpt-custom-plugin-for-api-gateway-3176">[ENG] Building a ChatGPT custom plugin for API Gateway</a></li><li><a href="https://dev.to/mehrandvd/ai-team-collaboration-with-azure-ml-studio-3dio">[ENG] AI Team Collaboration with Azure ML Studio</a></li><li><a href="https://dev.to/polterguy/invoking-openais-chatgpt-from-6-different-programming-languages-191f">[ENG] Invoking OpenAI’s ChatGPT from 6 different programming languages</a></li><li><a href="https://dev.to/polterguy/creating-a-better-stackoverflow-with-chatgpt-52pd">[ENG] Creating a Better StackOverflow with ChatGPT</a></li></ul><h2>Веб / Django / Flask</h2><ul><li><a href="https://habr.com/ru/articles/741766/">FVWA (Flask Vulnerable Web Application)</a></li><li><a href="https://habr.com/ru/companies/yandex/articles/745534/">Lock записей и шквал «пятисоток»: какие шишки мы набили на миграциях в Django и как вам этого избежать</a></li><li><a href="https://habr.com/ru/companies/selectel/articles/747278/">Полезные материалы и инструменты для погружения в Flask: выбор сотрудников Selectel</a></li><li><a href="https://dev.to/forhadakhan/multi-role-user-authentication-in-django-rest-framework-3nip">[ENG] Multi-Role User Authentication in Django Rest Framework</a></li><li><a href="https://dev.to/behainguyen/python-flask-railwayapp-deployment-and-railways-nixpacks-docker-image-build-tool-3026">[ENG] Python, Flask: Railway.app deployment and Railway’s Nixpacks Docker image build tool.</a></li><li><a href="https://dev.to/scofieldidehen/road-map-for-python-developers-of2">[ENG] Road-Map for Python Developers </a></li><li><a href="https://dev.to/derlin/when-plans-go-astray-my-unsuccessful-journey-of-migrating-a-large-django-project-to-mypy-3l23">[ENG] When plans go astray: my unsuccessful journey of migrating a large Django project to Mypy</a></li><li><a href="https://dev.to/ifihan/exploring-djangos-third-party-packages-top-libraries-you-should-know-38km">[ENG] Exploring Django’s Third-Party Packages: Top Libraries You Should Know</a></li></ul><h2>Скрипты, приложения и боты</h2><ul><li><a href="https://habr.com/ru/articles/747644/">RabbitMQ Direct Reply-to. RPC поверх кролика без дополнительных очередей (пример на Python)</a></li><li><a href="https://habr.com/ru/articles/746838/">Автопостинг ВК (VK) на python</a></li><li><a href="https://habr.com/ru/companies/southbridge/articles/746622/">Как сделать из Python-скрипта исполняемый файл</a></li><li><a href="https://habr.com/ru/companies/tinkoff/articles/745994/">Встроенные фикстуры Pytest</a></li><li><a href="https://habr.com/ru/companies/wunderfund/articles/745476/">Развлечения с хеш-коллизиями</a></li><li><a href="https://dev.to/haszankauna/writing-a-transmission-control-protocol-stack-in-python-3p6">[ENG] Writing a Transmission Control Protocol stack in Python</a></li></ul><h2>Развлекательный контент</h2><ul><li><a href="https://www.youtube.com/watch?v=8QeZrDqAQXY&amp;ab_channel=MoscowPython">[Видео] опрос Stackoverflow / PEP 594 / PSF Board 2023 / релиз JupyterLab 4</a></li><li><a href="https://www.youtube.com/watch?v=gXB9Rolne9Y&amp;ab_channel=MoscowPython">[Видео] Moscow Python Meetup №82. Максим Безруков. Виртуальное окружение по хардкору. Жизнь без pip</a></li><li><a href="https://dev.to/soumyadeepdey/chatgpt-vs-bard-which-is-better-for-coding-355j">[ENG] ChatGPT Vs Bard: Which is better for coding?</a></li></ul><p>Нашли что-нибудь полезное и интересное для себя? Расскажите, какой раздел показался вам самым интересным, а каких статей не хватило, чтобы следующий дайджест получился ещё лучше.</p><p>Если дайджест вам понравился, посмотрите две предыдущие подборки:</p><p>А ещё присылайте в комментарии статьи и видео, которые ускользнули от нашего взгляда и не попали в дайджест. Поделитесь полезными материалами с другими читателями!</p>]]></content:encoded>
    </item>
    <item>
      <title>Дайджест Python #12: взлом ChatGPT и оптимизация Jupyter Notebook</title>
      <link>https://tproger.ru/articles/dajdzhest-python-ot-3-iyulya</link>
      <comments>https://tproger.ru/articles/dajdzhest-python-ot-3-iyulya?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Рафаил Агазода]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/dajdzhest-python-ot-3-iyulya</guid>
      <description><![CDATA[<p>Собрали лучшие материалы по Python с 15 по 30 июня. Узнайте, как взломать ChatGPT и как компилировать типизированный Python.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/dajdzhest-python-ot-3-iyulya">Дайджест Python #12: взлом ChatGPT и оптимизация Jupyter Notebook</a>»</p>]]></description>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Big Data]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Нейронные сети]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Data Science]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 03 Jul 2023 09:28:08 GMT</pubDate>
      <content:encoded><![CDATA[<p>Собрали дайджест из лучших материалов по Python с 15 по 30 июня, которые только смогли найти. Дайджест включает статьи и видео на русском и английском языках.</p><p>Узнайте, как взломать ChatGPT, как оптимизировать работу в Jupyter Notebook и как компилировать типизированный Python.</p><h2>Big Data / Data Science</h2><ul><li><a href="https://habr.com/ru/articles/744066/">Оптимизации работы Jupyter notebook при помощи параллельных вычислений (Библиотека Joblib)</a></li><li><a href="https://habr.com/ru/companies/it-guide/articles/741876/">Анализировать данные — это как варить пиво. Почему дата-анализ и пивоварение — одно и то же с техноизнанки</a></li><li><a href="https://habr.com/ru/articles/743438/">Как сэкономить свои нервы и деньги компании на перестроении структуры больших таблиц без простоя в PostgreSQL</a></li><li><a href="https://dev.to/cyber_holics/how-to-manage-environment-for-data-science-project-using-conda-3mmp">[ENG] How To Manage Environment For Data Science Project Using Conda</a></li><li><a href="https://dev.to/newbie_coder/unleashing-the-potential-of-random-forest-regression-a-python-implementation-guide-with-hyperparameter-tuning-167o">[ENG] Unleashing the Potential of Random Forest Regression : A Python Implementation Guide with Hyperparameter Tuning</a></li><li><a href="https://dev.to/phylis/mlops-101-a-beginners-guide-to-understanding-machine-learning-model-operations-2dko">[ENG] MLOps 101: A Beginner’s Guide to Understanding Machine Learning Model Operations</a></li><li><a href="https://dev.to/grayhat/demystifying-the-data-product-lifecycle-from-inception-to-retirement-2i19">[ENG] Demystifying the Data Product Lifecycle: From Inception to Retirement</a></li><li><a href="https://dev.to/ranggakd/polars-vs-pandas-a-brief-tale-of-two-dataframe-libraries-lli">[ENG] Polars vs Pandas: A Brief Tale of Two DataFrame Libraries</a></li></ul><h2>AI и ML</h2><ul><li><a href="https://habr.com/ru/articles/744972/">Фильтруй базар! Как мы параллельный русско-башкирский корпус чистили</a></li><li><a href="https://habr.com/ru/companies/kaspersky/articles/744544/">Кажется, вы больше не должны давать тестовые задания кандидатам на дом</a></li><li><a href="https://habr.com/ru/articles/744016/">Как определить причины достижений и неудач футбольного клуба с помощью цифр</a></li><li><a href="https://habr.com/ru/articles/742420/">Заметки про увеличение картинок нейронными сетями</a></li><li><a href="https://habr.com/ru/companies/kaspersky/articles/743412/">Взламывая ChatGPT: как мы участвовали в хакатоне по атакам на ИИ</a></li><li><a href="https://dev.to/akshayballal/experiment-tracking-and-hyperparameter-tuning-with-tensorboard-in-pytorch-402j">[ENG] Experiment Tracking and Hyperparameter Tuning with TensorBoard in PyTorch</a></li><li><a href="https://dev.to/akshayballal/building-a-vision-transformer-from-scratch-in-pytorch-1m1b">[ENG] Building a Vision Transformer from Scratch in PyTorch</a></li><li><a href="https://dev.to/aws/all-the-things-that-comprehend-rekognition-textract-polly-transcribe-and-others-do-3mb7">[ENG] All the things that Comprehend, Rekognition, Textract, Polly, Transcribe, and Others Do</a></li><li><a href="https://dev.to/shittu_olumide_/copydeepcopy-vs-clone-in-pytorch-455b">[ENG] Copy.deepcopy() vs clone() in Pytorch</a></li></ul><h2>Веб / Django / Flask</h2><ul><li><a href="https://habr.com/ru/articles/745402/">Fastapi 0.100.0-beta1: ещё быстрее</a></li><li><a href="https://dev.to/pragativerma18/unlocking-performance-a-guide-to-async-support-in-django-2jdj">[ENG] Unlocking Performance: A Guide to Async Support in Django</a></li><li><a href="https://dev.to/bangik/deploying-a-flask-application-on-aws-ec2-52k7">[ENG] Deploying a Flask Application on AWS EC2</a></li><li><a href="https://dev.to/thelime1/building-an-infinite-website-with-flask-and-openais-davinci-v3-23ja">[ENG] Building an Infinite Website with Flask and OpenAI’s davinci-v3</a></li><li><a href="https://dev.to/devvspaces/mastering-django-cicd-using-github-actions-2912">[ENG] Mastering Django CI/CD using GitHub Actions</a></li><li><a href="https://dev.to/developerbishwas/discovering-pysekt-your-next-favorite-tech-stack-575k">[ENG] Discovering PySeKT: Your Next Favorite Tech Stack</a></li></ul><h2>Скрипты, приложения и боты</h2><ul><li><a href="https://habr.com/ru/articles/744836/">Как сделать Telegram-бота для проверки аптайма своего сервиса на Python (ч.1 мгновенные метрики)</a></li><li><a href="https://habr.com/ru/articles/745280/">Как сделать Telegram-бота для проверки аптайма своего сервиса на Python (ч.2 алертинг)</a></li><li><a href="https://habr.com/ru/articles/744774/">Простейший бот «на движке» WEB WhatsApp</a></li><li><a href="https://habr.com/ru/companies/yandex/articles/743496/">Как я написал конвертер 3D-моделей из подручных средств</a></li><li><a href="https://habr.com/ru/articles/743192/">Messaging для чайников. Утилизируем все возможности RabbitMQ на Python</a></li><li><a href="https://habr.com/ru/companies/piter/articles/743538/">Как можно компилировать типизированный Python</a></li><li><a href="https://habr.com/ru/articles/743424/">Умный дом с голосовым ассистентом на минималках</a></li><li><a href="https://habr.com/ru/companies/selectel/articles/742774/">Типизация в Python. Работа с Mypy, PyCharm и SQLAlchemy 2.0</a></li><li><a href="https://dev.to/bytewax/reasoning-about-streaming-vs-batch-with-a-case-study-from-github-5g3l">[ENG] Reasoning about Streaming vs Batch with a Case Study from GitHub</a></li></ul><h2>Развлекательный контент</h2><ul><li><a href="https://www.youtube.com/watch?v=8VtDc25VshI&amp;list=PLv_zOGKKxVph51u_AIswuXCasZ7aZD8t3&amp;index=3">[Видео] Python meetup (Online)</a></li><li><a href="https://www.youtube.com/watch?v=QciiG079Bjk&amp;list=PLv_zOGKKxVph51u_AIswuXCasZ7aZD8t3&amp;index=2">[Видео] Обработка данных / Pandas 2.0</a></li></ul><p>Нашли что-нибудь полезное и интересное для себя? Расскажите, какой раздел показался вам самым интересным, а каких статей не хватило, чтобы следующий дайджест получился ещё лучше.</p><p>Если дайджест вам понравился, посмотрите две предыдущие подборки:</p><p>А ещё присылайте в комментарии статьи и видео, которые ускользнули от нашего взгляда и не попали в дайджест. Поделитесь полезными материалами с другими читателями!</p>]]></content:encoded>
    </item>
    <item>
      <title>Дайджест Python #11: шаурмичная на Python и AI-плагины для разработки</title>
      <link>https://tproger.ru/articles/dajdzhest-python</link>
      <comments>https://tproger.ru/articles/dajdzhest-python?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Рафаил Агазода]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/dajdzhest-python</guid>
      <description><![CDATA[<p>Лучшие статьи о Python с 1 по 15 июня: как готовить шаурму с Python, как создать чатбот на ruT5 и какие есть AI-плагины для разработки.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/dajdzhest-python">Дайджест Python #11: шаурмичная на Python и AI-плагины для разработки</a>»</p>]]></description>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Big Data]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Нейронные сети]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Data Science]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 19 Jun 2023 08:51:24 GMT</pubDate>
      <content:encoded><![CDATA[<p>Собрали дайджест из лучших материалов по Python с 1 по 15 июня, которые только смогли найти. Дайджест включает статьи и видео на русском и английском языках.</p><p>Узнайте, как готовить шаурму с помощью Python, как создать чатбот на основе ruT5, есть ли смысл в связке языков Python и C и какие есть AI-плагины для разработки на Python.</p><h2>Big Data / Data Science</h2><ul><li><a href="https://habr.com/ru/companies/avito/articles/740232/">PySpark для аналитика. Как выгружать данные с помощью toPandas и его альтернатив</a></li><li><a href="https://habr.com/ru/articles/739572/">Применение Python для сбора и предобработки данных цифрового следа</a></li><li><a href="https://habr.com/ru/companies/vk/articles/741702/">Форматы данных и файлов: руководство для архитекторов</a></li><li><a href="https://habr.com/ru/companies/vk/articles/735720/">Почему для MLOps лучше выбирать Open Source, а не проприетарное ПО</a></li><li><a href="https://habr.com/ru/companies/alfa/articles/739792/">Как ускорить вывод ML-моделей в 4 раза, или Как может выглядеть экосистема МLOps в банке</a></li><li><a href="https://dev.to/bobur/visualize-real-time-data-with-python-dash-and-risingwave-33g0">[ENG] Visualize Real-Time Data With Python, Dash, and RisingWave</a></li><li><a href="https://dev.to/johnrushx/20-databases-to-pick-in-2023-simplified-1n0n">[ENG] 20 databases to pick in 2023 – simplified</a></li><li><a href="https://dev.to/grayhat/transform-your-data-like-a-pro-with-dbt-data-build-tool-39kd">[ENG] Transform Your Data Like a Pro With dbt (Data Build Tool)</a></li><li><a href="https://dev.to/ranggakd/polars-vs-pandas-a-brief-tale-of-two-dataframe-libraries-lli">[ENG] Polars vs Pandas: A Brief Tale of Two DataFrame Libraries</a></li><li><a href="https://dev.to/ussdlover/data-visualization-using-matplotlib-and-seaborn-351a">[ENG] Data Visualization using Matplotlib and Seaborn</a></li></ul><h2>AI и ML</h2><ul><li><a href="https://habr.com/ru/articles/742460/">Поиск объектов на изображении. Часть 1</a></li><li><a href="https://habr.com/ru/articles/742420/">Заметки про увеличение картинок нейронными сетями</a></li><li><a href="https://habr.com/ru/articles/742386/">Что под капотом у нейронной сети. Нейросеть c точки зрения математики и программирования</a></li><li><a href="https://habr.com/ru/articles/741296/">cv3 — делаем OpenCV питоничным</a></li><li><a href="https://habr.com/ru/articles/741258/">Роли ChatGPT, которые первыми начинают диалог с клиентом и добивается поставленной бизнес задачи</a></li><li><a href="https://habr.com/ru/companies/kaspersky/articles/739208/">Хороший, плохой, злой и… свободный? Сравниваем глуповатые, но усердные AI-плагины для разработки</a></li><li><a href="https://habr.com/ru/articles/740426/">Сингулярность, в результате которой ИИ сам сделает себя умнее людей. GPT-4 играет в Minecraft и самообучается</a></li><li><a href="https://dev.to/abhaysinghr1/8-crucial-lessons-to-streamline-your-machine-learning-implementation-18il">[ENG] 8 Crucial Lessons to Streamline Your Machine Learning Implementation</a></li><li><a href="https://dev.to/twilio/build-a-sms-bot-that-answers-questions-over-docs-with-langchain-in-python-47fj">[ENG] Build a SMS Bot that Answers questions over Docs with LangChain in Python</a></li></ul><h2>Веб / Django / Flask</h2><ul><li><a href="https://habr.com/ru/articles/741258/">Роли ChatGPT, которые первыми начинают диалог с клиентом и добивается поставленной бизнес задачи</a></li><li><a href="https://habr.com/ru/articles/740882/">AIsaacChat: ИИ чатбот на основе ruT5</a></li><li><a href="https://habr.com/ru/articles/740288/">Парсинг, хранение и отображение логов 3-х разных агентов доставки электронной почты. MTA Log Parser</a></li><li><a href="https://dev.to/djangonews/django-news-django-bugfix-release-422-3058">[ENG] Django News – Django bugfix release 4.2.2</a></li><li><a href="https://dev.to/djangonews/django-news-python-37-to-312-updates-mg3">[ENG] Django News – Python 3.7 to 3.12 updates</a></li><li><a href="https://dev.to/ifihan/testing-in-django-26e5">[ENG] Testing in Django</a></li><li><a href="https://dev.to/scofieldidehen/10-django-packages-to-every-developer-must-install-1opj">[ENG] 10 Django Packages Every Developer Must Install</a></li></ul><h2>Скрипты, приложения и боты</h2><ul><li><a href="https://habr.com/ru/companies/ruvds/articles/741840/">Мой первый супероптимизатор</a></li><li><a href="https://habr.com/ru/articles/741724/">Python3 + C, есть ли смысл?</a></li><li><a href="https://habr.com/ru/companies/selectel/articles/741392/">Shawarma as a service: как создать бота для заказа шавермы и оставить голодными лишь 1,1% коллег</a></li><li><a href="https://habr.com/ru/companies/ozontech/articles/740540/">Сказ о том, как специалисты IT-поддержки скрипты писали…</a></li><li><a href="https://dev.to/yogeshwaran01/i-built-3-apps-using-spotify-api-and-python-49k8">[ENG] I built 3 Apps using Spotify API and Python</a></li><li><a href="https://dev.to/geeksvegeta/simple-friendlist-app-in-pyhton-tkinter-6k5">[ENG] Simple FriendList App In Pyhton Tkinter</a></li><li><a href="https://dev.to/ussdlover/regular-expressions-and-string-manipulation-in-python-45kd">[ENG] Regular expressions and string manipulation in Python</a></li><li><a href="https://dev.to/cicirello/pyaction-4210-released-59k">[ENG] pyaction 4.21.0 Released</a></li></ul><h2>Развлекательный контент</h2><ul><li><a href="https://www.youtube.com/watch?v=6f4FL5G9kMo&amp;list=PLv_zOGKKxVph51u_AIswuXCasZ7aZD8t3&amp;ab_channel=MoscowPython">[Видео] Типизация в Python</a></li><li><a href="https://youtu.be/YeA2a8UlRbw?list=PLv_zOGKKxVph51u_AIswuXCasZ7aZD8t3">[Видео] Python Language Summit 2023 / новости PyPI / Python 3.12 beta 1/ Diablo 4</a></li><li><a href="https://www.youtube.com/watch?v=SCOKZF5oImQ&amp;ab_channel=DIRTYPYTHON">[Видео] Python: Ботоводство на AIOgram</a></li></ul><p>Нашли что-нибудь полезное и интересное для себя? Расскажите, какой раздел показался вам самым интересным, а каких статей не хватило, чтобы следующий дайджест получился ещё лучше.</p><p>Если дайджест вам понравился, посмотрите две предыдущие подборки:</p><p>А ещё присылайте в комментарии статьи и видео, которые ускользнули от нашего взгляда и не попали в дайджест. Поделитесь полезными материалами с другими читателями!</p>]]></content:encoded>
    </item>
    <item>
      <title>Дайджест Python #10: генерация голоса и оценка скорости Mojo</title>
      <link>https://tproger.ru/articles/dajdzhest-python-10</link>
      <comments>https://tproger.ru/articles/dajdzhest-python-10?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Рафаил Агазода]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/dajdzhest-python-10</guid>
      <description><![CDATA[<p>Собрали новости Python с 15 по 31 мая. Узнайте, как сгенерировать голос человека на Python и во сколько раз Mojo быстрее Python на самом деле.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/dajdzhest-python-10">Дайджест Python #10: генерация голоса и оценка скорости Mojo</a>»</p>]]></description>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Big Data]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Нейронные сети]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Data Science]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 02 Jun 2023 09:22:36 GMT</pubDate>
      <content:encoded><![CDATA[<p>Собрали дайджест из лучших материалов по Python с 15 по 31 мая, которые только смогли найти. Дайджест включает статьи и видео на русском и английском языках.</p><p>Узнайте, как сгенерировать голос человека на Python, во сколько раз Mojo быстрее Python на самом деле и как обыгрывать противников в покер при помощи нейросетей.</p><h2>Big Data / Data Science</h2><ul><li><a href="https://habr.com/ru/articles/738906/">Кластеризация текста в PySpark</a></li><li><a href="https://habr.com/ru/articles/738720/">Определение свободного парковочного места с помощью Computer Vision</a></li><li><a href="https://habr.com/ru/companies/ru_mts/articles/738208/">Что нам стоит диаграмму в Python построить: 5 вариантов привлекающей внимание визуализации данных и кое-что ещё</a></li><li><a href="https://habr.com/ru/companies/sberbank/articles/736464/">Правильное подключение к БД: почему, зачем и как</a></li><li><a href="https://habr.com/ru/articles/736950/">Все DETRы мира. Часть 1</a></li><li><a href="https://habr.com/ru/articles/735606/">Что нового в SQLAlchemy 2.0?</a></li><li><a href="https://dev.to/grayhat/exploring-advanced-and-modern-concepts-in-sql-with-practical-examples-1md5">[ENG] Exploring Advanced and Modern Concepts in SQL with Practical Examples</a></li><li><a href="https://dev.to/javinpaul/my-favorite-free-courses-to-learn-data-science-in-depth-pmo">[ENG] My Favorite Free Courses to Learn Data Science in Depth</a></li></ul><h2>AI и ML</h2><ul><li><a href="https://habr.com/ru/companies/spectr/articles/738766/">Битва медведей: Pandas против Polars</a></li><li><a href="https://habr.com/ru/articles/736536/">Реализация функции потерь в Python</a></li><li><a href="https://habr.com/ru/articles/736190/">Использование компьютерного зрения для игры в покер</a></li><li><a href="https://habr.com/ru/companies/ntc-vulkan/articles/692818/">Восстановить удаленную фотографию с флешки? Искусственный интеллект в помощь</a></li><li><a href="https://dev.to/akshayballal/build-your-own-youtubegpt-using-langchain-and-openai-4lh5">[ENG] Build your own YouTubeGPT using LangChain and OpenAI</a></li><li><a href="https://dev.to/thenomadevel/facebook-open-sources-its-horizon-ai-platform-am5">[ENG] Facebook Open-Sources Its Horizon AI Platform</a></li><li><a href="https://dev.to/suede/how-i-built-a-midjourney-api-2j8h">[ENG] How I built a Midjourney API</a></li><li><a href="https://dev.to/praveenr2998/semantic-search-using-vectorsembeddings-for-noobs-2297">[ENG] Semantic Search Using Vectors/Embeddings For Noobs</a></li><li><a href="https://dev.to/edenai/how-to-generate-voices-with-python-3558">[ENG] How to generate voices with Python?</a></li></ul><h2>Веб / Django / Flask</h2><ul><li><a href="https://habr.com/ru/companies/selectel/articles/735556/">Создаем блог на Django с опросами и тестами. Краткая инструкция. Часть 1</a></li><li><a href="https://habr.com/ru/companies/selectel/articles/738942/">Создаем блог на Django с опросами и тестами. Краткая инструкция. Часть 2</a></li><li><a href="https://habr.com/ru/companies/rosbank/articles/736698/">Особенности асинхронности в Python</a></li><li><a href="https://habr.com/ru/articles/738238/">Werkzeuger: раскручиваем arbitrary file read до RCE в веб-приложении на flask</a></li><li><a href="https://dev.to/akashrchandran/how-to-create-rest-api-using-django-rest-framework-f4o">[ENG] How to create REST API using Django REST framework</a></li><li><a href="https://dev.to/foxy4096/websocket-in-django-55p1">[ENG] WebSocket in Django</a></li><li><a href="https://dev.to/ki3ani/deploying-your-first-dockerized-django-rest-api-on-aws-elastic-beanstalk-a-comprehensive-guide-2m77">[ENG] Deploying Your First Dockerized Django REST API on AWS Elastic Beanstalk: A Comprehensive Guide</a></li><li><a href="https://dev.to/chetanam/a-one-person-startup-tech-stack-nextjs-django-kubernetes-and-gcp-k62">[ENG] A One Person Startup Tech Stack for Ninja Developers – Next.js, Django, Kubernetes, and GCP</a></li></ul><h2>Скрипты, приложения и боты</h2><ul><li><a href="https://habr.com/ru/articles/739368/">Решаем задачу сетевого планирования с помощью Python</a></li><li><a href="https://habr.com/ru/articles/739314/">FastAPI без db: Session</a></li><li><a href="https://habr.com/ru/articles/738910/">Телеграм бот для CustDev’а на Aiogram</a></li><li><a href="https://habr.com/ru/articles/738432/">Пишем на Python, как будто это Rust</a></li><li><a href="https://habr.com/ru/articles/737536/">Propan — Python фреймворк для написания микросервисов с использованием брокеров сообщений</a></li><li><a href="https://habr.com/ru/companies/yandex/articles/736006/">Как заставить бэкендера писать фронтенд</a></li><li><a href="https://dev.to/chetanan/omkar-devtools-a-swiss-army-knife-for-ninja-developers-oli">[ENG] Meet Omkar DevTools: Your Swiss Army Knife as a Ninja Developer</a></li><li><a href="https://dev.to/cicirello/pyaction-4200-released-4p3k">[ENG] pyaction 4.20.0 Released</a></li><li><a href="https://dev.to/happer64bit/binary-search-in-python-3998">[ENG] Binary Search in Python</a></li><li><a href="https://dev.to/ken_mwaura1/getting-started-monitoring-a-fastapi-app-with-grafana-and-prometheus-a-step-by-step-guide-3fbn">[ENG] Getting Started: Monitoring a FastAPI App with Grafana and Prometheus – A Step-by-Step Guide</a></li></ul><h2>Развлекательный контент</h2><ul><li><a href="https://www.youtube.com/watch?v=25xUoLye53w&amp;ab_channel=RineiskyDev">[Видео] Собеседование Python 2023. Разбор базовых вопросов</a></li><li><a href="https://www.youtube.com/watch?v=Wgi4Al65l0A&amp;ab_channel=%D0%AF%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D0%9F%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D1%83%D0%BC">[Видео] Блиц по бэкенду: сравниваем Python и Java</a></li><li><a href="https://www.youtube.com/watch?v=yovCqxZalJU&amp;ab_channel=Telusko">[Видео] [ENG] Mojo VS Python Speed Test</a></li><li><a href="https://www.youtube.com/watch?v=u6RV1lkHW8M&amp;ab_channel=LeMasterTech">[Видео] [ENG] How to Make Donkey Kong in Python!</a></li></ul><p>Нашли что-нибудь полезное и интересное для себя? Расскажите, какой раздел показался вам самым интересным, а каких статей не хватило, чтобы следующий дайджест получился ещё лучше.</p><p>Если дайджест вам понравился, посмотрите две предыдущие подборки:</p><p>А ещё присылайте в комментарии статьи и видео, которые ускользнули от нашего взгляда и не попали в дайджест. Поделитесь полезными материалами с другими читателями!</p>]]></content:encoded>
    </item>
    <item>
      <title>Дайджест Python #9: PandasAI, Телеграм-бот на Django и языковые модели на Python</title>
      <link>https://tproger.ru/articles/dajdzhest-python-9</link>
      <comments>https://tproger.ru/articles/dajdzhest-python-9?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Рафаил Агазода]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/dajdzhest-python-9</guid>
      <description><![CDATA[<p>Собрали лучшие материалы по Python с 1 по 15 мая. Узнайте, что такое PandasAI и как сделать языковую модель на Python.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/dajdzhest-python-9">Дайджест Python #9: PandasAI, Телеграм-бот на Django и языковые модели на Python</a>»</p>]]></description>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Big Data]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Нейронные сети]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Data Science]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 16 May 2023 09:21:31 GMT</pubDate>
      <content:encoded><![CDATA[<p>Собрали дайджест из лучших материалов по Python с 1 по 15 мая, которые только смогли найти. Дайджест включает статьи и видео на русском и английском языках.</p><p>Узнайте, что такое PandasAI и почему он изменит Data Science, как написать Telegram-бота на Django и как сделать языковую модель на Python.</p><h2>Big Data / Data Science</h2><ul><li><a href="https://habr.com/ru/articles/735098/">Координатный квест: как найти координаты и расстояния без регистраций и смс</a></li><li><a href="https://habr.com/ru/companies/glowbyte/articles/732024/">Байесовский подход к АБ тестированию</a></li><li><a href="https://habr.com/ru/articles/733672/">Data-driven рост с помощью науки о данных и машинного обучения</a><a href="https://habr.com/ru/articles/733954/"></a></li><li><a href="https://habr.com/ru/articles/733954/">Анализ таблиц сопряженности средствами Python. Часть 1. Визуализация</a><a href="https://habr.com/ru/companies/avito/articles/732870/"></a></li><li><a href="https://habr.com/ru/companies/avito/articles/732870/">PySpark для аналитика. Как правильно просить ресурсы и как понять, сколько нужно брать</a></li><li>[ENG] <a href="https://towardsdatascience.com/data-oriented-programming-with-python-ef478c43a874">Data-Oriented Programming in Python</a><a href="https://dev.to/andreaaline/using-pandascut-in-python-for-data-analysis-creating-number-and-date-intervals-708"></a></li><li>[ENG] <a href="https://dev.to/andreaaline/using-pandascut-in-python-for-data-analysis-creating-number-and-date-intervals-708">Using pandas.cut() in Python for Data Analysis: Creating Number and Date Intervals</a><a href="https://dev.to/abpanic/numpy-and-pandas-essential-tools-for-data-analysis-and-manipulation-1953"></a></li><li>[ENG] <a href="https://dev.to/abpanic/numpy-and-pandas-essential-tools-for-data-analysis-and-manipulation-1953">NumPy and Pandas: Essential Tools for Data Analysis and Manipulation</a><a href="https://dev.to/phylis/scikit-learn-code-snippets-for-common-machine-learning-tasks-a-comprehensive-guide-for-beginners-2358"></a></li><li>[ENG] <a href="https://dev.to/phylis/scikit-learn-code-snippets-for-common-machine-learning-tasks-a-comprehensive-guide-for-beginners-2358">Scikit-Learn Code Snippets for Common Machine Learning Tasks: A Comprehensive Guide for Beginners</a></li></ul><h2>AI и ML</h2><ul><li><a href="https://habr.com/ru/articles/734222/">Торговый робот с использованием нейросетей</a></li><li><a href="https://habr.com/ru/articles/733958/">Делаем анализатор ников на новой FRED-T5. Тотальный разнос</a></li><li><a href="https://habr.com/ru/articles/734154/">Бесплатные фронтенды к ChatGPT</a><a href="https://habr.com/ru/articles/733536/"></a></li><li><a href="https://habr.com/ru/articles/733536/">Обучение YOLOv5 на кастомном датасете</a></li><li>[ENG] <a href="https://dev.to/ferisjuan/open-ai-api-with-docker-4kad">Open AI API with Docker</a></li><li>[ENG] <a href="https://dev.to/aws/building-an-aws-well-architected-chatbot-with-langchain-13cd">Building an AWS Well-Architected Chatbot with LangChain</a></li><li>[ENG] <a href="https://dev.to/iampearceman/privategpt-chatgpt-but-private-and-compliant-21ee">ChatGPT, Made Private and Compliant!</a></li><li>[ENG] <a href="https://towardsdatascience.com/getting-started-with-langchain-a-beginners-guide-to-building-llm-powered-applications-95fc8898732c">Getting Started with LangChain: A Beginner’s Guide to Building LLM-Powered Applications</a></li><li>[ENG] <a href="https://medium.com/@fareedkhandev/pandas-ai-the-future-of-data-analysis-8f0be9b5ab6f">Pandas AI — The Future of Data Analysis</a></li><li>[ENG] <a href="https://artificialcorner.com/pandasai-super-simple-data-analysis-with-ai-powered-by-openai-128c47c57522">PandasAI: Super Simple Data Analysis with AI (Powered by OpenAI)</a></li></ul><h2>Веб / Django / Flask</h2><ul><li><a href="https://habr.com/ru/articles/734786/">Telegram Django Bot за пару строк</a></li><li><a href="https://habr.com/ru/articles/733996/">Как создать собственный кэшбэк-сервис</a><a href="https://dev.to/anurag629/setting-up-your-full-stack-development-environment-with-python-django-and-react-1457"></a></li><li>[ENG] <a href="https://dev.to/anurag629/setting-up-your-full-stack-development-environment-with-python-django-and-react-1457">Setting Up Your Full-Stack Development Environment with Python, Django, and React</a></li><li>[ENG] <a href="https://dev.to/sirneij/authentication-system-using-python-django-and-sveltekit-23e1">Authentication system using Python (Django) and SvelteKit</a></li><li>[ENG] <a href="https://medium.com/@nagendra.kumar1508/file-upload-using-django-and-html-5d43207bf67">File upload using Django and HTML</a></li><li>[ENG] <a href="https://medium.com/@mikahemminger.cc/htmx-within-django-intro-2023-6bf3bd77491e">HTMX within Django – Intro 2023</a></li><li>[ENG] <a href="https://medium.com/@mikahemminger.cc/django-4-tips-tricks-and-packages-list-eca5320ea5e5">Django – Tips, tricks and packages – 2023</a></li><li>[ENG] <a href="https://python.plainenglish.io/redis-as-a-powerful-caching-solution-for-django-web-applications-434907e7705f">Redis as a Powerful Caching Solution for Django Web Applications</a></li></ul><h2>Скрипты, приложения и боты</h2><ul><li><a href="https://habr.com/ru/companies/otus/articles/734528/">Python. Выражения в методах и индексаторах</a></li><li><a href="https://habr.com/ru/companies/selectel/articles/734194/">«Карманный синоптик за час». Пишем Telegram-бота для мониторинга погоды на Python</a></li><li><a href="https://habr.com/ru/articles/733686/">Макет автоматизированного создания пользователей (ботов) в социальных сетях и имитации их активности</a></li><li><a href="https://habr.com/ru/articles/733642/">Решаем криптарифмы с помощью алгебры и python</a></li><li>[ENG] <a href="https://dev.to/anvil/the-picast-connect-a-raspberry-pi-pico-w-to-an-anvil-app-453a">The PiCast: Connect a Raspberry Pi Pico W to an Anvil app</a></li><li>[ENG] <a href="https://dev.to/4yub1k/art-of-manually-crafting-packets-tcpip-1phc">Art of Manually Crafting Packets (TCP/IP).</a></li><li>[ENG] <a href="https://medium.com/@tony.infisical/the-death-of-the-env-file-6d65bfc6ac5e">Doing much better than your .env file</a></li></ul><h2>Развлекательный контент</h2><ul><li>[Видео] <a href="https://www.youtube.com/watch?v=_fqPDCnKffs&amp;ab_channel=MoscowPython">Изучаем иностранные языки с помощью Python и ChatGPT</a></li><li>[Видео] <a href="https://youtu.be/UWQ3_uB98-I">Притворяемся языковой моделью: учимся генерировать текст на Python с помощью цепи Маркова</a></li><li>[ENG] <a href="https://dev.to/hackertab_org/50-chat-gpt-prompts-every-software-developer-should-know-tested-9al">50 Chat GPT Prompts Every Software Developer Should Know (Tested)</a></li></ul><p>Нашли что-нибудь полезное и интересное для себя? Расскажите, какой раздел показался вам самым интересным, а каких статей не хватило, чтобы следующий дайджест получился ещё лучше.</p><p>Если дайджест вам понравился, посмотрите две предыдущие подборки:</p><p>А ещё присылайте в комментарии статьи и видео, которые ускользнули от нашего взгляда и не попали в дайджест. Поделитесь полезными материалами с другими читателями!</p>]]></content:encoded>
    </item>
    <item>
      <title>Дайджест Python #8: обновления Django и обучение GPT-4</title>
      <link>https://tproger.ru/articles/python-digest-8</link>
      <comments>https://tproger.ru/articles/python-digest-8?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Рафаил Агазода]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/python-digest-8</guid>
      <description><![CDATA[<p>Собрали дайджест из материалов по Python с 15 по 30 апреля. Узнайте, как подключить AutoGPT проекту, как изменился Django и как обучить GPT-4.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/python-digest-8">Дайджест Python #8: обновления Django и обучение GPT-4</a>»</p>]]></description>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Big Data]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Нейронные сети]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Data Science]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 03 May 2023 11:58:50 GMT</pubDate>
      <content:encoded><![CDATA[<p>Собрали дайджест из лучших материалов по Python с 15 по 30 апреля, которые только смогли найти. Дайджест включает статьи и видео на русском и английском языках.</p><p>Узнайте, как подключить AutoGPT к своему проекту, какие обновления затронули Django и как обучить GPT-4 новым данным.</p><h2>Big Data / Data Science</h2><ul><li><a href="https://habr.com/ru/articles/731596/">Как мы делали скоринг на микросервисной архитектуре руками не-программистов</a></li><li><a href="https://habr.com/ru/articles/730860/">Сам себе Росстат</a></li><li><a href="https://habr.com/ru/companies/uchi_ru/articles/730330/">Real-time аналитика в Учи.ру: как смотреть сложные метрики</a></li><li><a href="https://habr.com/ru/companies/otkritie/articles/732216/">Новые горизонты в оценке рисков: как источники данных помогают создать точные модели</a></li><li>EN <a href="https://habr.com/ru/articles/731158/">DataHub: веб-песочница для тех, кто изучает SQL</a></li><li>EN <a href="https://pub.towardsai.net/all-statistical-tests-using-python-mastering-statistics-part-1-996346d5add5">All Statistical Tests using Python: Mastering Statistics | Part — 1</a></li><li>EN <a href="https://towardsdatascience.com/getting-started-with-langchain-a-beginners-guide-to-building-llm-powered-applications-95fc8898732c">Getting Started with LangChain: A Beginner’s Guide to Building LLM-Powered Applications</a></li><li>EN <a href="https://towardsdatascience.com/the-next-big-crisis-for-data-teams-58ac2bd856e8">The Next Big Crisis for Data Teams</a></li><li>EN <a href="https://towardsdatascience.com/the-best-learning-paths-for-ai-and-data-leadership-fabc3d4f8e36">The Best Learning Paths for AI and Data Leadership</a></li><li>EN <a href="https://towardsdatascience.com/is-pandas-easy-to-use-try-this-tool-to-make-it-easier-2071eeffe482">PandasGUI — The Ultimate Secret to Effortless Data Analysis</a></li><li>EN <a href="https://levelup.gitconnected.com/exploratory-data-analysis-the-ultimate-workflow-a82b1d21f747">Exploratory Data Analysis: The Ultimate Workflow</a></li></ul><h2>AI и ML</h2><ul><li><a href="https://habr.com/ru/articles/730300/">Об инициации весов при обучении нейронных сетей. Личный опыт и рассуждения</a></li><li><a href="https://habr.com/ru/articles/731056/">GPT-4 добавляем новые знания: Git репозиторий</a></li><li><a href="https://habr.com/ru/news/730814/">Google дала Bard возможность создавать код на 20 языках, включая C++, Go, Java, Javascript, Python, Typescript</a></li><li><a href="https://habr.com/ru/articles/729380/">Пишем простой ML веб-сервис на FastAPI</a></li><li><a href="https://habr.com/ru/companies/ods/articles/729662/">Создай своего ИИ-ассистента с помощью ChatGPT и Streamlit</a></li><li>EN <a href="https://betterprogramming.pub/gpt4all-running-an-open-source-chatgpt-clone-on-your-laptop-71ebe8600c71">GPT4All: Running an Open-source ChatGPT Clone on Your Laptop</a></li><li>EN <a href="https://artificialcorner.com/how-to-easily-install-auto-gpt-the-autonomous-gpt-4-everyone-is-talking-about-5a0ee4e1f39e">How to Easily Install Auto-GPT: The Autonomous GPT-4 Everyone is Talking About</a></li><li>EN <a href="https://medium.com/codingthesmartway-com-blog/discover-thinkgpt-the-cutting-edge-python-library-that-transforms-ai-into-a-powerful-thinking-c7e588bd28b4">Discover ThinkGPT: The Cutting-Edge Python Library that Transforms AI into a Powerful Thinking Machine</a></li></ul><h2>Веб / Django / Flask</h2><ul><li><a href="https://habr.com/ru/articles/732164/">PyCharm Docker Django Debug</a></li><li><a href="https://habr.com/ru/articles/730238/">Простая очередь задач в Django, подключение Kandinsky 2.1</a></li><li><a href="https://habr.com/ru/articles/729844/">403, 404 или 405. Разбираемся со статусами во ViewSet’ах DRF</a></li><li><a href="https://habr.com/ru/articles/729610/">Связь Django и PostgreSQL внутри Docker</a></li><li><a href="https://habr.com/ru/companies/yandex_praktikum/articles/727626/">Релиз Django LTS 4.2: обзор изменений и необходимости обновления</a></li><li>EN <a href="https://awstip.com/handling-a-million-tasks-in-django-efficient-prioritization-with-celery-redis-and-flower-b06fc8957d5">Handling a Million Tasks in Django: Efficient Prioritization with Celery, Redis, and Flower</a></li><li>EN <a href="https://mobileappcircular.com/the-road-less-traveled-exploring-the-advanced-features-of-django-%EF%B8%8F-9373716b8539">The Road Less Traveled: Exploring the Advanced Features of Django </a></li><li>EN <a href="https://medium.com/@amirayat20/recommended-stack-for-your-django-project-91f9a3016007">Recommended stack for your Django Project</a></li></ul><h2>Скрипты, приложения и боты</h2><ul><li><a href="https://tproger.ru/articles/kak-rabotaet-funkciya-print-v-python/">Как работает функция print в Python</a></li><li><a href="https://habr.com/ru/companies/ruvds/articles/732530/">Ускоряем Python в сто раз при помощи менее чем ста строк на Rust</a></li><li><a href="https://habr.com/ru/articles/732638/">Проверка GIL в python</a></li><li><a href="https://habr.com/ru/companies/otus/articles/732562/">Создание DSL на Python с библиотекой textx</a></li><li><a href="https://habr.com/ru/articles/732388/">7 подходов к проверке атрибутов классов в Python</a></li><li><a href="https://habr.com/ru/companies/piter/articles/732310/">Оптимизируем использование памяти в приложениях Python</a></li><li><a href="https://habr.com/ru/articles/731484/">Сколько Надо Строк Кода Для Того Чтобы Подписать Артефакты?</a></li><li><a href="https://habr.com/ru/news/731118/">В репозитории PyPI внедрили опцию публикации пакетов без привязки к паролям и токенам API</a></li><li><a href="https://habr.com/ru/companies/selectel/articles/729856/">Как подключить платежную систему с Payments к Telegram</a></li><li>EN <a href="https://levelup.gitconnected.com/20-python-concepts-i-wish-i-knew-way-earlier-573cd189c183">20 Python Concepts I Wish I Knew Way Earlier</a></li></ul><h2>Развлекательный контент</h2><ul><li><a href="https://habr.com/ru/companies/selectel/articles/729828/">Проверяем ветхозаветную историю происхождения человечества от Адама и Евы с помощью популяционной модели</a></li><li>Видео <a href="https://www.youtube.com/watch?v=2Qwte6Ka630&amp;ab_channel=MoscowPython">Обучение подростков и взрослых Python в 2023 году / Программирование — вторая грамотность</a></li><li>Видео  <a href="https://www.youtube.com/watch?v=kPWk2ufDuEk&amp;ab_channel=TalkPython">Live from PyCon 2023 – Talk Python #413</a></li><li>Видео  <a href="https://www.youtube.com/watch?v=ZNSsxb0NrI4&amp;ab_channel=Changelog">Unpopular opinion! Python 3.11 is going to kill Go</a></li></ul><p>Нашли что-нибудь полезное и интересное для себя? Расскажите, какой раздел показался вам самым интересным, а каких статей не хватило, чтобы следующий дайджест получился ещё лучше.</p><p>Если дайджест вам понравился, посмотрите две предыдущие подборки:</p><p>А ещё присылайте в комментарии статьи и видео, которые ускользнули от нашего взгляда и не попали в дайджест. Поделитесь полезными материалами с другими читателями! 😉</p>]]></content:encoded>
    </item>
    <item>
      <title>Дайджест Tproger #3: Node.js 20, бот для торговли криптой, сторонние магазины в iOS17</title>
      <link>https://tproger.ru/articles/dajdzhest-tproger-3-node-js-20-bot-dlya-torgovli-kriptoj-storonnie-magaziny-v-ios17</link>
      <comments>https://tproger.ru/articles/dajdzhest-tproger-3-node-js-20-bot-dlya-torgovli-kriptoj-storonnie-magaziny-v-ios17?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/dajdzhest-tproger-3-node-js-20-bot-dlya-torgovli-kriptoj-storonnie-magaziny-v-ios17</guid>
      <description><![CDATA[<p>Свежий дайджест Tproger. Что нового в Node.js 20, как Apple разрешила приложения не из AppStore и как прокачалась Midjourney.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/dajdzhest-tproger-3-node-js-20-bot-dlya-torgovli-kriptoj-storonnie-magaziny-v-ios17">Дайджест Tproger #3: Node.js 20, бот для торговли криптой, сторонние магазины в iOS17</a>»</p>]]></description>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Разработка игр]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Нейронные сети]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Советы]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Soft Skills]]></category>
      <category><![CDATA[Юмор]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 21 Apr 2023 11:00:41 GMT</pubDate>
      <content:encoded><![CDATA[<p>Свежий дайджест Tproger, в котором вы обязательно найдёте полезные материалы.</p><h2>Веб-разработка</h2><ul><li>Поделились сложным, но простым языком.<br /><a href="https://t.me/tproger_web/3680">Обсудили структуры данных во фронтенде.</a></li><li>Хотите, чтоб сайт был привлекателен даже без интернета?<br /><a href="https://t.me/tproger_web/3667">Рассказали, как это сделать.</a></li><li>Поделились видеокурсом по бэкенду на Node.js.<br /><a href="https://t.me/tproger_web/3669">Теперь вы можете применить JS не только во фронтенде.</a></li><li>Рассказали как скроллить страницу к нужному элементу с помощью URL.<br /><a href="https://t.me/tproger_web/3683">И оставили инструкцию с картинками.</a></li><li>Вышла Node.js 20.<br /><a href="https://tproger.ru/articles/vywla-node-js-20-rasskazyvaem-ob-obnovleniyah/">Рассказываем, что нового.</a></li></ul><h2>Python и Django</h2><ul><li>У нас на сайте появились 99 ответов на 101 вопрос для Python-разработчиков.<br /><a href="https://tproger.ru/articles/chto-dolzhen-znat-razrabotchik-na-python-bez-opyta/">Согласны с ними? Попробуйте ответить самостоятельно.</a></li><li>Погружаемся в крипту с помощью питона.<br /><a href="https://t.me/zen_of_python/2334">Рассказали, как написать бота для торговли на криптобирже Binance.</a></li><li>Устанавливаем Python-проект под Windows нормально.<br /><a href="https://t.me/zen_of_python/2329">Инструкция тут.</a></li></ul><h2>Точка входа: полезности для начинающих программистов</h2><ul><li>Рассказали про основы SOLID для начинающих.<br /><a href="https://t.me/prog_point/2190">Обязательно прочитайте, потому что в работе пригодятся.</a></li><li>Так ли хорош «чистый» код?<br /><a href="https://t.me/tproger/10608">Рассказали о том, как некоторые правила написания такого кода портят производительность.</a></li><li>Получили заветный оффер на должность джуна?<br /><a href="https://tproger.ru/experts/100-dnej-na-pozicii-junior/">Рассказали, как вести  в первые 100 дней работы, чтобы не облажаться.</a></li><li>Хотите стать Android-разработчиком?<br /><a href="https://t.me/prog_point/2208">В этом видео вы узнаете как.</a></li><li>Обратите внимание на язык программирования Go.<br /><a href="https://tproger.ru/articles/chto-takoe-go-i-kak-ego-ispolzuyut/">Тут рассказали что это такое и где его используют.</a></li><li>Flexbox Zombies — тренажёр для изучения Flexbox CSS.<br /><a href="https://t.me/prog_point/2198">Побеждаем зомби с помощью флексов.</a></li><li>Как выбрать первый язык программирования.<br /><a href="https://tproger.ru/articles/kakoj-yazyk-programmirovaniya-vybrat-dlya-pogruzheniya-v-specialnost/">Рассказали тут.</a></li></ul><h2>Полезные инструменты, книги и лайфхаки для разработчиков</h2><ul><li>Нашли большой интерактивный учебник по Python.<br /><a href="https://t.me/zen_of_python/2330?single">Забирайте себе.</a></li><li>MyJavaScript — полезный ресурс для начинающих фронтенд-разработчиков.<br /><a href="https://t.me/prog_point/2203">Тут и руководства, и шпаргалки, и многое другое.</a></li><li>CSS Peek — удобный плагин для веб-разработки.<br /><a href="https://t.me/prog_point/2195">Он упростит настройку стилей ваших HTML-элементов.</a></li><li>Собрали подборку промптом для ChatGPT.<br /><a href="https://tproger.ru/articles/20-rabochih-promptov-chatgpt-dlya-it/">Теперь он сможет лучше выполнять конкретные задачи.</a></li><li>CodeStream — инструмент, позволяющий общаться и работать в режиме реального времени, не покидая свою IDE.<br /><a href="https://t.me/prog_tools/1049">То, что нужно для быстрого взаимодействия внутри команды.</a></li><li>А вот инструмент для тестировщиков.<br /><a href="https://t.me/prog_tools/1046">Knapsack Pro — оптимизация времени запуска тестов в проектах, написанных на любом языке программирования.</a></li><li>И ещё один, но уже для тестирования UI.<br /><a href="https://t.me/prog_tools/1044">Называется Chromatic.</a></li></ul><h2>GameDev</h2><ul><li>Инди-разработчики показали геймплейный трейлер своей игры и им не поверили.<br /><a href="https://t.me/make_game/845">Почему? Посмотрите сами, в это действительно сложно поверить.</a></li><li>А разработчик с Reddit показал прототип Pokemon Go на максималках.<br /><a href="https://t.me/make_game/842">Там одного смартфона будет недостаточно.</a></li></ul><h2>Мобильная разработка</h2><ul><li>В Android 14 можно будет настроить пользовательские действия в меню Share.<br /><a href="https://t.me/mobi_dev/2123">Рассказали тут, как это сделать.</a></li><li>Готовьте свои приложения для iOS.<br /><a href="https://tproger.ru/articles/apple-razrewit-ustanavlivat-storonnie-prilozheniya-na-ios-17/">В iOS 17 Apple разрешит устанавливать сторонние приложения! Кажется…</a></li><li>Знаете что такое Kotlinx.Serialization? Подсказка: сериализует данные.<br /><a href="https://t.me/mobi_dev/2114">А вот как и зачем, узнаете тут.</a></li><li>Учимся пагинации в Jetpack Compose.<br /><a href="https://t.me/mobi_dev/2112">Вот по этому видеоуроку.</a></li><li>Немного новостей про Kotlin.<br /><a href="https://t.me/mobi_dev/2111">Kotlin DSL теперь используется по умолчанию для новых сборок Gradle.</a></li></ul><h2>Нейросети</h2><ul><li>Вы только взгляните, как прокачалась Midjourney всего за 5 поколений.<br /><a href="https://t.me/neuro_channel/737">В этом видео всё максимально наглядно видно.</a></li><li>Илон Маск сперва был против ИИ, а теперь решил сделать свой.<br /><a href="https://tproger.ru/articles/ilon-mask-zapustit-svoyu-yazykovuyu-model-truthgpt/">Вот тут рассказали подробнее о его планах и новой компании.</a></li><li>А NVIDIA продолжает выкатывать новые технологии.<br /><a href="https://t.me/neuro_channel/730">Взгляните сами.</a></li></ul><h2>Soft skills</h2><ul><li>Рассказали про дизайн-мышление.<br /><a href="https://t.me/soft_skillz/416">Чем полезно и как его применять, читайте тут.</a></li><li>Боремся с сомнениями и учимся принимать решения.<br /><a href="https://t.me/soft_skillz/418">Эти 11 способов побороть страх вам помогут.</a></li><li>Метите в тимлиды?<br /><a href="https://tproger.ru/articles/kak-timlidu-provesti-pervyj-god-v-neznakomoj-srede/">Заранее узнайте, как тимлиду провести первый год в незнакомой среде.</a></li><li>Разработчик с 9-летним опытом поделился советами.<br /><a href="https://tproger.ru/articles/opyt-devyati-let-razrabotki-ili-kak-ya-ponyal-chto-ne-byvaet-idealnyh-proektov/">Читаем тут.</a></li></ul><h2>Немного юмора</h2><ul><li>Инструкция, как пушить в прод для джунов.<a href="https://t.me/ithumor/9355">Не перепутайте!</a></li><li>Идея для стартапа с минимальными вложениями.<a href="https://t.me/ithumor/9353">Коронуем в сеньоры онлайн.</a></li><li>Дизайнер vs. Разработчик.<a href="https://t.me/ithumor/9350">Наглядная демонстрация проблемы.</a></li><li>Все мы иногда эта жаба.<a href="https://t.me/ithumor/9348">Согласны?</a></li><li>Немного грубо, но зато доходчиво.<br /><a href="https://t.me/ithumor/9330">Как отвечать любителям халявы.</a></li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Дайджест Python #7: аналоги ChatGPT и обновления фреймворков</title>
      <link>https://tproger.ru/articles/python-digest-7</link>
      <comments>https://tproger.ru/articles/python-digest-7?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Рафаил Агазода]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/python-digest-7</guid>
      <description><![CDATA[<p>Собрали лучшие новости о Python с 1 по 15 апреля. Узнайте, как написать свой Duolingo и как изменились фреймворки для работы с Big Data.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/python-digest-7">Дайджест Python #7: аналоги ChatGPT и обновления фреймворков</a>»</p>]]></description>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Big Data]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Нейронные сети]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Data Science]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 17 Apr 2023 07:30:39 GMT</pubDate>
      <content:encoded><![CDATA[<p>Собрали дайджест из лучших материалов по Python с 1 по 15 апреля, которые только смогли найти. Дайджест включает статьи и видео на русском и английском языках.</p><p>Узнайте, какие существуют альтернативы ChatGPT, как написать собственный Duolingo и как изменились фреймворки Python для работы с BigData.</p><h2>Big Data / Data Science</h2><ul><li><a href="https://habr.com/ru/articles/729268/">Как IT-специалисты-экологи спасут планету</a></li><li><a href="https://habr.com/ru/companies/magnit/articles/728676/">Лучшие практики при работе с мастер-данными</a></li><li><a href="https://habr.com/ru/companies/glowbyte/articles/728680/">FineBI 6.0: 9 полезных обновлений, о которых вы не знали</a></li><li><a href="https://habr.com/ru/articles/728204/">Производительность и стабильность Knime на слабых компьютерах</a></li><li><a href="https://habr.com/ru/companies/otus/articles/728118/">Полезные методы работы с данными в Pandas. Часть 2</a></li><li><a href="https://habr.com/ru/articles/727560/">Основные инструменты для работы в Data Engineering: введение для начинающих Data Engineer’ов</a></li><li><a href="https://habr.com/ru/articles/729292/">Экспресс-анализ данных на Python</a></li><li><a href="https://habr.com/ru/articles/728256/">Пишем приложение на Python для интерактивной визуализации графов с NetworkX, Plotly и Dash</a></li><li><a href="https://habr.com/ru/articles/726468/">Начинаем работу с PyTorch 2.0 и Hugging Face Transformers</a></li><li>%save-sc0% Data structures in Computer Science</li><li>%save-sc1% From Kafka to Amazon S3: Partitioning Outputs</li><li>%save-sc2% Data Reduction and Why It Is Important For Edge Computing</li><li>%save-sc3% Driving Business Success: Unleashing the Power of Data Integration</li></ul><h2>AI и ML</h2><ul><li><a href="https://habr.com/ru/companies/wunderfund/articles/728030/">Ускорение работы моделей Stable Diffusion на процессорах Intel</a></li><li><a href="https://habr.com/ru/articles/727986/">О чём все эти люди говорят, ChatGPT?</a></li><li><a href="https://habr.com/ru/articles/727804/">Savant: новый высокопроизводительный фреймворк Python для видеоаналитики на оборудовании Nvidia</a></li><li><a href="https://habr.com/ru/articles/726468/">Начинаем работу с PyTorch 2.0 и Hugging Face Transformers</a></li><li><a href="https://habr.com/ru/articles/727484/">Распознаем автомобильные номера на TorchServe</a></li><li><a href="https://habr.com/ru/articles/727348/">Как я решила попробовать себя в ML: анализ эмоциональной окраски отзывов с Кинопоиска 2.0</a></li><li><a href="https://habr.com/ru/companies/doubletapp/articles/726898/">Руки на руль: Bus Factor следит за тобой</a></li><li><a href="https://habr.com/ru/articles/729158/">OpenAssistant: Вышла бесплатная открытая альтернатива ChatGPT</a></li><li><a href="https://habr.com/ru/articles/728678/">Чем отличаются ChatGPT3 и ChatGPT4?</a></li><li><a href="https://habr.com/ru/articles/728298/">Запуск аналогов ChatGPT на домашнем ПК в пару кликов и с интерфейсом</a></li><li>%save-sc4% Generating Images from Text with C# and Open AI DALL-E</li><li>%save-sc5% Google and Stanford Creates a Matrix With Chat-GPT Instances</li><li>%save-sc6% Create a ChatGPT Plugin to retrieve NASA images</li></ul><h2>Веб / Django / Flask</h2><ul><li><a href="https://habr.com/ru/companies/yandex_praktikum/articles/727626/">Релиз Django LTS 4.2: обзор изменений и необходимости обновления</a></li><li><a href="https://habr.com/ru/articles/727936/">Интеграция и кастомизация OpenAPI в Django/Django Rest Framework</a></li><li><a href="https://habr.com/ru/articles/726504/">Обучаем с помощью LlamaIndex и OpenAI GPT-3 отвечать по вашей базе знаний</a></li><li>%save-sc7% Create a Modern Application with Django and Vue</li><li>%save-sc8% Mastering Django: Best Practices for Writing High-Quality Web Applications</li><li>%save-sc9% How To Revert Migration In Django?</li><li>%save-sc10% Understanding QuerySets in Django</li><li>%save-sc11% 10 Must-See Django Open-Source Projects to Inspire Your Next Web App</li><li>%save-sc12% 17 Django Tips and Tricks for Optimizing Your Application</li></ul><h2>Скрипты, приложения и боты</h2><ul><li><a href="https://habr.com/ru/articles/727400/">EasySteamPaybot или как я помогал людям пополнять Steam</a></li><li><a href="https://habr.com/ru/articles/729036/">Как сделать торгового робота для Binance</a></li><li><a href="https://habr.com/ru/articles/728846/">Как перестать беспокоиться и установить Python-проект другу под Windows</a></li><li><a href="https://habr.com/ru/articles/728194/">Восемь признаков недо-yield вашего проекта на Python</a></li><li><a href="https://habr.com/ru/companies/swd_es/articles/726196/">Методика портирования пакетов Python в операционную систему «Нейтрино»</a></li><li><a href="https://habr.com/ru/articles/727900/">Пишем свой личный Duolingo на минималках</a></li><li><a href="https://habr.com/ru/articles/727836/">DSL фреймворк для создания Telegram ботов</a></li><li><a href="https://habr.com/ru/articles/727718/">Project_2. Местоположение с помощью IP-адреса (Python)</a></li><li><a href="https://habr.com/ru/companies/kts/articles/727528/">Визуализация 5 алгоритмов сортировки на Python</a></li><li>%save-sc13% Linting Python in VS Code [Video]</li><li>%save-sc14% Building a Simple Web Scraper with Python and BeautifulSoup</li></ul><h2>Развлекательный контент</h2><ul><li>%save-sc15% LTS-релиз Django 4.2 / вышли PyTorch 2.0 и Pandas 2.0 / свежие PEP</li><li>%save-sc16% Python Channel</li><li>%save-sc17% The History of AI</li></ul><p>Нашли что-нибудь полезное и интересное для себя? Расскажите, какой раздел показался вам самым интересным, а каких статей не хватило, чтобы следующий дайджест получился ещё лучше.</p><p>Если дайджест вам понравился, посмотрите две предыдущие подборки:</p><p>А ещё присылайте в комментарии статьи и видео, которые ускользнули от нашего взгляда и не попали в дайджест. Поделитесь полезными материалами с другими читателями! ?</p>]]></content:encoded>
    </item>
    <item>
      <title>Дайджест Tproger: ⅓ россиян бесят коллеги, нейросеть хочет уничтожить людей</title>
      <link>https://tproger.ru/articles/dajdzhest-tproger</link>
      <comments>https://tproger.ru/articles/dajdzhest-tproger?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/dajdzhest-tproger</guid>
      <description><![CDATA[<p>Дайджест Типичного программиста ⭐ Держите выжимку из самых полезных и интересных материалов в IT-сфере за последние дни.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/dajdzhest-tproger">Дайджест Tproger: ⅓ россиян бесят коллеги, нейросеть хочет уничтожить людей</a>»</p>]]></description>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Разработка игр]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Нейронные сети]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Советы]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Soft Skills]]></category>
      <category><![CDATA[Юмор]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 13 Apr 2023 18:14:52 GMT</pubDate>
      <content:encoded><![CDATA[<p>А вот и свежий дайджест Tproger, в котором вы обязательно найдёте полезные материалы.</p><h2>Веб-разработка</h2><ul><li>Как расширить функционал веб-приложений без головной боли? <br /><a href="https://t.me/tproger_web/3660">Рассказали о четырёх веб-API, которые вы можете использовать в своих проектах.</a></li><li>Может ли видео на бэкграунде быть лёгким и плавным? Конечно! <br /><a href="https://t.me/tproger_web/3661">Рассказали как это сделать.</a></li></ul><ul><li>Проверить как работает ваш код на JS или TS можно в одном окне. <br /><a href="https://t.me/prog_tools/1028">Поделились инструментом RunJS, который помогает мгновенно проверить работу ваших скриптов.</a></li><li>А туда ли улетают ваши запросы?<br /><a href="https://tproger.ru/articles/gajd-po-rabote-s-postman/">Как создать, протестировать и задокументировать API с помощью Postman рассказали здесь.</a></li></ul><h2>Python и Django</h2><ul><li>Django не так сложен, как вам могло показаться!<br /><a href="https://t.me/tproger/10570https://t.me/tproger/10570">Поделились небольшим, но подробным видеокурсом по основам Django.</a></li><li>Обрабатывать большой поток данных может быть сложно. <br /><a href="https://t.me/zen_of_python/2309">Рассказали, как создать конвейер данных с Kafka и ClickHouse для облегчения жизни.</a></li><li>Копирайтер против ChatGPT: кто круче напишет статью про Python?<br /><a href="https://tproger.ru/articles/kopirajter-protiv-chatgpt-chej-tekst-luchwe/">Провели небольшое исследование, в котором приняли участие  пользователи.</a></li><li>Пишете красивый код, но забываете о безопасности?<br /><a href="https://t.me/zen_of_python/2313">Тогда обязательно сохраните себе эту шпаргалку с полезными советами.</a></li><li>Бесконечно можно смотреть на три вещи: как течёт вода, как горит огонь и как красиво сортируются массивы. <br /><a href="https://t.me/zen_of_python/2315">Визуализация последнего ждёт вас тут.</a></li></ul><h2>Точка входа: полезности для начинающих программистов</h2><ul><li>Flexbox и Grid — два основных способа вёрстки страниц с помощью CSS. <br /><a href="https://t.me/prog_point/2181">Если ещё не владеете ими, то посмотрите этот видеоурок, посвящённый CSS Grid.</a></li><li>SOLID, но не Snake.<br /><a href="https://t.me/prog_point/2190">Изучите один из главных способов проектирования приложений, который точно вам пригодится.</a></li><li>Учимся работать с AWS — одной из самых популярных облачных платформ. <br /><a href="https://t.me/prog_point/2185">Конечно, по видеоурокам.</a></li></ul><h2>Полезные инструменты, книги и лайфхаки для разработчиков</h2><ul><li>Хотите вставить на сайт какой-то особенный символ?<br /><a href="https://t.me/prog_point/2182">Держите интерактивный справочник с символьными объектами HTML, символами Unicode и 8859-1, кавычками и многим другим.</a></li><li>Swimlanes.io — инструмент, который поможет вам визуализировать процессы.<br /><a href="https://t.me/prog_tools/1019">Как создавать диаграммы быстро и просто рассказали тут.</a></li><li>Scratch — инструмент от MIT, который помогает даже детям освоить программирование.<br /><a href="https://t.me/prog_tools/1021">Рассказали, как бесплатно прокачаться.</a></li><li>GitHub не всему голова.<br /><a href="https://t.me/prog_tools/1022">Git-Tower — Git-клиент с расширенными возможностями.</a></li><li>Не все любят видеокурсы и статьи.<br /><a href="https://t.me/prog_stuff/1052">Для вас мы нашли книгу, которая сделает из вас крутого Java-разработчика.</a></li><li>А если хотите что-то более популярное, то и это у нас есть.<br /><a href="https://t.me/devs_books/951">Держите книгу по криптографии и взлому шифров на Python.</a></li></ul><h2>GameDev</h2><ul><li>Зачем нужен DLSS в играх и как он работает?<br /><a href="https://t.me/neuro_channel/723">Рассказали тут.</a></li><li>Хотите стать повелителем погоды?<br /><a href="https://t.me/make_game/838">Тогда посмотрите, как создаются погодные механики в играх.</a></li><li>Как увеличить геймплей игры?<br /><a href="https://t.me/make_game/836">Для этого нужен простой…</a></li></ul><h2>Мобильная разработка</h2><ul><li>Да кто такой этот ваш Android-разработчик?<br /><a href="https://t.me/mobi_dev/2101">Рассказали о типичных задачах разработчика под Android.</a></li><li>Никогда не поздно поменять свою жизнь.<br /><a href="https://t.me/mobi_dev/2098">Рауль Феррера рассказал, как стал iOS-разработчиком в 40 лет и даже написал собственную книгу.</a></li><li>Упрощаем авторизацию в приложении.<br /><a href="https://t.me/mobi_dev/2094">Посмотрите, как добавить Google Sign-in в Android-приложение.</a></li></ul><h2>Нейросети</h2><ul><li>Энтузиасты приближают восстание машин.<br /><a href="https://tproger.ru/articles/entuziasty-zapustili-nejroset-chaosgpt-na-osnove-gpt-4-kotoraya-dolzhna-unichtozhit-chelovechestvo/">ChaosGPT — нейросеть на основе GPT-4, которая учится «уничтожать человечество».</a></li><li>Много нейросетей больших и разных.<br /><a href="https://t.me/tproger/10586">Собрали шпаргалки по нейросетям в одном месте.</a></li><li>Создайте свою образовательную платформу с помощью OpenAI, ChatGPT и Django.<br /><a href="https://t.me/zen_of_python/2310">Оставили инструкцию для вас тут.</a></li><li>Сделайте своего GPT-бота в Telegram.<br /><a href="https://t.me/zen_of_python/2314">Простой гайд уже ждёт вас.</a></li><li>Нужно больше информации о ChatGPT богу ChatGPT!<br /><a href="https://tproger.ru/articles/chto-takoe-yazykovye-modeli-i-kak-rabotaet-chatgpt/">Для начала узнайте, как, собственно, работает эта нейросеть.</a></li></ul><h2>Soft skills</h2><ul><li>Третьи сутки без сна, а к дедлайну всё равно не успеваете?<br /><a href="https://t.me/soft_skillz/415">Возможно, вам стоит заняться собственным тайм-менеджментом.</a></li><li>Время просчитали правильно, но всё равно не успели? Тогда проблема в откладывании дел. <br /><a href="https://t.me/soft_skillz/413">Узнайте, как перестать откладывать дела на потом и научиться работать как машина.</a></li><li>Каждого третьего россиянина бесят коллеги по работе.<br /><a href="https://tproger.ru/articles/kollegi-besyat-tret-rossiyan/">А вот почему — узнаете в этой статистике.</a></li></ul><h2>Немного юмора</h2><ul><li>Танцуем и печатаем.<br /><a href="https://t.me/tproger/10583">Попробуйте сделать жестовую клавиатуру с OpenCV и MediaPipe для всего тела.</a></li><li>Проводите демо для заказчика правильно.<br /><a href="https://t.me/ithumor/9306">Видеоинструкция уже ждёт вас. </a></li><li>Вы читаете пользовательские соглашения?<br /><a href="https://t.me/ithumor/9292">А стоило бы.</a></li><li>И снова о важности чтения документации.<br /><a href="https://t.me/ithumor/9308">Хотя…</a></li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Как не допустить свалки в Django-проекте: MTV, services.py, новые приложения</title>
      <link>https://tproger.ru/articles/kak-ne-dopustit-svalki-v-django-proekte-mtv-services-py-novye-prilozheniya-239596</link>
      <comments>https://tproger.ru/articles/kak-ne-dopustit-svalki-v-django-proekte-mtv-services-py-novye-prilozheniya-239596?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Илья Осипов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-ne-dopustit-svalki-v-django-proekte-mtv-services-py-novye-prilozheniya-239596</guid>
      <description><![CDATA[<p>В этом материале мы обсудим, как писать чистый код, и какие концепции и типовые ошибки превращают утончённые проекты в заросли и свалки.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-ne-dopustit-svalki-v-django-proekte-mtv-services-py-novye-prilozheniya-239596">Как не допустить свалки в Django-проекте: MTV, services.py, новые приложения</a>»</p>]]></description>
      <category><![CDATA[Архитектура ПО]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Кодстайл]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 13 Apr 2023 13:31:38 GMT</pubDate>
      <content:encoded><![CDATA[<p>Привет! Меня зовут Илья Осипов, я методист курса программирования на Python «Девман» и больше пяти лет пишу код на этом языке. В этом материале мы обсудим концепции и типовые ошибки, которые превращают утончённые и «правильные» проекты в заросли и свалки.</p><h2>Когда вскрывается проблема</h2><p>Представьте, вы пишете проект на Django в команде из пяти человек. На старте все замотивированы «сделать хорошо», ведь это шанс сделать проект «идеальным» с самого начала. Но проходит год или два, проект обрастает парой десятков тысяч строк кода. Разрабатывать становится всё сложнее: файлы ломятся от кода, навигироваться по проекту без продвинутых инструментов из IDE просто невозможно.</p><p>В этот момент разработчики обычно говорят, что причина возрастающей сложности — рост проекта. Или грешат на «коллег-говнокодеров» / «плохой фреймворк». Хотя с ростом проекта навигация действительно естественным образом усложняется, чаще всего виноваты отнюдь не фреймворки или количество строчек, а плохие решения.</p><p><b>Основная цель фреймворка</b> — задать «фреймы», то есть «границы», в рамках которых будет работать программист. Для этого внутри Django предусмотрено множество механизмов, и многие из них описаны в документации. Некоторые — прямо в исходниках фреймворка. А какие-то детали разработчики Django не предусмотрели, и программистам приходится придумывать новые границы самостоятельно.</p><p>Зачем нужны эти границы? Разве без них не лучше?</p><p>Ответ на этот вопрос сходу поймёт любой пользователь фреймворка: не лучше. Границы пусть и создают дополнительные «препятствия», но взамен они обеспечивают понятное пространство для работы: сюда писать такой код, а сюда – вот такой, и всё будет работать. Не нужно каждый раз «изобретать велосипед» и пытаться придумать, как будет работать ваш сайт. За вас уже подумали и оставили «места для дописывания кода». Вот эти места для вашего кода — это и есть <b>фреймы</b>.</p><h2>Архитектура MTV</h2><p>Самый «высокоуровневый» фрейм в Django — это архитектурное разделение логики на Model, View и Template.</p><p><i>Да, архитектура Django называется именно MTV, а не MVT. Разработчики используют в документации именно такую аббревиатуру. По сути, архитектура почти полностью повторяет другой подход — MVC, Model-View-Controller (Модель-Представление-Контроллер).</i></p><p>Суть такая:</p><ul><li>в Model хранят данные сервиса;</li><li>View отвечает за отображение данных пользователю;</li><li>Controller отвечает за то, чтобы сообщать Model, когда пора менять данные.</li></ul><p>В Django же отошли от этой концепции и использовали архитектуру Model, View и Template. Сами разработчики Django <a href="https://docs.djangoproject.com/en/4.1/faq/general/#django-appears-to-be-a-mvc-framework-but-you-call-the-controller-the-view-and-the-view-the-template-how-come-you-don-t-use-the-standard-names">пишут</a>, что не видят никакого конфликта с MVC. Model по-прежнему отвечает за хранение данных и работу с ними. View — за «отображение» данных. Просто этот слой они разделили на два: View отвечает за то, чтобы решить, какие данные отображать, а Template — как отображать. Куда делся Controller из MVC? В аббревиатуре MTV он пропал.</p><p>Разработчики считают, что это сам фреймворк.</p><p>Возможно, вы хотите спросить, зачем я об этом рассказываю. Разве возможно накосячить на этом уровне? Вообще-то, да.</p><h2>Бизнес-логика, или слой Services</h2><p>Многие разработчики пытаются переизобрести MTV и добавляют в Django дополнительный слой: Services. Вы найдёте файл serivces.py во многих туториалах и видео по Django.</p><p>Необходимость добавления этого слоя обычно объясняют так:</p><ul><li>В моём проекте появились функции, которые не укладываются ни в Model, ни во View;</li><li>Я хочу сделать «бизнес-логику» реюзабельной между приложениями, и, чтобы не импортировать функции из одного View в другой, храню их отдельно.</li></ul><p>Эти проблемы действительно существуют. Зачастую в проекте появляются вспомогательные функции, которые не принадлежат стандартным сущностям Django, вроде Model или View.</p><p>Но решение складывать весь этот код в файл services.py, на мой взгляд, плохое. Вот почему:</p><p><b>Слой Services слишком широкий, это плохая рамка.</b> При определении рамок важно не определить, какой код можно класть в этот файл, а решить, какой код в этот файл класть нельзя. Для сравнения, Model хорошо справляется с этой задачей: если код не относится к работе с БД, то ему не место в файле models.py. А в services.py часто кладут всё, что не влезло в остальные.</p><p><b>Файл становится свалкой.</b> Это ожидаемое следствие плохой рамки. Я часто интересуюсь у друзей и у кандидатов на собеседованиях, есть ли в их текущих или прошлых проектах такая проблема: в services.py более 2 тысяч строк кода и по нему тяжело навигироваться. Если в проекте более 10 тысяч строчек кода, разработчики почти единогласно говорят, что файл превращается в свалку.</p><p><b>Файл размывает слой View.</b> Есть мнение, что в файл services.py нужно выносить бизнес-логику. Термин «бизнес-логика» кажется конкретным — это всё, что определяется правилами бизнеса. Но на поверку он размыт куда сильнее, чем кажется. Разработчики, глядя на функцию, иногда не могут сказать, бизнес-логика это или нет.</p><h3>Куда девать общий код?</h3><p>Альтернативное решение — оставить фреймворк в покое и не добавлять в него новый слой. Если появилась новая логика, то создать файл с говорящим названием и положить код в него. Если логики вынести нужно много — создайте несколько файлов. Искать нужную функциональность проще в одном мегафайле на тысячу строк или в пяти небольших по двести строк? Так будет куда понятнее, где, например, искать функцию, которая форматирует дату или преобразует цену товара:</p><figure><img src="https://media.tproger.ru/uploads/2023/04/61bf9f7a-76ed-4de0-b53b-b63c82ccc89f.png" alt="" /></figure><h2>Писать запросы в слое View — это нормально</h2><p>Я так и не разобрался, откуда взялся миф о том, что во View нельзя писать запросы в БД, и в чём аргументация его сторонников. Это правило просто откуда-то «взялось», и теперь в него верят как в аксиому.</p><p>Тем не менее в документации Django для слоя View очень <a href="https://docs.djangoproject.com/en/4.1/topics/http/views/">простое определение</a>:</p><blockquote>The view itself contains whatever arbitrary logic is necessary to return response.</blockquote><p>Соответственно, в этом слое можно делать ORM-запросы, если это нужно для ответа. Не обязательно пытаться «прятать» этот код куда-то ещё.</p><p>Часть запросов будут нести бизнес-смысл, то есть они станут частью бизнес-логики. Иногда это будет даже не один запрос в БД, а несколько, или даже пара строк кода между ними.</p><p>По принципу MVC «Fat models, skinny controllers, simple views», большую часть такого кода стоит стараться класть в слой Model. Один из самых недооценённых, на мой взгляд, способов — <a href="https://docs.djangoproject.com/en/4.1/topics/db/managers/">переопределение QuerySet</a>. Этот способ позволяет взять здоровый запрос на 10 вызовов методов ORM и дать ему простое, бизнесовое название.</p><p>Со слоем Services получается «Skinny Models, Skinny Controllers, Fat Services». На мой взгляд, это очевидное отхождение от принципов, которые изначально закладывались в фреймворк.</p><h2>Приложения (app)</h2><p>Сейчас эпоха популярности микросервисов над монолитами. Из-за этого сама архитектура Django-монолита стигматезируется, некоторые мои знакомые даже не пытаются пилить Django-монолиты на приложения. Но ведь «монолит» не равно «свалка»! За ним всё ещё стоит ухаживать.</p><p><b>Приложения </b>— это следующий уровень абстракции в фреймворке, который тоже отвечает за разделение кода на кучки, но уже по другому признаку.</p><p>Можно представить, что MTV разделяет код на «красное», «синее» и «зелёное», а приложения — это разделение на «круглое», «квадратное» и «треугольное». Важное правило в делении логики на приложения — <a href="https://enterprisecraftsmanship.com/posts/cohesion-coupling-difference/">Cohesion and Coupling</a>. Если коротко, это о связности между приложениями: нужно добиваться состояния, когда у вас мало связей между приложениями и много внутри них.</p><p>Вот к этому нужно стремиться:</p><figure><img src="https://media.tproger.ru/uploads/2023/04/b8a91d86-4da4-4fb8-8f8e-bbbc99f3a98f-autoconverted.jpeg" alt="" /><figcaption>Картинку взял из всё той же статьи</figcaption></figure><p>Между «разделёнными группами» связей мало, почти все связи спрятались внутри групп. Кружочки одного цвета — это части кодовой базы, которые сильно связаны друг с другом.</p><p>А вот такого стоит избегать:</p><figure><img src="https://media.tproger.ru/uploads/2023/04/a1b8ddf4-03f8-4ef5-af1e-1b917466dfe2-autoconverted.jpeg" alt="" /></figure><p>В первом случае связи хороши, но связанный код разбросан между «приложениями». Придётся часто заходить в разные приложения, чтобы внести правку в логику «жёлтых кусочков кода», например.</p><p>Справа совсем всё плохо: код разделён на такие маленькие группы, что каждый кусочек кода сам по себе стал «группой». Это называется ‘Destructive decoupling’.</p><p>Чтобы не попасть в одну из ситуаций выше, логику приложения нужно <b>группировать по юзкейсам, а не по сущностям</b>. Часто эти два способа дают одинаковые результаты, но так происходит не всегда.</p><p>Когда вы группируете логику в приложения, в первую очередь смотрите, какая логика постоянно совместно используется. Переводя в идею про Cohesion and Coupling — какие из кружочков связаны большим количеством стрелочек.</p><p>Если смотреть на разделение по приложениям так, то, если потянуть за одну функцию, за ней подтянутся и другие, сильно с ней связанные. Иногда часть связей этих функций будет неожиданной, хотя будет казаться, что складывать их вместе «нелогично».</p><p>В такой ситуации советую задуматься: а почему они оказались связанными? Может, вы неправильно выбрали название для приложения и оно должно включать в себя больше.</p><p><b>Не стесняйтесь создавать новые приложения.</b></p><p>Что делать, если одна модель не помещается ни в одно из приложений? Создайте для неё отдельное!</p><p><i>А что, так можно? В целом ПРИЛОЖЕНИИ будет всего одна жалкая моделька?!</i></p><p><b>Да, можно. Даже нужно.</b></p><p>Лучше создавать приложение сразу, как только стало заметно, что оно понадобится. Ведь когда у вас наберётся много логики, разбросанной по разным приложениям, будет уже поздно.</p><p>Процесс выделения этой логики в новое приложение будет болезненным, и, делая это, вы будете задаваться вопросом: «какой м**ак раскидал эту логику по приложениям?».</p><p>Очевидно, слишком увлекаться тоже не стоит. Иначе столкнётесь с Destructive decoupling. Но и бояться создания приложений не нужно.</p><h2>Файлы</h2><p>Ещё один слой разделения логики по фреймворкам — это файл. Мы касались темы файлов выше, давайте резюмируем уже сказанное:</p><ol><li>Свалка в файлах вредит навигации по проекту.</li><li>Cohesion and Coupling поможет разложить логику по файлам.</li><li>Не стесняйтесь создавать файлы, даже если кода внутри будет мало. Это поможет потом не страдать, выкорчёвывая функции из кода.</li><li>Название файла должно задавать чёткую однозначную границу, говорить о том, какому коду здесь не рады. Иначе свалки не миновать.</li></ol><p>На третьей мысли хочется остановиться подробнее. Страх создания файлов зачастую иррационален. У разработчиков редко бывает страх создания новой функции: если это нужно, вы без проблем вынесете кусок логики в новый, небольшой «контейнер» — функцию.</p><p>С файлами аналогично, это тоже контейнер для кода. Просто функции хранят в себе строчки кода, а файлы хранят в себе функции.</p><p>У ситуации «переборщили с количеством файлов» есть надёжный симптом — читая интересующий код, вы не задерживаетесь в одном файле больше, чем на 30 секунд. Всё время приходится двигаться по файлам туда-сюда. А это и есть нарушение принципа Cohesion and Coupling.</p><h2>Итоги</h2><p>Если во время чтения статьи вы успели потерять основные тезисы, то вот небольшой конспект. ?</p><ol><li>Services – не часть MTV;</li><li>Плохое название файла приведёт к свалке;</li><li>Можно писать запросы в слое View, не бойтесь этой практики;</li><li>Монолит – не повод сваливать всё в кучу;</li><li>Группировать по юзкейсам лучше, чем по сущностям;</li><li>Не стесняйтесь создавать новые файлы и приложения, даже если кода в них мало;</li><li>Разложить логику по файлам поможет Cohesion and Coupling.</li></ol>]]></content:encoded>
    </item>
    <item>
      <title>Дайджест Tproger: волшебство CSS-анимаций и GPT внутри гуманоидного робота</title>
      <link>https://tproger.ru/articles/dajdzhest-tproger-volwebstvo-css-animacij-chatgpt-vnutri-gumanoidnogo-robota-i-bitkoin-vnutri-macos</link>
      <comments>https://tproger.ru/articles/dajdzhest-tproger-volwebstvo-css-animacij-chatgpt-vnutri-gumanoidnogo-robota-i-bitkoin-vnutri-macos?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/dajdzhest-tproger-volwebstvo-css-animacij-chatgpt-vnutri-gumanoidnogo-robota-i-bitkoin-vnutri-macos</guid>
      <description><![CDATA[<p>Дайджест Tproger ⭐ Держите выжимку из самых полезных и интересных материалов в IT-сфере за последние дни.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/dajdzhest-tproger-volwebstvo-css-animacij-chatgpt-vnutri-gumanoidnogo-robota-i-bitkoin-vnutri-macos">Дайджест Tproger: волшебство CSS-анимаций и GPT внутри гуманоидного робота</a>»</p>]]></description>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Разработка игр]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Нейронные сети]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Советы]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Soft Skills]]></category>
      <category><![CDATA[Юмор]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 07 Apr 2023 09:42:34 GMT</pubDate>
      <content:encoded><![CDATA[<p>А вот и свежий дайджест Tproger, в котором вы обязательно найдёте полезные материалы.</p><h2>Веб-разработка</h2><ul><li>В чём преимущества TypeScript перед JavaScript? Как минимум в декораторах!<br /><a href="https://t.me/tproger_web/3649">Показали всю мощь декораторов на живых примерах</a>.</li></ul><ul><li>Создавать крутые анимации можно с помощью простого CSS.<br /><a href="https://t.me/tproger_web/3638">Юлия Миоцен рассказала о 10 свойствах, которые прокачают ваш скилл</a></li></ul><ul><li>Хотите лучше понимать структуру своего кода или объяснить её несведущему?<br /><a href="https://t.me/prog_point/2168">Эта библиотека для визиуализации JS-кода вам точно пригодится.</a></li></ul><h2>Python и Django</h2><ul><li>А хорошо ли вы знаете Python?<br /><a href="https://tproger.ru/articles/101-vopros-python-razrabotchiku/">Проверьте себя, ответив правильно на 101 вопрос, ответы на которые должен знать каждый питонист</a>.</li></ul><ul><li>Копейка рубль бережёт, а контроль трат помогает следить за бюджетом.<br /><a href="https://t.me/zen_of_python/2303">Рассказали, как анализировать расходы с помощью фотографий чеков и Python</a>.</li><li>Хотите освоить Django?<br /><a href="https://t.me/zen_of_python/2307">Этот видеокурс поможет вам</a>.</li></ul><h2>Точка входа: полезности для начинающих программистов</h2><ul><li>Получаем зарубежное образование, не вставая с дивана.<br /><a href="https://t.me/tproger/10555">Бесплатный курс по Java от Стэнфордского университета вам в этом поможет.</a></li></ul><ul><li>Без практики очень сложно усвоить теорию.<br /><a href="https://t.me/prog_point/2171">Нашли для вас подборку ресурсов, где можно попрактиковаться в решении задач.</a></li></ul><h2>Полезные инструменты, книги и лайфхаки для разработчиков</h2><ul><li>Не Copliot’ом единым.<br /><a href="https://t.me/prog_tools/1003">Рассказываем про TabNine — интеллектуальный автодополнитель кода на базе ИИ.</a></li></ul><ul><li>Хотите огромную библиотеку полезных ресурсов для дизайнеров и разработчиков?<br /><a href="https://t.me/prog_tools/1008">Так вот же она!</a></li><li>Рассказали про книгу, которая поможет разобраться в собственном мышлении и научит быть максимально продуктивным.<br /><a href="https://t.me/prog_stuff/1048">Но только если хотите стать джедаем!</a></li><li>А следующий материал специально для шарпистов.<br /><a href="https://t.me/prog_stuff/1045">Если хотите отточить свои навыки работы с C#, то забирайте этот практикум.</a></li></ul><h2>GameDev</h2><ul><li>Если вы считали, что кубик Рубика уже давно устарел и не может конкурировать с видеоиграми, то вы ошибаетесь.<br /><a href="https://t.me/make_game/831">Реддитор поделился интересным «рогаликом», где кубик Рубика является чуть ли не основной механикой игры.</a></li></ul><ul><li>Хотите узнать, как удержать игрока в игре и привлечь его обратно?<br /><a href="https://t.me/make_game/832">Способов много. И некоторыми мы уже поделились.</a></li></ul><h2>Мобильная разработка</h2><ul><li>Теперь вы точно не заблудитесь.<br /><a href="https://t.me/prog_point/2165">Держите дорожную карту для Android-разработчика на 2023.</a></li></ul><ul><li>Чем придумывать велосипед, лучше взять проверенное решение.<br /><a href="https://t.me/mobi_dev/2076">Вот 6 полезных шаблонов проектирования, которые пригодятся каждому Android-разработчику.</a></li></ul><h2>Нейросети</h2><ul><li>ChatGPT теперь и дизайн за вас сверстает.<br /><a href="https://t.me/your_tech/8597">Энтузиасты смогли интегрировать ИИ прямо в Figma</a>.</li></ul><ul><li>Без чего не обойдётся ни одна нейросеть — это вычислительные мощности. <br /><a href="https://t.me/neuro_channel/709">Рассказали, какая видеокарта подходит для этого лучше всего.</a></li></ul><ul><li>Изучаете Flutter?<br /><a href="https://t.me/mobi_dev/2078">Тогда держите целых 30 различных проектов и библиотек для Flutter.</a></li></ul><ul><li>Что будет, если объединить GPT с гуманоидным роботом? Нет, не сюжет фантастического фильма.<br /><a href="https://t.me/neuro_channel/710">А вполне реального видео.</a></li><li>Хотите узнать, кого вскоре могут заменить нейросети?<br /><a href="https://tproger.ru/articles/kak-rabotayut-nejroseti-i-v-kakih-oblastyah-oni-skoro-zamenyat-lyudej-239134/">Тогда скорее сюда, заодно узнаете, как они работают</a>.</li></ul><h2>Soft skills</h2><ul><li>Чтобы стать крутым айтишником недостаточно только разбираться в своих обязанностях.<br /><a href="https://tproger.ru/articles/10-soft-skills-for-it-specialist/">Рассказали, какие 10 софт-скиллов помогут построить успешную карьеру и сохранить нервы</a>.</li></ul><ul><li>Хотите работать, как машина, не откладывая дела на потом? Купите себе моторное масло.<br /><a href="https://t.me/soft_skillz/413">Либо посмотрите это видео, где предлагается неочевидный, но полезный способ повысить продуктивность.</a></li><li>Молчание до начала созвона сводит с ума?<br /><a href="https://tproger.ru/articles/top-9-veshhej-pered-mitom/">Эти способы помогут разрядить атмосферу, но, возможно, сведут с ума ваших коллег</a>.</li></ul><h2>Немного юмора</h2><ul><li>Кто вы: джун, миддл или сениор?<br /><a href="https://t.me/ithumor/9243">Эта картинка поможет вам разобраться.</a></li><li>Если хотите узнать, каким вы будете дедом.<br /><a href="https://t.me/tproger/10545">Типичный разговор с внуком через несколько лет.</a></li><li>Работаете с криминальными элементами?<br /><a href="https://t.me/ithumor/9251">Тогда попробуйте этот способ распределения задач. </a></li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Дайджест Python #6: как заказать столик в ресторане через ChatGPT и почему лень — не порок</title>
      <link>https://tproger.ru/articles/dajdzhest-pitona-4-aprelya</link>
      <comments>https://tproger.ru/articles/dajdzhest-pitona-4-aprelya?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Рафаил Агазода]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/dajdzhest-pitona-4-aprelya</guid>
      <description><![CDATA[<p>Собрали дайджест из статей про Python с 16 по 31 марта. Узнайте, как инвестировать при помощи Big Data и как создать голосовой помощник.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/dajdzhest-pitona-4-aprelya">Дайджест Python #6: как заказать столик в ресторане через ChatGPT и почему лень — не порок</a>»</p>]]></description>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Big Data]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Нейронные сети]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Data Science]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 04 Apr 2023 08:14:46 GMT</pubDate>
      <content:encoded><![CDATA[<p>Собрали дайджест из лучших материалов по Python с 16 по 31 марта, которые только смогли найти. Дайджест включает статьи и видео на русском и английском языках.</p><p>Узнайте, как заказать столик в ресторане при помощи ChatGPT, как инвестировать эффективнее при помощи Big Data, как создать свой голосовой помощник и почему лень — это не порок.</p><h2>Big Data / Data Science</h2><ul><li><a href="https://habr.com/ru/company/skillfactory/blog/725972/">msgspec: быстрый и экономичный парсинг JSON на Python</a></li><li><a href="https://habr.com/ru/company/tochka/blog/725722/">Консистентность в конкуретной среде: как не захлебнуться в потоках данных</a></li><li><a href="https://habr.com/ru/post/723542/">Почему Data Science не для вас?</a></li><li><a href="https://habr.com/ru/company/otkritie/blog/722882/">Дублирующий скрипт: как с его помощью мы ускорили бизнес-процесс с двух рабочих дней до семи минут</a></li><li><a href="https://habr.com/ru/post/721170/">Синтетические данные для машинного обучения: их природа, типы и способы генерации</a></li><li>EN <a href="https://dev.to/documatic/graph-databases-vs-relational-databases-what-and-why-5d6g">Graph Databases vs Relational Databases: What and why?</a></li><li>EN <a href="https://itnext.io/the-ultimate-guide-to-pandas-read-csv-function-5377874e27d5">The ultimate guide to Pandas’ read_csv() function</a></li><li>EN <a href="https://www.reddit.com/r/Python/comments/11lyyzb/i_made_a_finance_database_with_over_300000/">I made a Finance Database with over 300.000 tickers to make Investment Decisions easier</a></li><li>EN <a href="https://medium.com/geekculture/so-you-recommended-a-python-time-series-package-now-what-94e7e3821ad5">So, You Recommended a Python Time-Series Package … Now What?</a></li><li>EN <a href="https://www.reddit.com/r/Python/comments/12b7w3y/everything_you_need_to_know_about_pandas_200/">Everything you need to know about pandas 2.0.0!</a></li></ul><h2>AI и ML</h2><ul><li><a href="https://habr.com/ru/post/726254/">Основы генеративно-состязательных сетей</a></li><li><a href="https://habr.com/ru/post/726244/">Учим английский с chatGPT</a></li><li><a href="https://habr.com/ru/company/otkritie/blog/725928/">ML-пайплайн классических банковских моделей классификации</a></li><li><a href="https://habr.com/ru/post/725704/">Как подружить Алису с ChatGPT</a></li><li><a href="https://habr.com/ru/post/725668/">Как создать свою собственную нейронную сеть с нуля на Python</a></li><li><a href="https://habr.com/ru/post/725066/">Ирина, голосовой помощник — теперь и со вкусом GPT-3</a></li><li><a href="https://habr.com/ru/post/723942/">Распознавание подачи в волейболе с помощью машинного обучения</a></li><li>EN <a href="https://dev.to/github/a-beginners-guide-to-prompt-engineering-with-github-copilot-3ibp">A Beginner’s Guide to Prompt Engineering with GitHub Copilot</a></li><li>EN <a href="https://dev.to/disukharev/opencommit-gpt-cli-to-auto-generate-impressive-commits-in-1-second-46dh">OpenCommit: GPT generates impressive commits in 1 second 🤯🔫 (open-source, 50k views)</a></li><li>EN <a href="https://dev.to/wesen/llms-will-fundamentally-change-software-engineering-3oj8">LLMs will fundamentally change software engineering</a></li><li>EN <a href="https://www.reddit.com/r/memes/comments/125qjqu/using_gpt4_and_dalle2_i_made_a_python_script_that/">Using GPT-4 and Dalle2, I made a Python script that auto-generates memes without any input…</a></li><li>EN <a href="https://www.reddit.com/r/Python/comments/123aiqk/introducing_gptty_v021_a_powerful_cli_wrapper_for/">Introducing gptty v0.2.1 – A Powerful CLI Wrapper for ChatGPT with Context Preservation &amp; Query Support, Now on PyPI!</a></li><li>EN <a href="https://www.reddit.com/r/Python/comments/11wb2vn/freetouse_gpt3_powered_commandline_shell_no/">Free-to-use GPT-3 powered command-line shell (no API-key required)</a></li></ul><h2>Веб / Django / Flask</h2><ul><li><a href="https://habr.com/ru/post/724852/">Декоратор cached_property</a></li><li><a href="https://habr.com/ru/post/723322/">Django DRF Sign-in with Apple</a></li><li><a href="https://habr.com/ru/post/723554/">Может ли chatGPT забронировать столик в ресторане через WhatsApp?</a></li><li>EN <a href="https://dev.to/onecuriousmindset/how-to-create-a-simple-web-app-with-python-and-flask-in-8-easy-steps-1kfo">How to Create a Simple Web App with Python and Flask in 8 Easy Steps</a></li><li>EN <a href="https://dev.to/pavanbelagatti/learn-how-to-test-flask-applications-with-pytest-o25">Learn How to Test Flask Applications with Pytest</a></li><li>EN <a href="https://dev.to/sridharcr/design-architecture-for-large-file-downloads-1ojn">Design architecture for large file downloads</a></li><li>EN <a href="https://dev.to/pavanbelagatti/learn-how-to-create-a-ci-pipeline-for-your-django-application-283d">Learn How to Create a CI Pipeline for Your Django Application</a></li><li>EN <a href="https://medium.com/@amaanabidi1234/implementing-multiple-user-types-in-django-afa7e637072e">Implementing Multiple User Types in Django</a></li><li>EN <a href="https://medium.com/@srinivasaravind5/turbocharge-your-django-application-mastering-database-partitioning-for-high-traffic-optimization-1c24031d34b8">Turbocharge Your Django Application: Mastering Database Partitioning for High Traffic Optimization</a></li></ul><h2>Скрипты, приложения и боты</h2><ul><li><a href="https://habr.com/ru/post/725930/">Ультимативный Roadmap для Python-разработчика в 2023 году + источники знаний</a></li><li><a href="https://habr.com/ru/post/725526/">Пишем простого бота-администратора для Telegram на Python. Тестируем на жене</a></li><li><a href="https://habr.com/ru/post/725406/">Как я чистила текст от ударений в словах при помощи Python</a></li><li><a href="https://habr.com/ru/post/725186/">7 уровней построения интерфейсов командной строки на Python</a></li><li><a href="https://habr.com/ru/post/673440/">Ломаем текстовую капчу на примере VK или брутфорсинг до сих пор актуален</a></li><li><a href="https://habr.com/ru/company/selectel/blog/724278/">Решаем задачу по взаимодействию микросервисов на Python тремя способами</a></li><li>EN <a href="https://dev.to/ringabout/contribute-to-the-python-like-nim-language-36b2">Contribute to the Python-like Nim language</a></li><li>EN <a href="https://www.reddit.com/r/Python/comments/11ts1qq/why_use_classes/">Why use classes?</a></li><li>EN <a href="https://www.reddit.com/r/Python/comments/126gnp4/nanobind_is_a_small_binding_library_that_exposes/">Nanobind is a small binding library that exposes C++ types in Python and vice versa</a></li><li>EN <a href="https://www.reddit.com/r/Python/comments/11zjjzy/arguments_against_separating_test_from_src_in_a/">Arguments against separating `test` from `src` in a python package?</a></li></ul><h2>Развлекательный контент</h2><ul><li><a href="https://habr.com/ru/company/otus/blog/723306/">История о том, как прочитать 120 тысяч анекдотов и не рассмеяться раньше времени</a></li><li><a href="https://habr.com/ru/company/timeweb/blog/723600/">Байки погромиста. Если кто-то скажет, что программирование — это скучно</a></li><li>EN <a href="https://dev.to/jmfayard/laziness-impatience-and-hubris-1ea9">I am a lazy developer</a></li><li>Видео <a href="https://www.youtube.com/watch?v=feg3DYywNys&amp;ab_channel=MoscowPython">Moscow Python Meetup №81. Вступление.</a></li><li>Видео <a href="https://www.youtube.com/watch?v=nApYYXYL9qA&amp;ab_channel=MoscowPython">Moscow Python Meetup №81. Николай Марков. Контейнерные змеи</a></li><li>Видео <a href="https://www.youtube.com/watch?v=cUGyMzWQcGM&amp;ab_channel=MoscowPython">Moscow Python Meetup №81. Евгений Соколов. Лучший язык — это… или Пайтон против Суслика</a></li><li>Видео <a href="https://www.youtube.com/watch?v=MtWXwMCAApY&amp;ab_channel=MoscowPython">Moscow Python Meetup №80. Максим Безруков. Кто такой syslog, зачем читать RFC-* и причём тут Django</a></li></ul><p>Нашли что-нибудь полезное и интересное для себя? Расскажите, какие материалы понравились вам больше всего, а каких статей не хватило, чтобы следующий дайджест получился ещё лучше.</p><p>Если дайджест вам понравился, посмотрите две предыдущие подборки:</p><p>А ещё присылайте в комментарии статьи и видео, которые ускользнули от нашего взгляда и не попали в дайджест. Поделитесь полезными материалами с другими читателями! 😉</p>]]></content:encoded>
    </item>
    <item>
      <title>Дайджест Типичного программиста: GPT-4, сервер на смартфоне и пик Балмера</title>
      <link>https://tproger.ru/articles/dajdzhest-tipichnogo-programmista</link>
      <comments>https://tproger.ru/articles/dajdzhest-tipichnogo-programmista?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Павел Федоренко]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/dajdzhest-tipichnogo-programmista</guid>
      <description><![CDATA[<p>Дайджест Типичного программиста ⭐ Держите выжимку из самых полезных и интересных материалов в IT-сфере за последние дни. - 31 мар 2023</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/dajdzhest-tipichnogo-programmista">Дайджест Типичного программиста: GPT-4, сервер на смартфоне и пик Балмера</a>»</p>]]></description>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Разработка игр]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Нейронные сети]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Советы]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Soft Skills]]></category>
      <category><![CDATA[Юмор]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 31 Mar 2023 09:19:42 GMT</pubDate>
      <content:encoded><![CDATA[<p>Собрали для вас дайджест Tproger, где вы найдёте полезные материалы как для начинающих, так и для опытных разработчиков.</p><h2>Веб-разработка</h2><ul><li>Не всем нужны мощные сервера. Иногда для небольшого проекта достаточно смартфона.<br /><a href="https://t.me/tproger_web/3632">Рассказали, как запустить на Android-смартфоне веб-сервер</a>.</li></ul><ul><li>Не только Илон Маск с Neuralink думает о том, как соединить мозг и компьютер.<br /><a href="https://t.me/tproger_web/3631">Но энтузиасты пошли дальше и «соединили» мозг с ChatGPT с помощью JavaScript</a>.</li></ul><h2>Python и Django</h2><ul><li>Ищете полезные ресурсы по Python?<br /><a href="https://t.me/zen_of_python/2280">Делимся подборкой лучших ресурсов для изучения Python</a>.</li><li>Иногда плаваете в синтаксисе и забываете, за что отвечают те или иные функции?<br /><a href="https://t.me/tproger/10514">Держите большую обновляемую шпаргалку по Python</a>.</li><li>Используете Django?<br /><a href="https://t.me/django_prog/1117">Вот 6 важных советов, чтобы сделать ваше приложение безопасным</a>.</li></ul><h2>Точка входа: полезности для начинающих программистов</h2><ul><li>Держите карту.<br /><a href="https://t.me/prog_point/2152">Но не сокровищ, а изучения SQL</a>.</li><li>Куда идти в IT?<br /><a href="https://tproger.ru/articles/6-vostrebovannyh-it-specialnostej/">Рассказали про 6 востребованных IT-специальностей</a>.</li><li>Есть вопросы про IT, но не знаете, где спросить?<br /><a href="https://tproger.ru/articles/post-vzaimopomoshhi-sprawivajte-otvechajte/">Организовали пост взаимопомощи — спрашивайте и помогайте другим</a>.</li></ul><h2>Полезные инструменты, книги и лайфхаки для разработчиков</h2><ul><li>Хотели бы быстрее и легче отслеживать ошибки в коде?<br /><a href="https://t.me/prog_tools/987">Вот инструмент, который анализирует ваш код и находит проблемы, ошибки и дубликаты кода</a>.</li><li>Если вы делаете какую-то фичу, подумайте, а не сделал ли кто-то её за вас.<br /><a href="https://t.me/prog_tools/990">Швейцарский нож для веб-разработчиков, который содержит набор готовых решений</a>.</li><li>Терминал пугает начинающих пользователей. Но для опытных это незаменимый помощник.<br /><a href="https://t.me/prog_stuff/1036">Рассказали про гайд по самым полезным командам для работы в Windows, Linux и MacOS</a>.</li><li>Эта книга понравилась нашим читателям больше всего. <a href="https://t.me/devs_books/928">Рассказываем, почему стоит почитать «Прикладное программирование на C/C++»</a>.</li></ul><h2>Gamedev</h2><ul><li>ИИ теперь и игру на Unity за вас написать может.<br /><a href="https://t.me/make_game/825">Рассказали про ​AI ассистента для редактора Unity3D</a>.</li><li>А ещё — сгенерировать модели и код для Blender.<br /><a href="https://tproger.ru/articles/tepr-s-pomoshhyu-gpt-4-mozhno-sozdavat-3d-sceny-v-blender/">Показываем, как создавать 3D-сцены в Blender с помощью GPT-4</a>.</li><li>Наверняка вы играли в Тетрис?<br /><a href="https://tproger.ru/articles/vywel-vtoroj-trejler-filma-tetris-s-kommentariyami-alekseya-pazhitnova/">Игра настолько культовая, что на AppleTV+ вышел фильм «Тетрис» про советского программиста Алексея Пажитнова</a>.</li></ul><h2>Нейросети</h2><ul><li>Copilot от Microsoft станет ещё лучше!<br /><a href="https://t.me/neuro_channel/702">Рассказываем, что изменится в GitHub Copilot X</a>.</li><li>Илон Маск и Стив Возняк призывают остановить обучение ИИ хотя бы на полгода.<br /><a href="https://tproger.ru/articles/ilon-mask-i-stiv-voznyak-prizyvayut-ostanovit-obuchenie-ii-hotya-by-na-polgoda/">Забота о людях или конфликт бизнес-интересов</a>?</li><li>Энтузиаст встроил GPT-4 в Apple Watch.<br /><a href="https://t.me/tproger/10525">Показали, как это выглядит</a>.</li></ul><h2>Soft skills</h2><ul><li>Коллеги токсичат?<br /><a href="https://t.me/soft_skillz/411">Бережем психику и боремся с токсичностью коллег</a>.</li><li>Думаете, что вы плохой специалист?<br /><a href="https://tproger.ru/articles/na-linkedin-nawli-rezyume-cheloveka-ne-sozdannogo-dlya-raboty/">На LinkedIn нашли резюме человека, который абсолютно «не создан для работы»</a>.</li><li>Рекрутеры любят вгонять в стресс.<br /><a href="https://tproger.ru/articles/stressovoe-sobesedovanie-8-fishek-rekrutjorov/">Рассказываем про стрессовое интервью и 8 фишек рекрутёров</a>.</li></ul><h2>Немного юмора</h2><ul><li>Такие созвоны точно стоит пропустисть.<br /><a href="https://t.me/ithumor/9211">Как проходит типичный созвон</a>.</li><li>Слышали пор пик Балмера? Нет?<br /><a href="https://t.me/ithumor/9222">Тогда мы идём к вам</a>.</li><li>Бывало такое, что без мата коллеге не объяснишь все «претензии»?<br /><a href="https://t.me/tproger/10507">Наконец-то кто-то может перефразировать ваш крик души в доброжелательный текст без не нормативной лексики</a>.</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Дайджест Python #5: как сделать свой Copilot и работать с данными в Pandas</title>
      <link>https://tproger.ru/articles/dajdzhest-pitona-15-marta</link>
      <comments>https://tproger.ru/articles/dajdzhest-pitona-15-marta?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Рафаил Агазода]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/dajdzhest-pitona-15-marta</guid>
      <description><![CDATA[<p>Собрали дайджест из лучших статей и новостей о Python с 1 по 15 марта. Дайджест включает статьи и видео на русском и английском языках.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/dajdzhest-pitona-15-marta">Дайджест Python #5: как сделать свой Copilot и работать с данными в Pandas</a>»</p>]]></description>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Big Data]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Нейронные сети]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Data Science]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 15 Mar 2023 07:34:51 GMT</pubDate>
      <content:encoded><![CDATA[<p>Собрали дайджест из лучших материалов по Python с 1 по 15 марта, которые только смогли найти. Дайджест включает статьи и видео на русском и английском языках.</p><p>Узнайте, как написать свой аналог GitHub Copilot без знаний об искусственном интеллекте, как работать с данными и памятью в Pandas и как написать нейросеть, которая сможет самостоятельно распознавать объекты.</p><h2>Big Data / Data Science</h2><ul><li><a href="https://habr.com/ru/company/vk/blog/720652/">Data Mesh: что это такое и для чего он нужен инженерам</a></li><li><a href="https://habr.com/ru/company/otus/blog/720218/">9 баз данных NoSQL, актуальных на 2023 год</a></li><li><a href="https://habr.com/ru/company/oleg-bunin/blog/720076/">Как и зачем оценивают индекс зрелости ИИ</a></li><li><a href="https://habr.com/ru/company/first/blog/720058/">Большие данные мертвы. Это нужно принять</a></li><li><a href="https://habr.com/ru/post/719594/">Процесс ELT: основные компоненты, преимущества и инструменты создания</a></li><li><a href="https://habr.com/ru/company/skillfactory/blog/721838/">Отображение графа на Python с networkx</a></li><li><a href="https://habr.com/ru/article/721338/">Откуда есть пошла аналитика и что отличает DS, DA, BA и SA</a></li><li><a href="https://habr.com/ru/post/721154/">HalvingSearch: ускорение поиска по сетке (grid search). Библиотека sklearn</a></li><li><a href="https://habr.com/ru/company/skillfactory/blog/720530/">Не пытайтесь измерить использование памяти в Pandas</a></li><li><a href="https://habr.com/ru/post/719230/">Перевод предобученной модели Keras на матричные вычисления</a></li><li><a href="https://habr.com/ru/post/721162/">CutTheLog – когда он слишком большой</a></li><li>EN <a href="https://dev.to/memgraph/using-on-disk-storage-with-an-in-memory-graph-database-b7n">Using on Disk Storage With an In-Memory Graph Database </a></li><li>EN <a href="https://dev.to/silasmugambi/data-preprocessing-using-python-13c6">Data Preprocessing Using Python </a></li><li>EN <a href="https://towardsdatascience.com/3-quick-and-easy-ways-to-visualize-your-data-using-pandas-4cac57fb4c82">3 Quick and Easy Ways to Visualize Your Data Using Pandas</a></li><li>EN <a href="https://levelup.gitconnected.com/pygwalker-a-python-library-for-visualizing-data-with-pandas-ff5fc6b59f33">PyGWalker: A Python Library for Visualizing Pandas Dataframes</a></li><li>EN <a href="https://odsc.medium.com/create-audience-segments-using-k-means-clustering-in-python-209fd351192e">Create Audience Segments Using K-Means Clustering in Python</a></li><li>EN <a href="https://medium.com/@cyberdud3/mastering-missing-data-in-python-tips-for-data-scientists-8662d93945a1">Mastering Missing Data in Python: Tips for Data Scientists</a></li><li>EN <a href="https://medium.com/@chiragpawar4321/reading-and-processing-data-with-pandas-a-guide-to-using-read-csv-with-csv-files-af94ccea3f84">Reading and Processing Data with Pandas: A Guide to Using read_csv() with CSV Files</a></li></ul><h2>AI и ML</h2><ul><li><a href="https://habr.com/ru/post/721956/">Генерация 2D мира с помощью клеточного автомата на Python</a></li><li><a href="https://habr.com/ru/post/722170/">Цепочка методов в pandas. Прокачиваем свой код. Минигайд для интересующихся</a></li><li><a href="https://habr.com/ru/post/719912/">Просим бота написать бота</a></li><li><a href="https://habr.com/ru/post/720228/">Как без денег и знаний в AI повторил Copilot’а</a></li><li><a href="https://habr.com/ru/company/doubletapp/blog/720798/">Прости нас, Джон Коннор, или Как мы научили нейросеть точечно распознавать звуки выстрелов</a></li><li><a href="https://habr.com/ru/post/721414/">Пишем нейросеть для сегментации снимков со спутника</a></li><li><a href="https://habr.com/ru/post/721436/">Как я делал ChatGPT бота в Salebot и ничего не вышло</a></li><li><a href="https://habr.com/ru/post/721810/">Как создание бинарного классификатора открыло ящик Пандоры в стандартах владения английским языком</a></li><li><a href="https://habr.com/ru/post/721840/">AIGod — распознавание объектов</a></li><li><a href="https://habr.com/ru/post/721818/">Учим нейросеть принимать решения на основе уже известного опыта (на примере Шахмат и загруженного датасета)</a></li><li><a href="https://habr.com/ru/post/721940/">Классификация изображений в облачной системе Google Colab</a></li><li><a href="https://habr.com/ru/post/722250/">Визуализация архитектуры модели PyTorch</a></li><li>EN <a href="https://seandearnaley.medium.com/building-a-reddit-thread-summarizer-with-chatgpt-api-5b0dcd50b88e">Building a Reddit Thread Summarizer with ChatGPT API</a></li><li>EN <a href="https://betterprogramming.pub/exploring-the-intersection-of-ai-and-physics-the-role-of-chatgpt-in-code-generation-dacb6fd6f96b">Exploring the Intersection of AI and Physics: The Role of ChatGPT in Code Generation</a></li><li>EN <a href="https://medium.com/geekculture/a-simple-guide-to-chatgpt-api-with-python-c147985ae28">A Simple Guide to The (New) ChatGPT API with Python</a></li><li>EN <a href="https://towardsdatascience.com/write-readable-tests-for-your-machine-learning-models-with-behave-ec4a27b91490">Write Readable Tests for Your Machine Learning Models with Behave</a></li><li>EN <a href="https://medium.com/@rodolfo.antonio.sep/streamline-your-chatgpt-experience-with-gpt-scraper-eabf30643b44">Harness the Power of ChatGPT Without API Credits: Introducing GPT_scraper</a></li><li>EN <a href="https://dev.to/picovoice/end-to-end-speech-recognition-with-python-1ide">End-to-End Speech Recognition with Python </a></li><li>EN <a href="https://dev.to/feranmiodugbemi/how-to-create-an-ai-powered-chatbot-with-gradio-and-openais-gpt-35-2c8l">How to Create an AI-Powered Chatbot with Gradio and OpenAI’s GPT-3.5 </a></li></ul><h2>Веб / Django / Flask</h2><ul><li><a href="https://habr.com/ru/post/721260/">Python, Django и немного защиты кода</a></li><li><a href="https://habr.com/ru/company/selectel/blog/721022/">Как разработать канбан-доску на Django, DRF и Alpine.js</a></li><li><a href="https://habr.com/ru/post/720480/">Основы PyCharm</a></li><li><a href="https://habr.com/ru/company/agima/blog/720896/">Как избежать проблем при запуске MVP</a></li><li>EN <a href="https://dev.to/ebram96/checking-whether-a-celery-task-is-already-running-59f4">Checking Whether a Celery Task is Already Running </a></li><li>EN <a href="https://hotcerts.medium.com/developing-strong-seo-tools-using-python-4be39b6b60cc">Developing Strong SEO Tools Using Python</a></li><li>EN <a href="https://medium.com/@neonforge/chatgpt-api-python-web-app-tutorial-personalised-ai-chatbot-assistant-with-a-twist-ded4da970c1d">Tutorial: How to Create ChatGPT API Python Web App — Personalised AI Chatbot Assistant with a Twist…</a></li><li>EN <a href="https://medium.com/@bikrambiswas/setting-up-pre-commit-in-a-django-project-a-step-by-step-guide-963e6a0daebd">Setting up Pre-Commit in a Django Project: A Step-by-Step Guide</a></li><li>EN <a href="https://medium.com/@rajputgajanan50/django-query-optimization-9259d55f5795">Django Query Optimization</a></li><li>EN <a href="https://python.plainenglish.io/flask-vs-django-vs-streamlit-40da8afccb92">Flask vs Django vs Streamlit</a></li><li>EN <a href="https://medium.com/@iwobedotcom/from-javascript-to-python-and-django-how-to-master-a-new-language-and-framework-be76d8bf4c81">From JavaScript to Python and Django: How to Master a New Language and Framework</a></li><li>EN <a href="https://towardsdev.com/logging-in-django-fdcdb44061c4">Logging in Django</a></li></ul><h2>Скрипты, приложения и боты</h2><ul><li><a href="https://tproger.ru/articles/python-roadmap-2023-ljn8jvxfj/">Python для начинающих: дорожная карта в 2023 году</a></li><li><a href="https://habr.com/ru/post/720034/">Как я написал Telegram-бота для учёта подписок</a></li><li><a href="https://habr.com/ru/post/720130/">Бот для телеграмма, использующий Яндекс.Диск (Python)</a></li><li><a href="https://habr.com/ru/post/720600/">Отслеживаем изменения в doc и docx при помощи Python</a></li><li><a href="https://habr.com/ru/post/720610/">SimpleUI — фреймворк для быстрого создания бизнес приложений на Android</a></li><li><a href="https://habr.com/ru/company/piter/blog/720724/">Книга «Внутри CPYTHON: гид по интерпретатору Python»</a></li><li><a href="https://habr.com/ru/post/720862/">Парсинг данных через api vk и google sheets api на python</a></li><li><a href="https://habr.com/ru/post/718862/">Создаем библиотеку теории игр на питоне: как вообще это будет работать?</a></li><li><a href="https://habr.com/ru/company/productivity_inside/blog/721508/">Как я проводил обратную разработку таинственного UDP-трафика в гостиничном номере</a></li><li><a href="https://habr.com/ru/post/721516/">Пагинация в telegram-боте для чайников</a></li><li><a href="https://habr.com/ru/post/721622/">API Честный знак как получить ключ сессии</a></li><li>EN <a href="https://towardsdatascience.com/effectively-use-timeit-lprun-and-mprun-to-write-efficient-python-code-f06fb8457049">Effectively Use %timeit, %lprun, and %mprun to Write Efficient Python Code</a></li><li>EN <a href="https://sharifsuliman.medium.com/distributing-python-main-and-submodules-on-pypi-49140a6c31f5">Distributing Python Main and Submodules on PyPi</a></li><li>EN <a href="https://medium.com/@taradwyer17/12-python-scripts-for-optimising-your-code-development-310d4a0915ca">12 Python Scripts for Optimising Your Code Development</a></li><li>EN <a href="https://dev.to/sunishsurendrank/memory-management-in-python-4n3a">Memory management in Python </a></li><li>EN <a href="https://dev.to/yash_makan/most-exciting-python-features-from-37-to-311-l09">Most Exciting Python Features from 3.7 to 3.11 </a></li><li>EN <a href="https://dev.to/temporalio/python-sdk-the-release-2ji9">Python SDK: The Release </a></li><li>EN <a href="https://dev.to/cicirello/pyaction-4170-released-4ef8"> pyaction 4.17.0 Released </a></li><li>EN <a href="https://dev.to/shittu_olumide_/understanding-python-metaclasses-2782">Understanding Python Metaclasses </a></li><li>EN <a href="https://dev.to/zitrocode/introducing-inkwell-a-lightweight-easy-to-use-terminal-based-text-editor-gkd">Introducing Inkwell: A lightweight, easy-to-use terminal-based text editor </a></li></ul><h2>Развлекательный контент</h2><ul><li><a href="https://tproger.ru/quiz/kakaja-ty-it-princessa/">Какая ты IT-принцесса?</a></li><li><a href="https://habr.com/ru/post/720350/">Диалог между JS и Python если бы они были людьми</a></li><li>Видео <a href="https://www.youtube.com/watch?v=5dUJNYtQB8E">ПОРА РАЗОБРАТЬСЯ С ООП В PYTHON 3 | BALABOL IT PYTHON PODCAST </a></li><li>Аудио <a href="https://music.yandex.ru/album/6892837/track/112010663?dir=desc&amp;activeTab=about">Новости Python за февраль 2023</a></li><li>EN <a href="https://www.reddit.com/r/Python/comments/11ria83/what_is_the_funnest_project_you_worked_on/">What is the funnest project you worked on?</a></li></ul><p>Нашли что-нибудь полезное и интересное для себя? Расскажите, какие материалы понравились вам больше всего, а каких статей не хватило, чтобы следующий дайджест получился ещё лучше.</p><p>Если дайджест вам понравился, посмотрите две предыдущие подборки:</p><p>А ещё присылайте в комментарии статьи и видео, которые ускользнули от нашего взгляда и не попали в дайджест. Поделитесь полезными материалами с другими читателями! 😉</p>]]></content:encoded>
    </item>
    <item>
      <title>Дайджест Python #4: версия 3.12 и свой GPT за 60 строк кода</title>
      <link>https://tproger.ru/articles/dajdzhest-python-4-versija-3-12-i-svoj-gpt-za-60-strok-koda</link>
      <comments>https://tproger.ru/articles/dajdzhest-python-4-versija-3-12-i-svoj-gpt-za-60-strok-koda?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Рафаил Агазода]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/dajdzhest-python-4-versija-3-12-i-svoj-gpt-za-60-strok-koda</guid>
      <description><![CDATA[<p>Собрали дайджест из лучших статей и новостей о Python с 14 по 28 февраля. Дайджест включает статьи и видео на русском и английском языках.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/dajdzhest-python-4-versija-3-12-i-svoj-gpt-za-60-strok-koda">Дайджест Python #4: версия 3.12 и свой GPT за 60 строк кода</a>»</p>]]></description>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Big Data]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Нейронные сети]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Data Science]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 28 Feb 2023 11:45:42 GMT</pubDate>
      <content:encoded><![CDATA[<p>Собрали дайджест из лучших материалов по Python с 14 по 28 февраля, которые только смогли найти. Дайджест включает статьи и видео на русском и английском языках.</p><p>Узнайте, как написать свою GPT-модель всего за 60 строк кода, какие обновления коснулись Python в версии 3.12 и как повлиять на работу коммунальных служб с помощью машинного обучения.</p><h2>Big Data / Data Science</h2><ul><li><a href="https://habr.com/ru/company/factory5/blog/719396/">Как ускорить пилотные проекты по анализу больших данных</a></li><li><a href="https://habr.com/ru/post/718846/">Викторианская история больших данных</a></li><li><a href="https://habr.com/ru/company/skillfactory/blog/719016/">Как мы чуть не взломали шифровальщик Phobos с помощью CUDA</a></li><li><a href="https://habr.com/ru/post/718108/">Неудачный опыт: выявление аномалий в данных методами кластеризации</a></li><li><a href="https://habr.com/ru/company/piter/blog/717082/">Книга «Основы Python для Data Science»</a></li><li>EN <a href="https://habr.com/ru/post/717272/">Roads and building density in North America. 100GB geodata processing OSM data in PostgreSQL</a></li><li>EN <a href="https://habr.com/ru/post/717408/">How to put the whole world into a regular laptop: PostgreSQL and OpenStreetMap</a></li><li>EN <a href="https://medium.com/@darshilp/pandas-2-0-is-here-427b026ab913">Pandas 2.0 is Here</a></li><li>EN <a href="https://jjdiamondreivich.medium.com/exploratory-data-analysis-in-python-using-just-9-functions-dca300be63e2">Exploratory Data Analysis in Python, Using Just 9 functions</a></li><li>EN <a href="https://medium.com/@mgulum98/a-gentle-guide-of-pandas-6de76cae5c44">A Gentle Guide Of Pandas</a></li><li>EN <a href="https://medium.com/@ctagard19/pandas-meets-pyarrow-a-data-scientists-dream-come-true-dff849d61db5">Pandas meets Pyarrow? A Data Scientists Dream Come True</a></li><li>EN <a href="https://medium.com/@ElizavetaGorelova/numpy-library-everything-a-newbie-needs-to-know-42ed1138f451">NumPy Library: Everything a Newbie Needs to Know</a></li><li>EN <a href="https://levelup.gitconnected.com/polynomials-in-numpy-bc720ca62dd0">Polynomials in NumPy</a></li><li>EN <a href="https://medium.com/@ezfintrader/pandas-vs-numpy-which-python-library-is-best-for-data-analysis-and-numerical-calculations-c2f83e227119">Pandas vs Numpy: Which Python Library is Best for Data Analysis and Numerical Calculations?</a></li></ul><h2>AI и ML</h2><ul><li><a href="https://habr.com/ru/post/719206/">Как улучшить точность ML-модели используя разведочный анализ</a></li><li><a href="https://habr.com/ru/post/718996/">О «раздутом пузыре» нейросетей</a></li><li><a href="https://habr.com/ru/post/718942/">10 первых ошибок в карьере ML-инженера</a></li><li><a href="https://habr.com/ru/company/ruvds/blog/718102/">Об экшн-трансформере как следующем этапе развития модели трансформер и не только</a></li><li><a href="https://habr.com/ru/company/piter/blog/717660/">Книга «Грокаем алгоритмы искусcтвенного интеллекта»</a></li><li><a href="https://habr.com/ru/post/716902/">Пишем GPT в 60 строк NumPy (часть 1 из 2)</a></li><li><a href="https://habr.com/ru/post/717644/">Пишем GPT в 60 строк NumPy (окончание, 2/2)</a></li><li><a href="https://habr.com/ru/post/718106/">Взгляд компьютерным зрением на работу коммунальных служб</a></li><li>EN <a href="https://ricardo-castellanos-herreros.medium.com/top-15-artificial-intelligence-tools-3c3d0986067">Top 15 Artificial Intelligence Tools</a></li><li>EN <a href="https://medium.com/@keeps.dyes_06/pytorch-vs-tensorflow-spotting-the-difference-1014f0838be1">PyTorch vs TensorFlow — spotting the difference</a></li><li>EN <a href="https://medium.com/@keeps.dyes_06/understanding-pytorch-with-an-example-a-step-by-step-tutorial-82fd7d7a8a5a">Understanding PyTorch with an example: a step-by-step tutorial</a></li><li>EN <a href="https://medium.com/@zhanwenchen/build-pytorch-from-source-with-cuda-11-8-565ab737bfc8">Build PyTorch from Source with CUDA 11.8 with Ubuntu 22.04</a></li><li>EN <a href="https://dev.to/vincenius/coding-your-own-ai-in-2023-with-fastai-2pbk"> Coding your own AI in 2023 with fastai</a></li></ul><h2>Веб / Django / Flask</h2><ul><li><a href="https://habr.com/ru/post/718800/">Пишем сервис для сокращения ссылок на Django, DRF</a></li><li><a href="https://habr.com/ru/company/aitalenthub/blog/718064/">Отгадай слово: как мы создали игру с элементами машинного обучения и вышли в ноль за 2 месяца</a></li><li><a href="https://habr.com/ru/post/717142/">Как мы сделали образовательную игру для разработчиков в телеграмме?</a></li><li><a href="https://habr.com/ru/post/718376/">Как изучать язык Python для веб-разработки в 2023 году. Общие ориентиры</a></li><li><a href="https://habr.com/ru/post/717424/">Личный путь и опыт в становлении Python разработчиком</a></li><li>EN <a href="https://ericnarro.medium.com/how-to-change-django-ckeditor-image-properties-dialog-text-colors-when-using-black-theme-79c56aff619f">How to change django-ckeditor image properties dialog text colors when using dark theme</a></li><li>EN <a href="https://medium.com/@bobbykboseoffice/securing-your-django-rest-api-with-authentication-and-authorization-cf5b1c231cde">Securing Your Django REST API with Authentication and Authorization</a></li><li>EN <a href="https://nishanthmurugananth.medium.com/best-practices-for-django-development-5c51308fed75">Best Practices for Django Development</a></li><li>EN <a href="https://medium.com/@reachadeon/django-mvt-vs-laravel-mvc-a-technical-comparison-ac85cee7c13d">Django MVT vs Laravel MVC: A Technical Comparison</a></li><li>EN <a href="https://medium.com/@musowir_u/encrypto-the-ultimate-guide-to-building-a-secure-file-encryption-web-app-with-flask-and-python-f496ae9a58f6">Encrypto: The Ultimate Guide to Building a Secure File Encryption Web App with Flask and Python</a></li><li>EN <a href="https://medium.com/@keeps.dyes_06/python-webserver-with-flask-and-raspberry-pi-53494ebb2121">Python WebServer With Flask and Raspberry Pi</a></li><li>EN <a href="https://medium.com/@talhamsajid048/building-a-social-network-with-flask-and-neo4j-762f0b727aa8">Building a Social Network with Flask and Neo4j</a></li><li>EN <a href="https://medium.com/@s.sadathosseini/building-a-real-time-twitter-sentiment-analysis-web-app-with-python-and-flask-c8d5f6293888">Building a Real-Time Twitter Sentiment Analysis Web App with Python and Flask</a></li><li>EN <a href="https://towardsdev.com/building-a-voice-assistant-using-openai-api-and-flask-by-chatgpt-9f90a430b242">Building a Voice Assistant using OpenAI API and Flask — by ChatGPT</a></li><li>EN <a href="https://python.plainenglish.io/how-to-create-a-youtube-transcript-generator-web-app-with-python-flask-with-chatgpt-57b5ce859db4">How to Create a YouTube Transcript Generator Web App with Python Flask with ChatGPT</a></li><li>EN <a href="https://dev.to/vulcanwm/a-similarity-between-css-and-python-4lee"> A Similarity between CSS and Python</a></li><li>EN <a href="https://dev.to/thenomadevel/10-game-changing-no-codelow-code-tools-every-developer-should-know-about-2a4l"> 10 Game-Changing No Code/Low Code Tools Every Developer Should Know About</a></li></ul><h2>Скрипты, приложения и боты</h2><ul><li><a href="https://habr.com/ru/company/ruvds/blog/717110/">VS Code, python, контейнеры — как обуздать эту триаду и разрабатывать внутри контейнера</a></li><li><a href="https://habr.com/ru/company/skillfactory/blog/718894/">Как при помощи Rust в 150 раз ускорить код на Python</a></li><li><a href="https://habr.com/ru/post/718874/">Создание модуля WebAssembly с помощью Emscripten, AssemblyScript и Rust</a></li><li><a href="https://habr.com/ru/company/selectel/blog/717690/">Как разработать Telegram-бота для генерации сложных паролей</a></li><li><a href="https://habr.com/ru/company/selectel/blog/718134/">Сколько стоит содержать виртуальную девушку? Создаем подругу, записывающую кружочки в Telegram, с помощью 4 нейросетей</a></li><li><a href="https://habr.com/ru/post/717420/">Что нам несет Python 3.12</a></li><li><a href="https://habr.com/ru/post/717838/">История одного соседа ч.2</a></li><li>EN <a href="https://iamholumeedey007.medium.com/extract-tables-from-images-in-python-ae26a76ba29c">Extract Tables From Images in Python</a></li><li>EN <a href="https://medium.com/@amber.m1678/how-to-code-a-caesar-cipher-in-python-4fce724432f5">How to Code a Caesar Cipher in Python</a></li><li>EN <a href="https://medium.com/higherpattern/stock-news-sentiment-analysis-with-python-with-50-lines-of-code-e2a1519578a1">Stock News Sentiment Analysis with Python with 50 lines of code</a></li><li>EN <a href="https://python.plainenglish.io/python-converting-non-square-images-to-square-images-ed4ed266c7f6">Python — Converting Non-Square Images To Square Images</a></li></ul><h2>Развлекательный контент</h2><ul><li><a href="https://habr.com/ru/post/717898/">Я только спросить: разводим ChatGPT на откровенность по методу Илона Маска</a></li><li><a href="https://habr.com/ru/company/jugru/blog/717438/">Bing: «Я не причиню вам вред, если только вы не причините мне его первым»</a></li><li>Видео <a href="https://www.youtube.com/watch?v=0-czTUWRReI"> Почему в Python реализована глобальная функция len() и что об этом говорит Гвидо ван Россум?</a></li><li>Видео <a href="https://www.youtube.com/watch?v=YtYBbVZ2PYg"> Собеседование python разработчик Игорь Шкода. Ведет Олег Кожанов </a></li><li>Видео <a href="https://www.youtube.com/watch?v=vSnqZN5I8sc"> Новинки в Python 3.12 / Опять переписали виртуальную машину / Большая чистка stdlib </a></li><li>Видео  <a href="https://www.youtube.com/watch?v=54XyRw9y8oE"> 14 Ideas for Fun Python Free Time Projects </a></li></ul><p>Нашли что-нибудь полезное и интересное для себя? Расскажите, какие материалы понравились вам больше всего, а каких статей не хватило, чтобы следующий дайджест получился ещё лучше.</p><p>Если дайджест вам понравился, посмотрите предыдущие подборки:</p><p>А ещё присылайте в комментарии статьи и видео, которые ускользнули от нашего взгляда и не попали в дайджест. Поделитесь полезными материалами с другими читателями! 😉</p>]]></content:encoded>
    </item>
    <item>
      <title>10 шпаргалок для веб-разработчика</title>
      <link>https://tproger.ru/articles/10-shpargalok-dlja-veb-razrabotchika</link>
      <comments>https://tproger.ru/articles/10-shpargalok-dlja-veb-razrabotchika?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Марина Александровна]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/10-shpargalok-dlja-veb-razrabotchika</guid>
      <description><![CDATA[<p>В этих шпаргалках собраны подсказки по HTML, CSS, JavaScript, PHP, Django, Spring Boot и всему, что нужно знать веб-разработчику.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/10-shpargalok-dlja-veb-razrabotchika">10 шпаргалок для веб-разработчика</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Шпаргалки]]></category>
      <category><![CDATA[PHP]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 05 Feb 2023 07:46:18 GMT</pubDate>
      <content:encoded><![CDATA[<p>Веб включает в себя и фронтенд, и бэкенд, потому мы постарались собрать шпаргалки для веб-разработчиков по самым разным языкам и технологиям.</p><h2>Шпаргалки по HTML</h2><p>Язык гипертекстовой разметки — основа фронтенда и не даром стоит на первом месте в перечне HTML/CSS/JS. Не стоит забывать и об HTML5 — пятой и последней версии.</p><p>Следующая шпаргалка содержит основные теги HTML5:</p><figure><img src="https://media.tproger.ru/uploads/2021/04/HTML5_Cheatsheet.jpg" alt="" /></figure><p>Если же вас интересуют коды спецсимволов, то они собраны здесь:</p><figure><img src="https://media.tproger.ru/uploads/2021/04/HTML_Characters_Cheatsheet.jpg" alt="" /></figure><h2>Шпаргалки по CSS</h2><p>Дальше ожидаемо идёт стилизация элементов с помощью CSS. И несмотря на то, что CSS4 разрабатывается W3C с 2011 года, CSS3 всё ещё актуальная версия. Держите шпаргалку, которая упростит работу с каскадными таблицами стилей:</p><figure><img src="https://media.tproger.ru/uploads/2021/04/css3-help-sheet-large1.jpg" alt="" /></figure><p>А за хинтами по CSS Grid и Flexbox можно обратиться к нашим статьям:</p><ul><li><a href="https://tproger.ru/translations/how-css-flexbox-works/">CSS Flexbox в гифках</a></li><li><a href="https://tproger.ru/articles/7-osnovnyh-ponjatij-css-grid-layout-s-primerami-kotorye-pomogut-nachat-rabotu-s-gridami/">CSS Grid в примерах</a></li></ul><h2>Шпаргалки по JavaScript</h2><p>Этот язык не нуждается в представлении — его знает каждый веб-разработчик. Для тех, кто интересуется функциональным программированием на JS, есть такие подсказки:</p><figure><img src="https://media.tproger.ru/uploads/2021/04/Functional_programming_JS_Cheatsheet-1.jpg" alt="" /></figure><p>Отдельного внимания заслуживает шпаргалка для веб-разработчика по массивам, строкам и регулярным выражениям в JavaScript:</p><figure><img src="https://media.tproger.ru/uploads/2021/04/Javascript_cheatsheet.jpg" alt="" /></figure><p>Ещё один небезызвестный представитель в веб-разработке — Node.js. По нему тоже есть полезный список подсказок:</p><figure><img src="https://media.tproger.ru/uploads/2021/04/Nodejs_Cheatsheet.jpg" alt="" /></figure><h2>Шпаргалки по PHP</h2><p>Как бы ни ругали PHP, это всё ещё основной язык бэкенда, на котором написано подавляющее большинство сайтов.</p><p>В следующей шпаргалке для веб-разработчиков собрана информация о синтаксисе PHP — отлично подойдёт для начинающих:</p><figure><img src="https://media.tproger.ru/uploads/2021/04/PHP_Cheatsheet.jpg" alt="" /></figure><p>А это краткое руководство по PHP с массивами, строками, регулярными выражениями, форматами дат, паттернами и многим другим:</p><figure><img src="https://media.tproger.ru/uploads/2021/04/PHP_basics_Cheatsheet.jpg" alt="" /></figure><h2>Шпаргалки по Django</h2><p>Одну из них вы можете найти в <a href="https://tproger.ru/articles/python-cheatsheets/">шпаргалках по Python</a>. Вторая же вышла в 2021 году и содержит более полную информацию, включая атрибуты модели, работу с базами данных и деплой на PythonAnywhere:</p><figure><img src="https://media.tproger.ru/uploads/2021/04/Python_Django_CheatSheet.jpg" alt="" /></figure><h2>Видеокурс по Spring Boot</h2><p>Java является одним из наиболее популярных кроссплатформенных языков программирования. Большое распространение в веб-разработке он получил благодаря Spring Boot.</p><p>Это не совсем шпаргалка, а комплексный видеокурс, который тем не менее поможет освоить инструмент и создать своё первое веб-приложение на Java:</p><p>Что-то упустили? Напишите в комментариях — мы всегда рады дельным советам.</p>]]></content:encoded>
    </item>
    <item>
      <title>Дайджест Python #1: итоги 2022 года, обзор версии 3.11 и курсы от Google</title>
      <link>https://tproger.ru/articles/dajdzhest-python-itogi-2022-goda-obzor-versii-3-11-i-kursy-ot-google</link>
      <comments>https://tproger.ru/articles/dajdzhest-python-itogi-2022-goda-obzor-versii-3-11-i-kursy-ot-google?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Рафаил Агазода]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/dajdzhest-python-itogi-2022-goda-obzor-versii-3-11-i-kursy-ot-google</guid>
      <description><![CDATA[<p>Дайджест интересных статей о Python: что нового в версии 3.11, гайды по программированию на Python и обучающие статьи.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/dajdzhest-python-itogi-2022-goda-obzor-versii-3-11-i-kursy-ot-google">Дайджест Python #1: итоги 2022 года, обзор версии 3.11 и курсы от Google</a>»</p>]]></description>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Машинное обучение]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Финтех]]></category>
      <category><![CDATA[Data Science]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 16 Jan 2023 12:34:20 GMT</pubDate>
      <content:encoded><![CDATA[<p>Собрали дайджест из лучших материалов по Python с 1 по 15 января, которые только смогли найти. Дайджест включает статьи и видео на русском и английском языках.</p><p>Узнайте, как изменился Python в версии 3.11, как написать ботов в WhatsApp и Telegram для работы с финансами, как прокачать свои знания в Python с помощью пятиминутных упражнений и как написать тестовое задание на собеседовании при помощи ChatGPT.</p><h2>Новости Python и дискуссии</h2><ul><li><a href="https://habr.com/ru/company/jugru/blog/709952/">JEP-400 или UTF-8 РєРѕРґРёСЂРѕРІРєР° РїРѕ СѓРјРѕР«С‡Р°РЅРёСЋ</a></li><li><a href="https://tproger.ru/articles/subektivnye-itogi-2022-goda-v-mire-python/">Субъективные итоги 2022 года в мире Python</a></li><li><a href="https://tproger.ru/articles/luchshij-jazyk-programmirovanija-rejting-tiobe-2022/">Лучший язык программирования: рейтинг TIOBE 2022</a></li><li>Видео <a href="https://www.youtube.com/watch?v=RkKKuErRl2Q">«Язык года», Самые высокие зарплаты в 2022, Потрясающие увольнения в IT и другие новости</a></li><li>EN <a href="https://sunilrana123.medium.com/python-3-11-improved-type-hints-ad86dda9b686">Python 3.11: Improved Type Hints</a></li><li>EN <a href="https://discuss.python.org/t/allow-import-from-notation/22285/1">Allow import … from … notation</a></li></ul><h2>Гайды и туториалы по Python</h2><ul><li><a href="https://habr.com/ru/company/southbridge/blog/709980/">Сделано на Python: экспорт статистики ВКонтакте с помощью Prometeus и Grafana</a></li><li><a href="https://habr.com/ru/post/710084/">Web3: пишем небольшой фреймворк для работы со смарт-контрактами на Python</a></li><li><a href="https://habr.com/ru/post/710036/">Телеграм бот на Python, для напоминаний о реквестах на BitBucket</a></li><li><a href="https://habr.com/ru/post/709676/">Быстрый приём платежей QIWI в проекте Python</a></li><li><a href="https://ru.stackoverflow.com/questions/1484385/%d0%9a%d0%b0%d0%ba-%d0%bf%d1%80%d0%b0%d0%b2%d0%b8%d0%bb%d1%8c%d0%bd%d0%be-%d1%81%d0%b4%d0%b5%d0%bb%d0%b0%d1%82%d1%8c-%d1%80%d0%b5%d0%ba%d1%83%d1%80%d1%81%d0%b8%d1%8e">Как правильно сделать рекурсию?</a></li><li><a href="https://ru.stackoverflow.com/questions/1483767/%d0%9a%d0%b0%d0%ba-%d1%81%d0%be%d1%85%d1%80%d0%b0%d0%bd%d0%b8%d1%82%d1%8c-%d0%b4%d0%b0%d0%bd%d0%bd%d1%8b%d0%b5-%d1%81-%d0%bf%d0%b5%d1%80%d0%b2%d0%be%d0%b3%d0%be-%d0%b7%d0%b0%d0%bf%d1%83%d1%81%d0%ba%d0%b0-%d1%87%d1%82%d0%be%d0%b1%d1%8b-%d0%b2%d0%be-%d0%b2%d1%82%d0%be%d1%80%d0%be%d0%bc-%d0%b7%d0%b0%d0%bf%d1%83%d1%81%d0%ba%d0%b5-%d0%b8%d1%85-%d0%bc%d0%be%d0%b6%d0%bd%d0%be-%d0%b1%d1%8b%d0%bb%d0%be-%d0%b8%d1%81">Как сохранить данные с первого запуска, чтобы во втором запуске их можно было использовать?</a></li><li><a href="https://ru.stackoverflow.com/questions/1483950/%d0%9a%d0%b0%d0%ba-%d1%80%d0%b5%d0%b0%d0%bb%d0%b8%d0%b7%d0%be%d0%b2%d0%b0%d1%82%d1%8c-%d0%b0%d0%bd%d0%b8%d0%bc%d0%b0%d1%86%d0%b8%d1%8e-%d0%bf%d0%b5%d1%80%d0%b5%d0%bb%d0%b8%d0%b2%d0%b0%d1%8e%d1%89%d0%b5%d0%b3%d0%be%d1%81%d1%8f-%d1%82%d0%b5%d0%ba%d1%81%d1%82%d0%b0-css">Как реализовать анимацию переливающегося текста css?</a></li><li><a href="https://habr.com/ru/company/tinkoff/blog/709166/">Торговые роботы на Python</a></li><li><a href="https://habr.com/ru/post/710376/">Как отправить и скачать файл в FastAPI</a></li><li>EN <a href="https://dev.to/ivanyu2021/electron-django-part-1-desktop-app-integrate-javascript-python-4oac">Electron + Django ( Part 1 ), desktop app integrate JavaScript &amp; Python </a></li><li>EN <a href="https://towardsdatascience.com/introducing-fugue-reducing-pyspark-developer-friction-a702230455de">Introducing Fugue — Reducing PySpark Developer Friction</a></li><li>EN <a href="https://pythoncircle.com/post/777/django-application-to-automate-the-whatsapp-messaging/">Django application to automate the WhatsApp messaging</a></li><li>EN <a href="https://dev.to/documatic/integrate-stripe-payments-with-django-by-building-a-digital-products-selling-app-le5">Integrate Stripe Payments with Django By Building a Digital Products Selling App</a></li><li>EN <a href="https://dev.to/vhutov/building-personalised-music-recommendation-system-24lc">Building Personalised Music Recommendation System</a></li><li>EN <a href="https://dev.to/integerman/how-to-generate-text-with-openai-gpt-3-and-python-59p0">How to Generate Text with OpenAI, GPT-3, and Python</a></li><li>EN  <a href="https://www.youtube.com/watch?v=H09PmP5tsy8">Making a Game in Python with No Experience</a></li></ul><h2>Обучение Python: курсы, упражнения и советы</h2><ul><li><a href="https://habr.com/ru/post/709748/">NoNa: Алгоритм заполнения отсутствующих данных</a></li><li><a href="https://habr.com/ru/post/709670/">Советы по архитектуре кода для начинающих</a></li><li><a href="https://proglib.io/p/3-principa-napisaniya-chistogo-koda-na-python-2022-12-26">3 принципа написания чистого кода на Python</a></li><li>Видео <a href="https://www.youtube.com/watch?v=_pw136PPTKA">Лучшие способы Ускорить и Оптимизировать Python код</a></li><li>EN <a href="https://data-kode.medium.com/data-science-with-python-a-guide-to-essential-libraries-and-frameworks-3099c79240cd">Data Science with Python: A Guide to Essential Libraries and Frameworks</a></li><li>EN <a href="https://agbonorino.medium.com/5-mins-levelup-your-python-in-2023-3539eecfb07e">5 mins LevelUp Your Python in 2023</a></li><li>EN <a href="https://www.pypy.org/posts/2023/01/string-concatenation-quadratic.html#">Repeated string concatenation is quadratic in PyPy (and CPython)</a></li><li>EN <a href="https://dev.to/szymon6927/hexagonal-architecture-in-python-1b0b">Hexagonal architecture in Python</a></li><li>EN <a href="https://developers.google.com/edu/python/">Google’s Python Class</a></li></ul><h2>Развлекательный контент</h2><ul><li><a href="https://habr.com/ru/post/710169/">Как ChatGPT за меня тестовое задание для собеседования писал</a></li><li><a href="https://habr.com/ru/post/708906/">Воссоздаем старую компьютерную графику с помощью генеративных моделей</a></li><li>EN <a href="https://dev.to/s4shantanu/top-10-python-interview-question-and-answers-36dc">Top 10 Python Interview Question and Answers</a></li></ul><p>Нашли что-нибудь полезное и интересное для себя? Расскажите, какие материалы понравились вам больше всего, а каких статей не хватило, чтобы следующий дайджест получился ещё лучше.</p><p>Следующие подборки можно найти здесь:</p><ul><li><a href="https://tproger.ru/articles/dajdzhest-python-chem-ploh-django-i-kak-sozdat-bota-na-gpt-3/">Дайджест Python #2: чем плох Django и как создать бота на GPT-3</a></li><li><a href="https://tproger.ru/articles/dajdzhest-python-3-pishem-ai-pleer-dlja-sajta-i-boremsja-s-lesnymi-pozharami/">Дайджест Python #3: пишем AI-плеер для сайта и боремся с лесными пожарами</a></li></ul><p>А ещё присылайте в комментарии статьи и видео, которые ускользнули от нашего взгляда и не попали в дайджест. Поделитесь полезными материалами с другими читателями! 😉</p>]]></content:encoded>
    </item>
    <item>
      <title>Dockerize Python: создаём образ Docker из приложения на Python</title>
      <link>https://tproger.ru/articles/dockerize-python-sozdajom-obraz-docker-iz-prilozhenija-na-python</link>
      <comments>https://tproger.ru/articles/dockerize-python-sozdajom-obraz-docker-iz-prilozhenija-na-python?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Елизавета Ржевская]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/dockerize-python-sozdajom-obraz-docker-iz-prilozhenija-na-python</guid>
      <description><![CDATA[<p>Рассказываем, как создать Docker-контейнер из приложения на языке Python, и как Docker работает с фреймворками Python.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/dockerize-python-sozdajom-obraz-docker-iz-prilozhenija-na-python">Dockerize Python: создаём образ Docker из приложения на Python</a>»</p>]]></description>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[Гостевая публикация]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 21 Dec 2022 12:00:07 GMT</pubDate>
      <content:encoded><![CDATA[<p>Репозиторий с примерами кода для данной статьи: <a href="https://github.com/darklab8/darklab_article_docker_python">Github</a>.</p><h2>1. Article</h2><h3>1.0. Используемые технологии</h3><p>1. Docker и Docker Compose (книга <a href="https://www.oreilly.com/library/view/docker-deep-dive/9781800565135/">Docker Deep Dive</a> рекомендуется к изучению).</p><p>2. <a href="https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions">Github Actions</a> и <a href="https://docs.gitlab.com/ee/ci/quick_start/">Gitlab CI</a>.</p><p>3. <a href="https://taskfile.dev/">Task</a> для локальных pipeline workflow.</p><p>4. Python frameworks: Django, FastAPI, Flask. Python ORMs + migrating libraries: Django ORM + SQLALchemy/Alembic.</p><p>5. <a href="https://github.com/darklab8/darklab_infrastructure">Self hosted Github and Gitlab runners with available Docker in Docker</a>.</p><h3>1.1. Вступление</h3><p>Docker — технология, заменяющая виртуализацию. В контексте современной web-разработки можно сказать, что Docker является аналогом компиляции приложения в один бинарный файл.</p><p>Для таких программных языков как Javascript, Python, PHP, Ruby зачастую это единственный способ заморозить библиотеки зависимостей для получения неизменного артефакта (одного файла), который мы можем поочередно запустить и протестировать на машине разработчика, в облачном тестировочном полигоне и его же запустить на прод.</p><p>Docker пришел на смену виртуализации как более легковесный аналог, который можно запускать десятками на одной машине, потому что он переиспользует ядро оси.</p><p>Контейнеризация, аналогично виртуализации, служит для более полного использования ресурсов каждой машины, она позволяет нам запустить множество различных приложений на одной машине без конфликтов друг с другом.</p><figure><img src="https://media.tproger.ru/uploads/2022/12/140b4529-34e9-463b-bd86-00ca43ed9939.jpg" alt="" /></figure><p>Docker является фундаментальным кирпичиком, на основе которого идет дальнейшее построение веб-инфраструктур — Docker Сompose, AWS Elastic Beanstalk, AWS ECS, Kubernetes.</p><p>Системы контейнерного оркестрирования запускают множество контейнеров на разных машинах для горизонтального масштабирования нагрузки на сервера (увеличивать количество серверов вместо того, чтобы повышать мощность одного единственного), а также для обеспечения отказоустойчивости инфраструктуры.</p><p>Концепция докера хороша тем, что всё приложение в обычном случае не имеет сохраняемого состояния и мы можем заменить одну версию приложения на другую без загрязнения операционной системы, на которой запускаем контейнеры. Контейнер внутри содержит внутрифайловую систему в достаточном количестве для имитации независимой операционной системы.</p><p>Использование контейнеризации также приводит к тому, что любые приложения становятся мультитенантными по умолчанию. То есть одно и то же приложение можно запустить множество раз безо всяких конфликтов, даже если они внутри контейнера используют совершенно одинаковые ресурсы файловой системы.</p><p>Дополнительным следствием использования контенеризации является то, что все системные зависимости, необходимые для сборки или работы наших приложений, у нас записаны на уровне кода — это лучший вариант документации.</p><p>Использование Docker или его аналогов в мире веб-разработки является хорошим шагом даже для самых простых случаев. Для примера, установка WordPress требует конфигурации SQL-базы данных MariaDB / MySQL, Apache Web Server в режиме PHP-сервера, который запустит WordPress. Незнакомый с этими технологиями человек может потратить несколько дней на то, чтобы разобраться, как их запустить все вместе. С использованием Docker Сompose это сводится к трем шагам:</p><p>1. <b> </b>Установить Docker.</p><p>2. Написать в файлик <a href="https://github.com/docker/awesome-compose/blob/master/wordpress-mysql/compose.yaml">docker-compose.yml следующее</a>:</p><p>3. Написать команду docker-compose up -d (-d — флаг запуска в фоновом режиме).</p><p>В общей сложности на все это уйдет не более 5 минут.</p><p>В рамках работы web-приложений с Python даже в тривиальном случае обычно необходимо множество запущенных процессов к приложению:</p><ul><li>база данных PostgreSQL,</li><li>веб сервер Gunicorn,</li><li>Celery Beat Producer — периодические задачи внутри Python через Message Queue,</li><li>Сelery Worker — обработчик задач,</li><li>Redis — очереди для Celery-задач или же в качестве хранилища кэша быстрого доступа Key-Value, который мы можем использовать из питона.</li></ul><p>Часто должны быть установлены какие-нибудь дополнительные Linux-библиотеки по компиляции C-кода или gettext для переводов. Все, что надо установить, и не упомнишь без какого-либо средства автоматизации.</p><p>Удобство контейнеризации Докер в том, что… можно смело его использовать даже во время разработки на своей машине. Все равно все наши контейнеры можно остановить и удалить безо всяких загрязнений системы (к примеру, эти команды полностью очистят машину от всех работавших докер-приложений: (docker stop $(docker ps -q), docker system prune -a)</p><p>С учетом всех достоинств контейнеризации можно смело заявить, что количество нагрузки, которое она снимает с плеч разработчика, делает ее таким же необходимым инструментом, как файл с зависимостями к любому веб-приложению (package.json / requirements.txt и т.д.).</p><p>Зачастую Docker является единственным способом быстро вспомнить и настроить окружение для работы с каким-либо веб-проектом.</p><p>Если хотите попробовать контейнеризацию в самом щадящем варианте, изучите Docker Deep Dive и попробуйте Docker и Docker-compose локально на машине.</p><p>При работе с прод-проектами можно начать с использования Digital Ocean App Deployment, поддерживающего деплой докер-изображений, а так же AWS Lightsail Container Deployment и AWS Elastic Beanstalk, которые являются самыми простыми вариантами в рамках AWS. Beanstalk тоже из коробки решает горизонтальное масштабирование системы.</p><p>В связи с этим рассмотрим более подробно, как контейнизировать веб-приложения питона и подготовить их к минимальному использованию не в режиме дев-окружения.</p><p>Подобная инструкция может вам особенно пригодиться, если ваша роль — DevOps Engineer, который отвечает лишь за инфраструктуру системы, но может быть мало знаком с отдельными языками программирования (в частности, с Python) и особенностями их контейнеризации.</p><p>Полезным это будет и в случае, если вы просто разработчик Python Backend и хотите настроить свое дев-окружение в более удобном и задокументированном варианте, на уровне выше, чем просто использование virtual venv (ваш DevOps Engineer или тот, кто ответственен за деплой системы, очень обрадуется, увидев Docker-файл к проекту).</p><h3>1.2. Зависимости</h3><p>В Python наличествует как минимум 5 способов установки зависимостей к проекту:</p><ul><li>pip-менеджер по умолчанию, установка файлов вида requirements.txt, requirements.dev.text, constraints.txt,</li><li>установка requirements.txt через venv,</li><li>установка зависимостей через Pipenv package manager,</li><li>установка зависимостей через Poetry package manager,</li><li>установка зависимостей через Conda (common for data science/machine learning projects).</li></ul><p>4 из них продемонстрированы в <a href="https://github.com/darklab8/darklab_article_docker_python/blob/master/example_frm_flask/Dockerfile">Dockerfile</a> для Flask <a href="https://github.com/darklab8/darklab_article_docker_python/tree/master/example_frm_flask">простого проекта</a>.</p><p>dep-poetry, dep-pipenv, dep-pip, dep-venv docker stages демонстируруют одноименные установки зависимостей:</p><p>Альтернативные варианты установки и настроек можно посмотреть по следующим адресам:</p><p>— <a href="https://python-poetry.org/docs/#installing-with-the-official-installer">poetry documentation</a>,</p><p>— <a href="https://pipenv.pypa.io/en/latest/#install-pipenv-today">pipenv documentation</a>,</p><p>— <a href="https://pip.pypa.io/en/stable/getting-started/">pip documentation</a>.</p><h3>1.3. Веб-серверы</h3><p>Помимо сказанного нужно учесть и то, что встроенные веб-сервера в Flask/Django/FastAPI, запускаемые через python3 entryfile.py, по умолчанию подразумеваются для использования лишь в разработке.</p><p>Python web servers разделяются на две категории:</p><ul><li>WSGI based веб-сервера (вида Gunicorn), использование которых подразумевается для sync Python кода (не содержающего async инструкций),</li><li>и ASGI based веб-сервера (вида Uvicorn), подразумеваемые к использованию для питон-кода, содержащего асинхронный код. Использование Uvicorn для прода с асинхронным кодом подразумевается в паре с Gunicorn, который имеет Uvicorn workers.</li></ul><p>Дополнительно нужно учитывать, что питон-веб-сервера не способны возвращать static assets css/js/jpeg and etc. Лучшей рекомендацией сегодня является использовать хотя бы Nginx в режиме reverse proxy к питон-веб-серверу, настроив его возвращать static assets. Ни в коем случае не стоит использовать библиотеки White noise, это решение страшно глючит и медленно работает даже для одного пользователя.</p><h3>1.3.1. Django (Sync)</h3><p>Django обычно достаточно настраивать для синхронного кода через WSGI (Django Channels с веб-сокетами для реализации живых чатов, впрочем, существует, и ему нужно ASGI). Вот <a href="https://github.com/darklab8/darklab_article_docker_python/tree/master/example_frm_django">пример настроенного Django, работающего через Gunicorn-WSGI с Nginx reverse proxy serving static assets</a>. Для такой настройки достаточно установить gunicorn через текущий используемый package manager (pip/poetry/pipenv) и запустить <a href="https://github.com/darklab8/darklab_article_docker_python/blob/master/example_frm_django/docker-compose.prod.yml">веб-сервер через gunicorn, которому дали путь к WSGI.</a></p><p>В prod-варианте деплоя Python мы как минимум всегда можем указывать количество workers, параллельно обратаывающих запросы gunicorn src.core.wsgi -b 0.0.0.0:8000 —workers 2.</p><p>P.S. Django с отключенным settings.Debug = False перестает показывать static assets даже в дев-сервере, работающем через python3 manage.py runserver</p><h3>1.3.2. FastAPI (Async)</h3><p><a href="https://github.com/darklab8/darklab_article_docker_python/tree/master/example_frm_fastapi">Пример настроенного асинхронного проекта на FastAPI</a>.</p><p>Запуск меняется на gunicorn src.core.main:app —workers 4 —worker-class uvicorn.workers.UvicornWorker —bind 0.0.0.0:8000</p><p>Помимо смены веб-сервера с WSGI на ASGI, асинхронные фреймворки питона требуют и асинхронно дружелюбных библиотек, и драйверов для PostgreSQL в том числе. Если для синхронного Django нам достаточно установить psycopg2-binary pip package (обратите внимание, что psycopg2-binary не требует установки C-компилирующих зависимостей, в отличие от библиотеки psycopg2), то для асинхронного фреймворка нам нужно также установить asyncpg для PostgreSQL.</p><p>Аналогично в асинхронном фреймворке все используемые библиотеки должны быть async-дружелюбными: aiohttp вместо requests, к примеру, для выполнения сетевых запросов.</p><h3>1.4. CORS headers</h3><p>Последняя, самая частая проблема при деплое — CORS headers, которые должны быть часто настроены.</p><p>— Для Django это решается через <a href="https://pypi.org/project/django-cors-headers/">django-cors-headers</a>.</p><p>— Для FastAPI — через встроенную библиотеку <a href="https://fastapi.tiangolo.com/tutorial/cors/">CORSMiddleware</a>.</p><p>Примеры проектов Django с Nginx в режиме CORS, разрешающим все, можно найти <a href="https://github.com/darklab8/darklab_article_docker_python/tree/master/example_frm_django">здесь</a>.</p><p>И пример для FastAPI <a href="https://github.com/darklab8/darklab_article_docker_python/tree/master/example_frm_fastapi">здесь</a>.</p><h3>1.5. Помимо прочего</h3><p>Каждый из питон-фреймворков имеет богатую документацию деплоя с разными решениями:</p><p>— <a href="https://docs.djangoproject.com/en/4.1/howto/deployment/">Django Deployment</a> (Там есть и полезный checklist для деплоя),</p><p>— <a href="https://fastapi.tiangolo.com/deployment/">FastAPI Deployment</a>,</p><p>— <a href="https://flask.palletsprojects.com/en/2.2.x/deploying/">Flask deployment</a>.</p><p>Для <a href="https://github.com/darklab8/darklab_article_docker_python/tree/master/example_frm_django">Django</a> и <a href="https://github.com/darklab8/darklab_article_docker_python/tree/master/example_frm_fastapi">FastAPI</a> (и минималистичного варианта под минималистичный <a href="https://github.com/darklab8/darklab_article_docker_python/tree/master/example_frm_flask">Flask)</a> в рамках этой статьи представлены варианты конфигурации контейнеризации с Docker Compose и настроенными выполнениями unit-тестов, создающими объекты в PostgreSQL через Pytest framework.</p><p>Обратим внимание, что Django ORM миграции БД, создаваемые через python3 manage.py makemigrations, должны быть закомиттены в репозиторий и могут применяться к БД через python3 manage.py migrate.</p><p>Для FastAPI и Flask частым решением используется SQLALchemy для ORM и Alembic для миграции БД. alembic -c src/alembic.ini revision —autogenerate -m «migration_name» для создание миграций БД, alembic -c src/alembic.ini upgrade head — для применения всех до последней миграций к БД.</p><h3>1.5.1. Static assets</h3><p>Фреймворку, возможно, еще нужно будет добавить параметр, куда собирать static assets, и во время сборки докер-изображения собрать их туда.</p><p>Django: ./manage.py collectstatic —noinput —clear (см. STATIC_URL / STATIC_ROOT в <a href="https://github.com/darklab8/darklab_article_docker_python/blob/master/example_frm_django/src/core/settings.py">settings.py</a>)</p><h3>1.5.2 Translations</h3><p>Если во фреймворке используется translations, понадобится дополнительный шаг во время сборки Docker-изображения для этого.</p><p>— Django: python3 manage.py compilemessages.</p><p>— Flask: <a href="https://flask-user.readthedocs.io/en/v0.6/internationalization.html">инструкции здесь</a>, если используется Flask-Babel.</p><p>— FastAPI: Для FastAPI очевидных решений нет, возможно, используется <a href="https://sbabashahi.medium.com/add-translation-to-fastapi-with-gettext-a769ae6dd6bb">gettext</a>.</p><h3>1.5.3. CI pipeline build &amp; test</h3><p>Ниже предоставлены примеры настройки CI agnostic pipeline workflows через <a href="https://taskfile.dev/usage/">task</a> (которые можно исполнять локально!) и docker-compose:</p><p>— для <a href="https://github.com/darklab8/darklab_article_docker_python/blob/master/.github/workflows/build.yml">Github Actions</a>,</p><p>— для <a href="https://github.com/darklab8/darklab_article_docker_python/blob/master/.gitlab-ci.yml">Gitlab CI</a>.dockerize python</p><h2>2. FAQ</h2><h3>Общее для проектов на Python</h3><h4>Приложение является самостоятельным или это виртуальный хост для веб-сервера?</h4><p>В общем случае Python веб-приложения самостоятельны и деплоятся через Gunicorn/Uvicorn/WSGI/ASGI и прочие веб-серверы питона (см. полный список в ссылках документации по деплою фреймворков в главе 1.5).</p><p>Однако питон-веб-сервера не могут возвращать static assets css/js/jpeg и т.д. В этом случае их возвращают через Nginx, работающий заодно в режиме reverse proxy к питон-серверу.</p><p>Nginx и прочие reverse proxy используются в том числе для аугментации вида «регулировать headers», «добавить client side или server side caching».</p><p>Питон-веб-сервер можно напрямую сдеплоить через Apache mod_wsgi, например, но это малопопулярное решение. Если очень хочется feature rich возможностей, посмотрите в сторону <a href="https://uwsgi-docs.readthedocs.io/en/latest/">uWSGI</a> (очень много фич).</p><p>И хотя некоторые питон-сервера могут прикрепить TSL-сертификаты, все же проще это сделать через Nginx или иные внешние решения.</p><h4>Приложение можно запустить в одном контейнере?</h4><p>Да, можно — при ряде условий:</p><ul><li>если в приложении нет никаких добавок вида Celery (Message Queue),</li><li>если static assets нет необходимости возвращать (для REST API в общем случае не нужно, если только это не Django приложение с используемым Django Admin интерфейсом),</li><li>если для кеширования не нужен Redis или Redis деплоится где-то отдельно.</li></ul><p>Иначе даже для одного dev environment используется множество контейнеров: контейнер под PostgreSQL, Redis, основной web server, celery beat (cron like message queue task producer), celery worker (message queue worker), celery flower (message queue monitoring) + nginx (в качестве reverse proxy + serving static assets) — <a href="https://github.com/darklab8/darklab_article_docker_python/blob/master/example_frm_django/docker-compose.prod.yml">см. пример возможного большого количества контейнеров</a>.</p><h4>Требуется ли приложению установка зависимостей?</h4><p>Да, читайте главу 1.2 Зависимости.</p><p>Если в проекте применяется вызов вставок C-кода или какого-либо вида <a href="https://medium.com/analytics-vidhya/running-go-code-from-python-a65b3ae34a2d">Golang</a>, то может как минимум понадобиться установка библиотек компиляции C-кода. Большое количество деталей по разным вариантам описано в книге Python Expert Programming 4th edition в главе C extensions.</p><h4>Best practices по контейнеризации</h4><ul><li>Те же, что и везде: сжимать в один шаг установку и очистку кеша.</li><li>Использовать multi staging… который в основном не нужен, так как компилируют веб-приложения к бинарникам редко.</li><li>Сначала установить зависимости, потом копировать остальной код.</li><li>Нормально иметь Python-код собранным в packages от root folder, чтобы хаков PYTHONPATH с обнаружением модулей и packages не потребовалось (root-папка не должны иметь __init__.py файл, а каждая копируемая папка с Python-кодом должна иметь __init__.py на всех уровнях. И пути импорта прописаны по-человечески — абсолютные от root folder или относительные).</li><li>Использовать ENVIRONMENT variables, а не .env-файлы (их можно разве что для локальной дев-разработки).</li><li>Если настроите logging library вместо print, то совсем молодцы.</li><li>Флажок ENV PYTHONUNBUFFERED 1 нужен, чтобы логи нормально вылезали из контейнера.</li><li>Флажок ENV PYTHONDONTWRITEBYTECODE 1 тоже можно поставить, все равно кэш питон-кода в контейнере будет только занимать лишнее место.</li><li>Не забывать, что assert синтаксис используется лишь в тестировании, а для прода может быть и выключен. Так что лучше его не иметь в рабочем коде.</li><li>Если когда-нибудь будете копировать venv папку с уже установленными зависимостямив контейнер, учтите, что его абсолютный путь не должен меняться, иначе он сломается. Но вообще копировать его — моветон, устанавливайте зависимости в контейнерах во время сборки xD.</li><li>Не копируйте мусор вида __pycache__ в контейнер, настройте .dockerignore.</li><li>Как минимум нужно настроить масштабирование количества процессов workers (для вариантов более feature rich можно посмотреть в сторону uWSGI).</li></ul><h4>Нужны ли дополнительные скрипты (bash etc) для сборки/запуска приложения?</h4><p>Для веб-приложений обычно нет, однако c Makefile, или <a href="https://taskfile.dev/usage/">task</a>, или <a href="https://pythonhosted.org/Paver/">paver</a> жить проще. Либо же просто делать скрипты со встроенной библиотекой <a href="https://docs.python.org/3/library/argparse.html">argparse</a>. Или через click. Все индивидуально для веб-проектов.</p><p>Для приложений, собираемых в бинарники файла вида setup.py от <a href="https://pypi.org/project/setuptools/">https://pypi.org/project/setuptools/</a> либо иные, могут наличествовать чисто питон-скрипты/библиотеки для сборки проектов. Для этого случая можно составить список самых частых решений. В рамках статьи сборку бинарников, а также публикацию библиотек на pypi мы не рассматриваем.</p><h4>Что обычно кэшируется в CI/CD-пайплайне?</h4><p>При контейнеризации нам, в общем-то, ничего кэшировать и не нужно. Однако если бы этого не было, можно было бы закэшировать устанавливаемые pip packages или используемый venv (под капотом он используется почти для каждого из менеджеров (poetry/pipenv), но в зависимости от Package manager отличается путь, где кэшировать их зависимости).</p><p>Gitlab CI template for python</p><h3>Frameworks</h3><p>Существуют ли еще какие-либо предварительные процедуры для приложения, кроме установки зависимостей?</p><h4>Django</h4><p>Да, в статье большинство из них перечислено:</p><ul><li>Смена dev-сервера на боевой WSGI (для синхронного питона) или ASGI (для асинхронного питона).</li><li>Установка питона нужной версии (или использовании Docker image с нужной питон-основой).</li><li>Установка pip, если отсутствует (python3 -m ensurepip), для установки дальнейшей зависимостей.</li><li>Установка используемого package manager (pipenv, poetry).</li><li>Установка зависимостей.</li><li>Отключение дебага.</li><li>Смена Django-секрета на что-нибудь другое из ENV.</li><li>Настройка env-переменных через os.environ или альтернативные решения.</li><li>Настройка CORS headers.</li><li>Настройка, куда собирать static assets и компилировать их в одну папку (если используются html-возможности Django).</li><li>Компиляции переводов, если используется (python3 manage.py compilemessages), установка OS-зависимостей вида gettext.</li><li>При использовании библиотек питона с компиляцией через C должны быть установлены прочие дев-инструменты компиляции.</li><li>Мигрировать БД потом через python3 manage.py migrate.</li></ul><p>См. <a href="https://github.com/darklab8/darklab_article_docker_python/blob/master/example_frm_django/Dockerfile">пример докер-файла для Django</a>.</p><h4>FastAPI</h4><p>В основном повторяет Django-шаги, некоторые вещи повторно не упоминаются:</p><ul><li>Смена сервера на боевой асинхронный ASGI-сервер (для примера Gunicorn с Uvicorn workers) с увеличением количества workers.</li><li>Настройка CORS headers.</li><li>Установка используемого package manager (pipenv, poetry).</li><li>Установка зависимостей.</li><li>Мигрировать БД потом для SQLALchemy через: alembic -c src/alembic.ini upgrade head (или иной используемый ORM).</li></ul><p>См. <a href="https://github.com/darklab8/darklab_article_docker_python/blob/master/example_frm_fastapi/Dockerfile">пример докер-файла для FastAPI</a>.</p><h4>Flask</h4><p>В основном повторяет Django-шаги, некоторые вещи повторно не упоминаются:</p><ul><li>Смена dev-сервера на боевой WSGI (для синхронного питона) или ASGI (для асинхронного питона).</li><li>Отключение дебага.</li><li>Установка используемого package manager (pipenv, poetry).</li><li>Установка зависимостей.</li><li>Настройка CORS headers.</li><li>Настройка, куда собирать static assets и компилировать их в одну папку (если используются html-возможности Django).</li><li>Компиляции переводов, если используется (Flask-Babel?), установка OS-зависимостей вида gettext.</li><li>Мигрировать БД потом для SQLALchemy через: alembic -c src/alembic.ini upgrade head (или иной используемый ORM).</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>10 лучших фреймворков для веб-разработки на Python</title>
      <link>https://tproger.ru/articles/10-luchshih-frejmvorkov-dlja-veb-razrabotki-na-python</link>
      <comments>https://tproger.ru/articles/10-luchshih-frejmvorkov-dlja-veb-razrabotki-na-python?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Типичный программист]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/10-luchshih-frejmvorkov-dlja-veb-razrabotki-na-python</guid>
      <description><![CDATA[<p>Евгений Бартенев, автор курса по Python в Яндекс Практикуме, подготовил список лучших Python-фреймворков для веб-разработки в 2022 году.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/10-luchshih-frejmvorkov-dlja-veb-razrabotki-na-python">10 лучших фреймворков для веб-разработки на Python</a>»</p>]]></description>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Яндекс]]></category>
      <category><![CDATA[Фреймворки и библиотеки]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 27 Apr 2022 11:50:26 GMT</pubDate>
      <content:encoded><![CDATA[<p>Python — это объектно-ориентированный, интерпретируемый и интерактивный язык программирования. Лёгкость в его изучении и простота восприятия покорили многих разработчиков. Это один из самых быстроразвивающихся языков. Согласно <a href="https://pypl.github.io/PYPL.html">индексу популярности языков программирования</a>, Python занимает лидирующую позицию среди наиболее используемых языков в мире. Это означает, что спрос на Python-разработчиков в ближайшее время не снизится.</p><p>Ещё одно следствие лидирующей позиции языка — рост популярности фреймворков на его основе. Фреймворки существуют для того, чтобы упрощать жизнь программисту. Они помогают экономить время, потому что благодаря им разработчик фокусируется на логике работы приложения, а не на рутинных задачах.</p><p>Многие современные технологические компании, такие как Google, Netflix, Яндекс, выбирают Python-фреймворки для веб-разработки. И им есть из чего выбрать.</p><h2>Django</h2><figure><img src="https://media.tproger.ru/uploads/2022/04/C18BCD26-7CD4-4D4D-BEDE-5AD31222858E.jpeg" alt="" /></figure><p><a href="https://www.djangoproject.com/">Django</a> — это фреймворк с открытым исходным кодом, который позволяет разработчикам создавать веб-приложения практически любого уровня. Он входит в число лучших фреймворков Python и заслуженно пользуется популярностью.</p><p>Для Django доступен колоссальный набор дополнительных библиотек и поддержка огромного сообщества разработчиков, что существенно упрощает и ускоряет разработку.</p><p>Ключевые особенности Django:</p><ul><li>наличие собственного ORM (от англ. Object-Relational Mapping, «объектно- реляционное отображение»);</li><li>встроенный административный интерфейс (простым языком — админка);</li><li>шаблонизатор;</li><li>библиотека работы с формами;</li><li>система кэширования и интернализации;</li><li>система авторизации и аутентификации.</li></ul><h2>CherryPy</h2><figure><img src="https://media.tproger.ru/uploads/2022/04/397AFC61-CE31-4F11-A3AB-6DCBADB081E7.jpeg" alt="" /></figure><p>Фреймворк <a href="https://cherrypy.dev/">CherryPy</a>, которому уже более десяти лет, зарекомендовал себя как исключительно быстрый и стабильный продукт. Одна из изначальных целей основателя проекта Реми Делона — сделать CherryPy максимально соответствующим принципу «pythonic style». Это позволило разработчикам использовать этот фреймворк как обычный модуль Python и не думать об особенностях веб- программирования. Они могут создавать веб-приложения практически так же, как создают любую другую объектно-ориентированную программу на Python.</p><p>CherryPy может выступать в качестве самостоятельного веб-сервера или работать под управлением другого серверного приложения.</p><p>Ключевые особенности CherryPy:</p><ul><li>надёжный многопоточный веб-сервер, соответствующий стандарту HTTP/1.1.;</li><li>возможность запускать различные HTTP-серверы (например, на нескольких портах) одновременно;</li><li>встроенные инструменты работы с сессиями, кэшированием, аутентификацией, статическим контентом;</li><li>мощная система конфигурирования;</li><li>встроенная поддержка профилирования и тестирования;</li><li>поддержка Python 2.7+, 3.5+, PyPy, Jython.</li></ul><h2>Pyramid</h2><figure><img src="https://media.tproger.ru/uploads/2022/04/7089440E-AC35-47FD-85BC-86871DF42722.jpeg" alt="" /></figure><p>Набирающий популярность фреймворк <a href="https://trypyramid.com/">Pyramid </a>универсален. Его можно использовать для проектов любого уровня сложности. Он заслужил высокие оценки в среде Python-разработчиков благодаря своей прозрачности и проверенной временем надёжности. Его используют такие технологические гиганты, как Mozilla, Yelp, Dropbox и SurveyMonkey.</p><p>Мегафреймворки, как правило, принимают решения за разработчика в вопросах архитектуры приложения или выбора тех или иных компонентов, например ORM. Но если ваши потребности не соответствуют их точке зрения, вы в конечном итоге будете бороться с их выбором.</p><p>Микрофреймворки, напротив, не навязывают никаких решений, что в ряде случаев играет вам на руку. Однако когда ваше приложение разрастается и ему требуются новые компоненты, то в вопросе выбора вы оказываетесь предоставлены сами себе.</p><p>В обоих случаях основное внимание уделяется началу работы над проектом: либо всего слишком много, либо слишком мало. Pyramid — это золотая середина. Этот фреймворк в самом начале работы над проектом может быть микрофреймворком, а по мере роста даст всё необходимое на каждом этапе, чтобы довести проект до успешного завершения.</p><p>Ключевые особенности Pyramid:</p><ul><li>возможность написать приложение в одном файле;</li><li>обслуживание запросов на статические файлы;</li><li>панель инструментов для отладки приложения прямо в браузере;</li><li>расширяемые взаимозаменяемые шаблоны (template);</li><li>встроенная интернационализация;</li><li>кэширование HTTP; встроенная поддержка сессий;</li><li>управление транзакциями, в том числе при работе сразу с несколькими базами данных;</li><li>гибкая расширяемая аутентификация и авторизация;</li><li>автоматизация повторяющейся конфигурации.</li></ul><h2>TurboGears</h2><figure><img src="https://media.tproger.ru/uploads/2022/04/7AF61D81-262E-470D-AAF4-DC57510C3B54.jpeg" alt="" /></figure><p><a href="https://www.turbogears.org/">TurboGears</a> — это ещё один веб-фреймворк для разработки веб-приложений, написанный на языке Python. Во время его создания вдохновение черпалось из опыта использования Django и Rails. Эти фреймворки имеют ряд ограничений и недостатков, а TurboGears попытался решить эти проблемы.</p><p>Основное отличие этого фреймворка от того же Django — не изобретение велосипеда в виде собственной ORM, а использование в качестве основных компонент стандартных и популярных библиотек, таких как Pylons, SQLAlchemy, Genshi и Repoze.</p><p>Среди организаций, которые использовали TurboGears, — Bisque, ShowMeDo и SourceForge.</p><p>Ключевые особенности TurboGears:</p><ul><li>поддержка множества баз данных;</li><li>поддержка различных JavaScript-библиотек;</li><li>поддержка множества форматов обмена данными;</li><li>поддержка горизонтального масштабирования данных по примеру шардинга;</li><li>возможность расширения средствами стандартных WSGI-компонент.</li></ul><h2>Web2Py</h2><figure><img src="https://media.tproger.ru/uploads/2022/04/0B17F32F-B7DA-439C-A336-FCE0998E90D8.jpeg" alt="" /></figure><p>Фреймворк <a href="http://www.web2py.com/">Web2py</a> изначально задумывался как учебный инструмент с акцентом на юзабилити и простоте начала использования. Например, в нём отсутствуют файлы конфигурации проекта. Сама же архитектура фреймворка разработана по аналогии с такими решениями, как Ruby on Rails и Django.</p><p>Весь процесс разработки, отладки, тестирования, а также администрирование удалённой базы данных можно организовать без каких-либо сторонних инструментов через собственный веб-интерфейс, который в свою очередь тоже является web2py-приложением.</p><p>Кроме того, каждое приложение обеспечено автоматически сгенерированным интерфейсом администрирования по типу Django.</p><p>Ключевые особенности Web2py:</p><ul><li>интегрированная веб-среда разработки;</li><li>встроенные компоненты для всех основных функций;</li><li>механизмы аутентификации и контроля доступа по ролям;</li><li>поддержка jQuery для Ajax- и UI-эффектов;</li><li>поддержка интернационализации;</li><li>автоматическое журналирование ошибок вместе с контекстом.</li></ul><h2>Flask</h2><figure><img src="https://media.tproger.ru/uploads/2022/04/5025AF56-66E4-4EF3-B84C-DFDFDEC1CBC8.jpeg" alt="" /></figure><p>У фреймворка <a href="https://flask.palletsprojects.com/en/2.1.x/">Flask</a> небольшой размер исходной кодовой базы, поэтому его называют микрофреймворком. Но это не значит, что у него меньше возможностей, чем у того же Django. По умолчанию он включает в себя только обработчик запросов и шаблонизатор, а простейшее приложение на Flask может состоять всего из нескольких строк. Разработчики этого фреймворка осознанно хотели сохранить ядро простым, но расширяемым.</p><p>Тем не менее с помощью Flask можно реализовать практически любую задачу: от простого одностраничного сайта до серьёзного проекта с авторизацией, аутентификацией и другими возможностями. Flask подходит для задач, которые подразумевают гибкость в выборе компонентов. Разработчик сам принимает решение, что ему пригодится в работе.</p><p>Flask лежит в основе таких крупных сервисов? как Reddit, Netflix, Pinterest, Twilio и агрегатора такси Lyft.</p><p>Ключевые особенности Flask:</p><ul><li>встроенный сервер разработки и отладчик;</li><li>диспетчеризация запросов в RESTful-стиле;</li><li>встроенная поддержка модульного тестирования;</li><li>использование шаблонизатора Jinja2;</li><li>100%-ная совместимость с WSGI 1.0;</li><li>множество расширений, предоставляемых сообществом.</li></ul><h2>Bottle</h2><figure><img src="https://media.tproger.ru/uploads/2022/04/34C7AB68-B959-480F-A93F-080D5C14BC72.jpeg" alt="" /></figure><p><a href="https://bottlepy.org/docs/dev/">Bottle</a> — это ещё один простой и лёгкий микрофреймворк. Он распространяется в виде однофайлового модуля, и у него нет никаких зависимостей, кроме стандартной библиотеки Python. Изначально он разрабатывался исключительно для создания веб-интерфейсов API.</p><p>Функциональные возможности «из коробки» включают встроенный веб-сервер, шаблонизацию, роутинг запросов, а также собственные инструменты и утилиты. Bottle позволяет создавать простые приложения для личного пользования. А ещё это подходящий пример для изучения фреймворков, а также для быстрого создания прототипов. Например, компания Netflix использовала Bottle для создания своих веб-интерфейсов.</p><p>Ключевые особенности Bottle:</p><ul><li>быстрый встроенный шаблонизатор в pythonic-стиле;</li><li>встроенный веб-сервер разработки;</li><li>простой механизм маршрутизации запросов к функциям с поддержкой как статических, так и динамических адресов;</li><li>лёгкий доступ к cookies, загрузке файлов, заголовкам запросов и другим метаданным.</li></ul><h2>Tornado</h2><figure><img src="https://media.tproger.ru/uploads/2022/04/A1763CC0-EF01-46EA-8628-4FD91AECABD8.jpeg" alt="" /></figure><p><a href="https://www.tornadoweb.org/en/stable/">Tornado</a> — это расширяемый асинхронный веб-сервер и фреймворк, который решает проблему C10k. То есть при правильной настройке он может работать с 10 000+ одновременных соединений. Это делает его отличным инструментом для создания приложений, требующих суперпроизводительности при работе с операциями ввода/вывода и поддержки огромного количества одновременных соединений.</p><p>Изначально фреймворк был создан для использования в проекте FriendFeed, который в 2009 году приобрела компания Facebook, после чего исходные коды Tornado были открыты.</p><p>Ключевые особенности Tornado:</p><ul><li>асинхронный режим работы;</li><li>использование веб-сокетов;</li><li>поддержка схем аутентификации и авторизации сторонних производителей.</li></ul><h2>web.py</h2><figure><img src="https://media.tproger.ru/uploads/2022/04/72A8B51E-E559-4973-89E0-C61F07C7668F.jpeg" alt="" /></figure><p><a href="https://webpy.org/">Web.py</a> — это минималистский фреймворк, который нацелен на реализацию простых веб-приложений на языке Python. Те разработчики, которые считают, что новые веб-сайты должны создаваться с нуля, будут очарованы этим быстрым и лёгким фреймворком. Web.py обеспечивает простоту и эффективность процесса разработки без использования заготовок архитектуры.</p><p>Web.py делает процесс веб-разработки максимально непредвзятым и не встаёт на пути идей разработчиков. Причина упрощения процесса разработки в том, что бывают случаи, когда нет необходимости использовать паттерн проектирования MVC или создавать беспорядок из HTML, CSS, JavaScript и PHP в одном файле.</p><p>Ключевые особенности Web.py:</p><ul><li>встроенный веб-сервер разработки;</li><li>встроенный отладчик;</li><li>встроенный шаблонизатор;</li><li>встроенный пакет работы с базами данных;</li><li>пакет работы с формами;</li><li>совместимость с WSGI.</li></ul><h2>FastAPI</h2><figure><img src="https://media.tproger.ru/uploads/2022/04/771C1764-1183-47DC-9348-538CD7125644.jpeg" alt="" /></figure><p><a href="https://fastapi.tiangolo.com/">FastAPI</a> — это асинхронный веб-фреймворк, который появился на свет в конце 2018 года. Он предназначен для быстрой разработки API-приложений и основан на использовании стандартной аннотации типов Python.</p><p>Слово «fast» в названии указывает не только на быструю разработку приложения, но и на производительность фреймворка. Как утверждает документация, согласно <a href="https://fastapi.tiangolo.com/#performance">результатам независимых тестов</a>, FastAPI по скорости не уступает приложениям, написанным на NodeJS или Go, а также это <a href="https://www.techempower.com/benchmarks/#hw%3Dph%26test%3Dfortune%26l%3Dzijzen-sf">один из самых быстрых фреймворков на Python</a>.</p><p>FastAPI сразу строился как асинхронный фреймворк, в отличие от имеющих долгую историю Django и Flask, которые изначально были синхронными и лишь в последние годы начали внедрять асинхронность.</p><p>FastAPI обычно применяется для разработки API, без фронтенда, но при желании его можно дополнить стандартными шаблонами на основе шаблонизатора, например Jinja2, который применяется во Flask.</p><p>Ключевые особенности FastAPI:</p><ul><li>очень высокая производительность, наравне с NodeJS и Go;</li><li>встроенная документация на основе Swagger;</li><li>использование веб-сокетов;</li><li>лёгкая интеграция с базами данных;</li><li>основан на стандартах OpenAPI и полностью совместим с ними.</li></ul><h2>Что же выбрать?</h2><p>Существует огромное количество фреймворков для веб-разработки на Python. Здесь мы собрали самые популярные и востребованные, но у каждого из них свои плюсы и минусы. Выбор конкретного решения зависит от стоящих перед разработчиком задач и личных предпочтений. Необходимо каждый раз оценивать выбираемый фреймворк на соответствие требованиям конкретной задачи.</p><p>Приведённый выше список бесплатных и открытых фреймворков Python актуален на 2022 год, но какой из них лучше подойдёт для вашего следующего проекта — решать вам.</p><p>На курсе <a href="https://practicum.yandex.ru/python-developer-plus?utm_source=pr&amp;utm_medium=content&amp;utm_campaign=pr_content_python-developer-plus_tproger">«Python-разработчик плюс»</a> в Яндекс Практикуме вы изучите основы трёх востребованных на рынке фреймворков — Django, Flask и FastAPI и создадите несколько проектов с их использованием.</p>]]></content:encoded>
    </item>
    <item>
      <title>Почему вам стоит выбрать фреймворк Django для своего следующего проекта</title>
      <link>https://tproger.ru/articles/pochemu-vam-stoit-vybrat-frejmvork-django-dlja-svoego-sledujushhego-proekta</link>
      <comments>https://tproger.ru/articles/pochemu-vam-stoit-vybrat-frejmvork-django-dlja-svoego-sledujushhego-proekta?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Maksim Kuznetsov]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/pochemu-vam-stoit-vybrat-frejmvork-django-dlja-svoego-sledujushhego-proekta</guid>
      <description><![CDATA[<p>Senior Python Developer рассказывает про возможности Django, а также советует, в каких проектах стоит применять этот фреймворк.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/pochemu-vam-stoit-vybrat-frejmvork-django-dlja-svoego-sledujushhego-proekta">Почему вам стоит выбрать фреймворк Django для своего следующего проекта</a>»</p>]]></description>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Пост пользователя]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 28 Jul 2021 10:30:01 GMT</pubDate>
      <content:encoded><![CDATA[<p><b>Django (Джанго)</b> — свободный фреймворк для веб-приложений на языке Python, использующий шаблон проектирования MVC. Проект поддерживается организацией Django Software Foundation.</p><p>Сайт на Django строится из одного или нескольких приложений, которые рекомендуется делать отчуждаемыми и подключаемыми. Это одно из существенных архитектурных отличий фреймворка от некоторых других (например, Ruby on Rails). Один из основных принципов фреймворка — DRY (англ. Don’t repeat yourself)</p><p>Веб-фреймворк Django используется в сайтах Instagram, Disqus, Mozilla, The Washington Times, Pinterest, YouTube, Google и др.</p><p>Архитектура Django похожа на «Модель-Представление-Контроллер» (MVC). Контроллер классической модели MVC примерно соответствует уровню, который в Django называется Представление (англ. View), а презентационная логика Представления реализуется в Django уровнем Шаблонов (англ. Template). Из-за этого уровневую архитектуру Django часто называют «Модель-Шаблон-Представление» (MTV).</p><h2>Основные возможности Django</h2><ul><li>ORM, API доступа к БД с поддержкой транзакций;</li><li>встроенный интерфейс администратора с уже имеющимися переводами на многие языки;</li><li>диспетчер URL на основе регулярных выражений;</li><li>расширяемая система шаблонов с тегами и наследованием;</li><li>система кэширования;</li><li>интернационализация;</li><li>подключаемая архитектура приложений, которые можно устанавливать на любые Django-сайты;</li><li>generic views — шаблоны функций контроллеров;</li><li>авторизация и аутентификация, подключение внешних модулей аутентификации: LDAP, OpenID и проч.;</li><li>система фильтров (middleware) для построения дополнительных обработчиков запросов, как, например, включенные в дистрибутив фильтры для кэширования, сжатия, нормализации URL и поддержки анонимных сессий;</li><li>библиотека для работы с формами (наследование, построение форм по существующей модели БД);</li><li>встроенная автоматическая документация по тегам шаблонов и моделям данных, доступная через административное приложение.</li></ul><h2>Django Rest Framework для создания API</h2><p>Django Rest Framework (DRF) — это библиотека, которая работает со стандартными моделями Django для создания гибкого и мощного API для проекта. Эта статья поможет понять структуру DRF и дать вводные данные для начала его использования</p><p>API DRF состоит из трёх слоев:</p><ul><li>Сериализатор преобразует информацию, хранящуюся в базе данных и определенную с помощью моделей Django, в формат, который легко и эффективно передается через API.</li><li>Вид (ViewSet) определяет функции (чтение, создание, обновление, удаление), которые будут доступны через API.</li><li>Маршрутизатор определяет URL-адреса, которые будут предоставлять доступ к каждому виду.</li></ul><h2>Когда не стоит использовать Django</h2><ul><li>Для очень-очень больших приложений, т.к. для некоторого функционала специально подбирается язык и технология, плюс Django по архитектуре ближе к монолиту, чем к микросервисам.</li><li>Если необходимо написать простейшее приложение, в котором не требуется работать с базой данных, выполнять операции с файлами или делать что-либо хоть немного сложное. Для таких ситуаций лучше подойдут микрофреймворки.</li><li>Вы хотите сами написать все с нуля и знаете, что делаете.</li><li>Вы или ваши коллеги совершенно не знакомы с Django/Python и у вас нет времени и ресурсов на наработку необходимых навыков.</li></ul><p>Если все вышесказанное – не про ваш проект, то, вполне вероятно, Django вам подойдет.</p><p>Из личного опыта: идеальное применение Djnago для бэкенд разработки — написание бэкенда на хакатоне. Очень много встроенных фич и расширений, максимально удобная и быстрая разработка по сравнению с другими языками и фреймворками. Как мы знаем, на хакатоне время очень ограниченно.</p><h2>Django и DRF. Полезные ссылки для изучения</h2><ul><li><a href="https://docs.djangoproject.com/en/3.2/">Django 3.2 documentation</a></li><li><a href="https://django.fun/docs/django/ru/3.1/">Документация Django 3.1 на русском языке</a></li><li><a href="https://www.django-rest-framework.org/">Django REST framewor​k documentation</a></li><li><a href="https://github.com/ilyachch/django-rest-framework-rusdoc">Документация Django REST framework на русском языке</a></li></ul><h3>А вы использовали Django в своих проектах?</h3>]]></content:encoded>
    </item>
    <item>
      <title>Вышла новая Django 3.2 LTS с длительным сроком поддержки</title>
      <link>https://tproger.ru/news/vyshla-novaja-django-3-2-lts-s-dlitelnym-srokom-podderzhki</link>
      <comments>https://tproger.ru/news/vyshla-novaja-django-3-2-lts-s-dlitelnym-srokom-podderzhki?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/vyshla-novaja-django-3-2-lts-s-dlitelnym-srokom-podderzhki</guid>
      <description><![CDATA[<p>LTS-версия фреймворка будет поддерживаться следующие три года, исправляет критические уязвимости старых версий и приносит ряд нововведений.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/vyshla-novaja-django-3-2-lts-s-dlitelnym-srokom-podderzhki">Вышла новая Django 3.2 LTS с длительным сроком поддержки</a>»</p>]]></description>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 06 Apr 2021 13:15:36 GMT</pubDate>
      <content:encoded><![CDATA[<p>Разработчики Django опубликовали на официальном сайте пост, посвящённый релизу Django 3.2. По словам команды, развивающей проект, данная LTS-версия фреймворка будет поддерживаться в течение следующих трёх лет.</p><figure><img src="https://media.tproger.ru/uploads/2021/04/1-11.jpg" alt="" /></figure><p>Также свежее обновление исправит критические уязвимости, в том числе связанные с основной функциональностью, найденные в более старых версиях Django.</p><h3>Главные изменения/нововведения Django 3.2</h3><ul><li>автоматическое обнаружение AppConfig упрощает настройку подключаемых приложений;</li></ul><ul><li>кастомизация типа автоматически созданных primary-ключей запускает миграцию в поля первичного ключа BigAutoField по умолчанию;</li></ul><ul><li>функциональные индексы теперь можно создавать на выражениях и функциях базы данных.</li></ul><h3>Как скачать?</h3><p>Воспользоваться командой pip install Django==3.2 в Терминале или <a href="https://www.djangoproject.com/download/">посмотреть</a> инструкцию на сайте разработчиков.</p><p>Источник: <a href="https://www.djangoproject.com/weblog/2021/apr/06/django-32-released/">Django</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Использование django-celery-beat для создания периодических задач в Django-проектах</title>
      <link>https://tproger.ru/articles/ispolzovanie-django-celery-beat-dlja-sozdanija-periodicheskih-zadach-v-django-proektah</link>
      <comments>https://tproger.ru/articles/ispolzovanie-django-celery-beat-dlja-sozdanija-periodicheskih-zadach-v-django-proektah?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Типичный программист]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/ispolzovanie-django-celery-beat-dlja-sozdanija-periodicheskih-zadach-v-django-proektah</guid>
      <description><![CDATA[<p>Celery — распределённая асинхронная очередь задач с планировщиком: как создавать периодические задачи в коде и останавливать их по условию.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/ispolzovanie-django-celery-beat-dlja-sozdanija-periodicheskih-zadach-v-django-proektah">Использование django-celery-beat для создания периодических задач в Django-проектах</a>»</p>]]></description>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 29 Mar 2021 12:24:49 GMT</pubDate>
      <content:encoded><![CDATA[<p>Когда в проекте стоит задача реализовать функциональность, которая будет выполняться через определенное время или по расписанию, на помощь приходит такой замечательный инструмент, как Celery.</p><p>Celery — это распределенная асинхронная очередь задач, выполняющаяся в реальном времени, а также поддерживающая планирование задач. Ознакомиться с теоретическими аспектами можно по <a href="https://docs.celeryproject.org/en/stable/">ссылке</a>. В данной статье мы рассмотрим периодические задачи. Несмотря на то, что периодические задачи можно создавать через административную страницу в Django admin, мы рассмотрим их создание в коде, а также остановку созданных задач по условию.</p><p>Если вы хотите повторить пример из статьи, то у вас уже должен быть настроен Django-проект. Однако если вам нужна помощь по настройке проекта, почитайте <a href="https://tproger.ru/translations/create-your-first-django-app/">эту статью</a>.</p><p>В основном Celery в Django-приложениях используется, когда необходимо:</p><ul><li>асинхронно выполнить какую-либо задачу с помощью Celery worker;</li><li>выполнить задачу в определенное время;</li><li>постоянно выполнять задачу через определенный промежуток времени.</li></ul><p>Самостоятельно Celery не умеет реализовывать периодические задачи, поэтому существует расширение django-celery-beat, которое выполняет роль планировщика задач для Celery. Как развернуть Сelery в приложении, описано в документации выше.  В качестве посредника сообщений между нашим приложением и Сelery я использую Redis, развернутый в docker-контейнере.</p><p>Давайте установим django-celery-beat с помощью pip install django-celery-beat.</p><p>После установки необходимо внести django-celery-beat в список установленных приложений в настройках приложения Django.</p><p>Это необходимо, так как данное расширение предоставляет новые модели, в которых будут храниться расписание и задачи, и приложение должно знать об этом, чтобы выполнить миграции и создать необходимые таблицы.</p><p>Запустим миграции. И в качестве последней настройки для полноценного использования django-celery-beat добавим в settings приложения: CELERY_BEAT_SCHEDULER='django_celery_beat.schedulers:DatabaseScheduler', тем самым указав Celery использовать новый планировщик задач, только что установленный нами.</p><p>Чтобы убедиться в полной установке расширения, необходимо зайти на административный сайт приложения. Если расширение установлено верно, то вы увидите следующий список моделей, позволяющий управлять периодическими задачами:</p><figure><img src="https://media.tproger.ru/uploads/2021/03/image2.jpg" alt="" /></figure><h2>Динамическое создание периодических задач</h2><p>Основная мысль, которую я бы хотел донести в статье, заключается в том, что периодические задачи являются обычными моделями, с которыми можно работать через Django ORM. Сейчас покажу на примере:</p><p>Допустим, вы создаете сервис, который делает заказы на стороннем сервисе через API. В ответе от этого сервиса вы получаете статус вашего заказа. Если мы получили статус от сервиса, то все отлично, дальше мы выполняем всю необходимую логику с этим заказом. Если же нет (например, пришел ответ '0') — тогда необходимо переотправлять запрос, пока статус не будет получен.</p><p>Мы не будем усложнять себе жизнь работой с API каких-либо сервисов. Сымитируем ответ от воображаемого сервиса с помощью custom command, которую самостоятельно напишем.</p><p>В папке приложения создадим папку «management», в ней папку «command» и в ней файл с кодом, например, «make_order.py».</p><figure><img src="https://media.tproger.ru/uploads/2021/03/image4-1.jpg" alt="" /></figure><p>И напишем код будущей консольной команды.</p><p>Данная команда ожидает 2 аргумента на вызове: первый — это статус, второй — id заказа. Если мы получаем статус '0' от нашего воображаемого сервиса, тогда нам необходимо повторно отправлять запросы на получение статуса. Тут-то нам и пригодятся периодические задачи. В данном примере мы создаем PeriodicTask из Django_celery_beat.models. В качестве аргументов мы передаем ей следующие параметры:</p><ul><li>Имя создаваемой задачи: name='Repeat order .{}'.format(options['order_id']), в дальнейшем с ее помощью мы будем останавливать задачи, если нам это необходимо.</li><li>Задача, которая будет периодически выполняться через определенный промежуток времени. В нашем случае это: task='repeat_order_make'.</li><li>Интервал, через который мы хотим, чтобы задача выполнялась: interval=IntervalSchedule.objects.get(every=10, period='seconds'). IntervalSchedule также является моделью из django_celery_beat.models, поэтому мы можем пользоваться функциональностью, предоставляемой Django ORM</li><li>Аргументы, которые будут передаваться в указанную функцию. В нашем случае задаче 'repeat_order_make' будет передан аргумент args=json.dumps([options['order_id'][0]]), то есть options['order_id'][0].</li><li>И время начала работы периодической задачи: start_time=timezone.now().</li></ul><p>Давайте теперь посмотрим на код задачи 'repeat_order_make'. Создадим файл «task.py» в корне нашего приложения (как на скриншоте) и напишем следующий код.</p><p>В коде учитывается, что если заказ уже получил статус, то нет необходимости больше выполнять написанную нами периодическую задачу. Для того, чтобы остановить последующее выполнение задачи, мы получаем экземпляр задачи с помощью метода get(), передавая в качестве аргумента имя, которое мы дали во время создания задачи. Затем мы переводим поле enabled в состояние False, что остановит выполнение задачи в дальнейшем, и обязательно сохраняем экземпляр задачи.</p><p>Давайте теперь проверим результаты наших трудов. Запустим написанную нами команду с помощью manage.py make_order 0 1. То есть мы делаем заказ №1 и как будто получаем ответ со статусом '0'. Это должно создать новую периодическую задачу. Давайте глянем в celery_beat командой celery -A &lt;имя вашего приложения&gt; beat -l INFO.</p><figure><img src="https://media.tproger.ru/uploads/2021/03/image5.jpg" alt="" /></figure><p>И увидим, как началось периодическое выполнение задачи repeat_order_make, которую мы описали выше. А также заглянем в Celery командой celery -A &lt;имя вашего приложения&gt; worker -l INFO (я запускал каждую команду в отдельном окне терминала).</p><figure><img src="https://media.tproger.ru/uploads/2021/03/image3.jpg" alt="" /></figure><p>Видно, что Celery получает, и посылаем задачи для исполнения.</p><p>Теперь изменим статус нашего заказа, снова запустив команду manage.py make_order, но уже с параметрами «Принят, 1». То есть manage.py make_order Принят 1. После чего можно посмотреть в терминал с celery-beat и увидеть сообщение о том, что было изменено расписание выполнения задач, после чего постоянный вызов repeat_order_make прекратится.</p><figure><img src="https://media.tproger.ru/uploads/2021/03/image1.jpg" alt="" /></figure><p>Таким образом, мы научились создавать периодические задачи прямо в коде программы, без использования административного сайта проекта, и также научились их останавливать. Я постарался привести пример из личного опыта, однако максимально упростил его, чтобы выжать максимум информации по конкретному случаю использования периодических задач. Если вы хотите больше узнать о том, как пользоваться периодическими задачами или посмотреть другие кейсы использования этого инструмента, я рекомендую ознакомиться со следующими материалами: <a href="https://medium.com/swlh/dynamic-task-scheduling-with-django-celery-beat-f2591d52e15">раз</a> и <a href="https://docs.celeryproject.org/en/stable/userguide/periodic-tasks.html">два</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Разработчик Tor Project выпустил инструмент для отправки анонимных сообщений в GitLab</title>
      <link>https://tproger.ru/news/razrabotchik-tor-project-vypustil-instrument-dlja-otpravki-anonimnyh-soobshhenij-v-gitlib</link>
      <comments>https://tproger.ru/news/razrabotchik-tor-project-vypustil-instrument-dlja-otpravki-anonimnyh-soobshhenij-v-gitlib?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/razrabotchik-tor-project-vypustil-instrument-dlja-otpravki-anonimnyh-soobshhenij-v-gitlib</guid>
      <description><![CDATA[<p>Разработчица Tor Project Мария Виоланте собрала на Python и Django инструмент, который шлёт тикеты в GitLab анонимно и следит за ними.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/razrabotchik-tor-project-vypustil-instrument-dlja-otpravki-anonimnyh-soobshhenij-v-gitlib">Разработчик Tor Project выпустил инструмент для отправки анонимных сообщений в GitLab</a>»</p>]]></description>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Tor]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 11 Feb 2021 12:58:52 GMT</pubDate>
      <content:encoded><![CDATA[<p>Разработчик Tor Project Мария Виоланте опубликовала пост в блоге проекта. В нём она рассказала о своей новой разработке — Anon-Ticket — инструменте для GitLab, позволяющем анонимно отправлять тикеты об ошибках. В основу надстройки легли язык Python и фреймворк Django.</p><p>С помощью Anon-Ticket пользователи, обычно не отправляющие сообщения об ошибках из-за необходимости регистрироваться, смогут обойти раздражающий их этап.</p><figure><img src="https://media.tproger.ru/uploads/2021/02/1-14.jpg" alt="" /><figcaption>Помимо отправки баг-репортов, в Anon-Ticket можно ещё и отслеживать их состояние / Источник: Блог Tor Project</figcaption></figure><p>Для демонстрации работы инструмента, Виоланте разработала специальный <a href="https://anonticket.onionize.space/">сервис</a>. Его можно использовать для отправки репортов об ошибках в репозиториях Tor. Но сам Anon-Ticket не привязан к продуктам Tor Project, а потому может спокойно использоваться и на сторонних проектах.</p><p>Функционал разработки не ограничен отправкой сообщений об ошибках. Пользователи также могут отслеживать состояние заполненных тикетов, а также добавлять уточнения. Контролировать отправленный баг-репорт можно с помощью выдаваемой при его создании ссылки.</p><p>Источник: Блог Tor Project</p>]]></content:encoded>
    </item>
    <item>
      <title>Проекты на Django для начинающих: двухчасовой видеокурс</title>
      <link>https://tproger.ru/video/proekty-na-django-dlja-nachinajushhih-dvuhchasovoj-videokurs</link>
      <comments>https://tproger.ru/video/proekty-na-django-dlja-nachinajushhih-dvuhchasovoj-videokurs?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Сергей Почекутов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/video/proekty-na-django-dlja-nachinajushhih-dvuhchasovoj-videokurs</guid>
      <description><![CDATA[<p>Сокращатель ссылок, список дел и словарь английских слов — три проекта на Django для знакомства с веб-разработкой на языке Python.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/video/proekty-na-django-dlja-nachinajushhih-dvuhchasovoj-videokurs">Проекты на Django для начинающих: двухчасовой видеокурс</a>»</p>]]></description>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Видео]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 08 Feb 2021 04:41:36 GMT</pubDate>
      <content:encoded><![CDATA[<p>В этом видео показаны проекты на Django, которые будут полезны начинающим разработчикам. Они помогут разобраться со структурой и освоить базовые техники создания веб-приложений на языке Python.</p><p>2:40 URL Shortener — простой сокращатель ссылок.</p><p>48:48 ToDo List — приложение для управлением списками дел.</p><p>1:34:28 English Dictionary — словарь английских слов со значениями, синонимами и антонимами.</p><p>После прохождения этого видеокурса попробуйте сделать более сложный проект. Например, у нас есть <a href="https://tproger.ru/translations/django-react-webapp/">подробная инструкция по созданию веб-приложения с бэкендом на Django и фронтендом на React</a>.</p><p>Если хотите узнать больше о Django, <a href="https://www.djangoproject.com/start/">посмотрите документацию фреймворка</a>. В ней описаны основные возможности с примерами использования на практике.</p>]]></content:encoded>
    </item>
    <item>
      <title>5 шпаргалок по Python для разных сфер применения</title>
      <link>https://tproger.ru/articles/python-cheatsheets</link>
      <comments>https://tproger.ru/articles/python-cheatsheets?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Марина Александровна]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/python-cheatsheets</guid>
      <description><![CDATA[<p>Подборка шпаргалок по основам языка, регулярным выражениям и библиотеке pandas для анализа данных — базовую информацию не придётся искать.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/python-cheatsheets">5 шпаргалок по Python для разных сфер применения</a>»</p>]]></description>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Регулярные выражения]]></category>
      <category><![CDATA[Шпаргалки]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Data Science]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 05 Nov 2020 13:02:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Держите несколько шпаргалок по Python, которые сэкономят вам время в процессе обучения и работы с популярным языком программирования.</p><ol><li><a href="https://tproger.ru/#part1">Шпаргалка по основам Python</a></li><li><a href="https://tproger.ru/#part2">Регулярные выражения в Python</a></li><li><a href="https://tproger.ru/#part3">Шпаргалка по pandas</a></li><li><a href="https://tproger.ru/#part4">Шпаргалка по Django</a></li><li><a href="https://tproger.ru/#part5">Виртуальное окружение Python</a></li></ol><h2>Шпаргалка по основам Python</h2><p>Здесь собраны переменные, методы, индексы и срезы, а также форматирование дат с соответствующими подсказками в сносках. Если вы только начали изучать программирование на языке Python, смело обращайтесь к этой шпаргалке:</p><figure><img src="https://media.tproger.ru/uploads/2020/11/python_basics_cheat_sheet.jpg" alt="" /></figure><h2>Регулярные выражения в Python</h2><p>Шпаргалка собрала большое количество информации о регулярках, включая:</p><ul><li>специальные символы;</li><li>объекты Match;</li><li>методы модуля re;</li><li>escape-символы;</li><li>Raw String Notation;</li><li>расширения;</li><li>объекты;</li><li>флаги;</li><li>ссылки на документацию: <a href="https://docs.python.org/3/howto/regex.html">Regular Expression HOWTO</a> и <a href="https://docs.python.org/3/library/re.html">Regular expression operations</a>.</li></ul><figure><img src="https://media.tproger.ru/uploads/2020/11/python_regex_cheat_sheet.jpg" alt="" /></figure><h2>Шпаргалка по pandas</h2><p>Эта библиотека для анализа данных прекрасно себя зарекомендовала в Data Science. Такая шпаргалка поможет в построении различных диаграмм с использованием pandas:</p><figure><img src="https://media.tproger.ru/uploads/2020/11/pandas_plotting_cheat_sheet.jpg" alt="" /></figure><h2>Шпаргалка по Django</h2><p>Будет полезна тем, кто желает освоить веб-разработку на Python. Здесь вы найдёте базовую информацию по работе с фреймворком — от его установки и до операций с Git:</p><figure><img src="https://media.tproger.ru/uploads/2020/11/django_cheatsheet.png" alt="" /></figure><h2>Виртуальное окружение Python</h2><p>Эта шпаргалка собрала популярные инструменты для создания и работы с изолированными средами, а также команды по установке данных инструментов и активации виртуального окружения:</p><figure><img src="https://media.tproger.ru/uploads/2020/11/puthon_virtual_environments__cheat_sheet.jpg" alt="" /></figure>]]></content:encoded>
    </item>
    <item>
      <title>Пишем приложение с бэкендом на Django и фронтендом на React</title>
      <link>https://tproger.ru/translations/django-react-webapp</link>
      <comments>https://tproger.ru/translations/django-react-webapp?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Типичный программист]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/django-react-webapp</guid>
      <description><![CDATA[<p>Напишем приложение с бэкендом на Django и фронтендом на React. Создаём REST API на Джанго, добавляем React и соединяем в один проект.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/django-react-webapp">Пишем приложение с бэкендом на Django и фронтендом на React</a>»</p>]]></description>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 01 May 2020 09:26:13 GMT</pubDate>
      <content:encoded><![CDATA[<p>Автор перевода Полина Ревякина, копирайтер в Skillbox</p><p>В этом материале вы узнаете:</p><ul><li>как создать бэкенд с REST API на Django;</li><li>как добавить React в проект Django;</li><li>как соединить бэкенд на Django и фронт на React.</li></ul><ol><li><a href="https://tproger.ru/#part1">Подготовка</a></li><li><a href="https://tproger.ru/#part2">Создаём проект Django в виртуальном окружении Python</a></li><li><a href="https://tproger.ru/#part3">Пишем приложение на Django</a></li><li><a href="https://tproger.ru/#part4">Соединяем Django и React</a></li><li><a href="https://tproger.ru/#part5">Устанавливаем React и webpack</a></li><li><a href="https://tproger.ru/#part6">Готовим приложение Django для фронтенда</a></li><li><a href="https://tproger.ru/#part7">Фронтенд на React</a></li><li><a href="https://tproger.ru/#part8">Заключение</a></li></ol><h2>Подготовка</h2><p>Вам понадобятся:</p><ul><li>базовое понимание Python и Джанго;</li><li>базовое понимание JavaScript (и спецификации ECMAScript 2015) и React;</li><li>установленный Node.js.</li></ul><h2>Создаём проект Django в виртуальном окружении Python</h2><p>Создайте новую папку и перейдите в неё:</p><p>mkdir django-react &amp;&amp; cd $_</p><p>Потом активируйте виртуальное окружение Python:</p><p>Примечание все следующие команды нужно выполнять из папки django-react и с активированным виртуальным окружением.</p><p>Установите зависимости Джанго и Django REST Framework:</p><p>pip install django djangorestframework</p><p>После установки создайте новый проект Django:</p><p>django-admin startproject django_react</p><p>Теперь сделаем API на Django для создания и хранения контактов.</p><h2>Пишем приложение с бэкендом на Django</h2><p>В каждом проекте Django может быть много приложений. Приложения можно делать переиспользуемыми: такими, что их можно добавить в менеджер пакетов Python и установить через него в другой проект, в котором нужно такое приложение.</p><p>Для создания нового приложения Django используется команда:</p><p>django-admin startapp app_name</p><p>где app_name — название приложения.</p><p>В нашем случае команда будет выглядеть так:</p><p>django-admin startapp leads</p><p>Она создаст приложение leads в папке django-react. Теперь структура папок в проекте должна выглядеть так:</p><p>Теперь сделаем так, чтобы Django проект использовал новое приложение. Откройте файл django_react/settings.py и добавьте приложение в INSTALLED_APPS:</p><h3>Создаём модель в базе данных с Джанго</h3><p>Модель — это объект, представляющий собой данные из таблицы. Почти каждый веб-фреймворк использует модели, и Django — не исключение. Она может иметь одно или больше полей. Каждое поле соответствует полю в таблице.</p><p>Мы собираемся хранить контакты, поэтому модель Lead может состоять из этих полей:</p><ul><li>имя;</li><li>email;</li><li>сообщение.</li></ul><p>Добавим ещё поле со временем создания модели, потому что по умолчанию Django этого не делает.</p><p>Откроем leads/models.py и опишем модель Lead:</p><p>Примечание <a href="https://docs.djangoproject.com/en/dev/ref/models/fields/">изучите</a> документацию Django о полях. Когда придумываете структуру модели, выбирайте самые подходящие для вашего случая поля.</p><p>Создадим миграции командой:</p><p>python manage.py makemigrations leads</p><p>и применим их к базе данных:</p><p>python manage.py migrate</p><h3>Займёмся тестированием</h3><p>Вы могли подумать «А как же тестирование?».</p><p>Существует масса туториалов по бэкенду на Джанго, начинающихся примерно так:</p><p>Не надо так. Нет никакого смысла ни в тестировании стандартной модели Django, ни в тестировании Django ORM. Что точно не нужно тестировать при создании приложения с бэкендом на Django:</p><ul><li>встроенный код Django (модели, представления);</li><li>встроенные функции Python.</li></ul><p>Не тестируйте то, что уже протестировано! Так что же тогда тестировать?</p><p>Добавили свой метод в модель Django — протестируйте его. Дополнили стандартное представление — протестируйте его. Но как узнать, что именно нужно протестировать?</p><p>Узнать это поможет библиотека coverage. Установите её:</p><p>pip install coverage</p><p>Теперь после каждого добавления или изменения кода запускайте coverage:</p><p>coverage run --source='.' manage.py test</p><p>и создавайте отчёт:</p><p>coverage html</p><p>Вы увидите, что именно нужно протестировать. Если предпочитаете увидеть отчёт в командной строке, запустите команду:</p><p>coverage report</p><h3>Сериализаторы Django</h3><p>Сериализация — это конвертация объекта Python в другой формат. После сериализации можно сохранить объект в файл или послать его через сеть.</p><p>Почему сериализация необходима? Модель Джанго — это класс Python. Чтобы превратить её в данные в формате JSON, нужна сериализация.</p><p>Сериализаторы работают и в обратном направлении: они конвертируют JSON в объекты. Это позволяет:</p><ul><li>отображать модель Django в браузере с помощью конвертации в JSON;</li><li>делать запросы CRUD (create – read – update – delete) к API в формате JSON.</li></ul><p>Суммируя: сериализаторы в Django можно использовать для совершения операций с моделями Django через API.</p><p>Создайте новый файл leads/serializers.py. Сериализатор LeadSerializer содержит нашу модель и поля:</p><p>Созданный дочерний класс от класса serializers.ModelSerializer. ModelSerializer в Django похож на ModelForm. Он подходит, когда нужно, чтобы сериализатор соответствовал модели.</p><h3>Создаём представления</h3><p>Если вы раньше работали с другими фреймворками, то можете удивиться, что в Django нет контроллеров.</p><p>Контроллеры содержат логику обработки запросов и возвращения ответов. В традиционной архитектуре MVC есть модель (Model), представление (View) и контроллер (Controller). Примеры MVC фреймворков: Rails (Ruby), Phoenix (Elixir), Laravel (PHP).</p><p>Django — это фреймворк MVT. MVT — это модель, представление и шаблон (Template). В Django есть много типов представлений: функции-представления, представления, основанные на классах, и обобщённые представления.</p><p>Используйте функции-представления только если изменение обобщенных представлений займет больше, чем написание представления заново.</p><p>Мы будем использовать обобщённые представления. Наше простое приложение будет:</p><ul><li>возвращать выборку моделей;</li><li>создавать новые объекты в базе данных.</li></ul><p>С помощью документации можно узнать, что есть представление для возвращения выборки и создания моделей: ListCreateAPIView. Это представление содержит queryset и serializer_class.</p><p>queryset — это выборка данных, которую приложение будет возвращать. В нашем случае — все модели Lead. serializer_class — класс сериализатора для модели.</p><p>Добавьте в файл django_react/views.py следующий код:</p><p>С помощью трёх строк кода мы создали представление для обработки GET и POST запросов.</p><p>Чего ещё не хватает? Маршрутизации URL. Другими словами, нам нужно соединить URL и представления.</p><h3>Настраиваем маршрутизацию url</h3><p>Нам нужно сделать так, чтобы GET и POST запросы к api/lead/ обрабатывались представлением LeadListCreate, которое будет возвращать и создавать модели.</p><p>Чтобы настроить маршрутизацию URL, отредактируйте файл django_react/urls.py, добавив туда url приложения:</p><p>Так мы указываем в бэкенде на Django, что нужно использовать url, которые есть в приложения leads.</p><p>Теперь создайте файл leads/urls.py. В нём мы соединим представление LeadListCreate и url api/lead/:</p><p>И наконец, включим rest_framework в INSTALLED_APPS. Откройте django_react/settings.py и добавьте приложение в INSTALLED_APPS:</p><p>Запустим сервер Django:</p><p>python manage.py runserver</p><p>Перейдите по url http://127.0.0.1:8000/api/lead/ и вы увидите API:</p><figure><img src="https://media.tproger.ru/uploads/2020/04/django-rest-framework-browsable-api.png" alt="" /></figure><p>Примечание в продакшене лучше отключить возможность просмотра API. Это можно сделать в конфигурации:</p><h2>Соединяем Django и React</h2><p>У многих разработчиков возникают вопросы по поводу того, как правильно соединить Django и React.</p><p>Должен ли роутер React взять на себя маршрутизацию? Нужно ли монтировать компоненты React в каждом шаблоне Django?</p><p>Ответ зависит от случая.</p><p>Есть следующие способы создания проекта на Django и React (они похожи почти для любого веб-фреймворка):</p><ol><li>React в собственном приложении Django для фронтенда. Загружаем один HTML шаблон и даём React управление фронтендом (сложность: средняя).</li><li>Django REST как отдельное API + React как отдельное SPA (сложность: высокая, нужна будет авторизация по JWT).</li><li>Смешанный вариант: мини-приложения React в шаблонах Django (сложность: просто, но сложно будет поддерживать).</li></ol><p>Если вы только начали работать с Django REST и React, избегайте варианта 2. Вместо этого выберите 1 (React в собственном приложении Django для фронтенда), если:</p><ul><li>вы создаёте приложение, похожее на веб-сайт;</li><li>в интерфейсе будет много пользовательских действий, используется AJAX;</li><li>вас устраивает авторизация, основанная на сессиях;</li><li>вас не очень волнуют вопросы SEO;</li><li>вас устраивает роутер React.</li></ul><p>Если будете держать React близко к Django, то будет проще с авторизацией. Можно будет использовать встроенную систему авторизации Django для регистрации и входа пользователей. Используйте старую добрую авторизацию с помощью сессий и не беспокойтесь о токенах и JWT.</p><p>Выберите вариант 3 (смешанный вариант: мини-приложения React в шаблонах Django), если:</p><ul><li>на сайте не нужно использовать много JavaScript;</li><li>вам важно SEO и вы не можете использовать Node.js для рендеринга серверной части.</li></ul><p>В данной статье мы будем использовать вариант 1.</p><h2>Устанавливаем React и webpack</h2><p><br />Создадим новое приложение Django для фронтенда:</p><p>django-admin startapp frontend</p><p>Вы увидите новую папку с названием frontend в вашей структуре папок:</p><p>Подготовим папки для хранения компонентов React:</p><p>mkdir -p ./frontend/src/components</p><p>И статики:</p><p>mkdir -p ./frontend/{static,templates}/frontend</p><p>Дальше установим React, webpack и babel. Перейдите в папку frontend и создайте окружение:</p><p>cd ./frontend &amp;&amp; npm init -y</p><p>Установите webpack и webpack CLI:</p><p>npm i webpack webpack-cli --save-dev</p><p>Откройте package.json и запишите 2 скрипта для продакшна и для разработки:</p><p>Сохраните и закройте файл.</p><p>Установим babel, чтобы код был совместим со старыми браузерами, которые не поддерживают последние стандарты JavaScript:</p><p>npm i @babel/core babel-loader @babel/preset-env @babel/preset-react --save-dev</p><p>Установим React:</p><p>npm i react react-dom --save-dev</p><p>Настроим Babel (по-прежнему находясь в папке frontend):</p><p>Создадим файл webpack.config.js для настройки загрузчика babel:</p><h2>Готовим приложение Django для фронтенда</h2><p>Создадим представление в ./frontend/views.py:</p><p>Создадим шаблон в ./frontend/templates/frontend/index.html:</p><p>В шаблоне вызывается ./frontend/main.js — файл, который будет генерировать webpack, содержащий весь код на React.</p><p>Настроим маршрутизатор Django: включим туда url приложения frontend. Отредактируем файл ./project/urls.py:</p><p>Создадим файл ./frontend/urls.py:</p><p>Включим приложение фронтенда в список используемых приложений в файле ./project/settings.py:</p><p>Зайдя на http://127.0.0.1:8000/, вы увидите пока что просто пустую страницу (для этого сервер Django должен продолжать работать).</p><h2>Фронтенд на React</h2><p>После бэкенда, написанного на Джанго, сделаем простой компонент React, который будет отображать наши данные. Если ваша база данных пуста, то самое время наполнить приложение какими-нибудь данными.</p><p>Запустите сервер Django и перейдите на http://127.0.0.1:8000/api/lead/ чтобы добавить контакты.</p><p>Создадим файл ./frontend/src/components/App.js. В нём будет компонент React, запрашивающий и отображающий данные.</p><p>Примечание можно написать тот же компонент в виде функции с хуком useEffect.</p><p>Сохраните и закройте файл. Теперь создайте точку входа для webpack — файл ./frontend/src/index.js и импортируйте компонент:</p><p>import App from "./components/App";</p><p>Теперь можно протестировать результат. Запустите webpack:</p><p>npm run dev</p><p>Запустите сервер Django:</p><p>python manage.py runserver</p><p>Перейдите на http://127.0.0.1:8000/. Если вы видите сообщение «Что-то пошло не так», то убедитесь, что применили миграции и заполнили базу данных. Вы должны увидеть данные, отображенные компонентом React.</p><figure><img src="https://media.tproger.ru/uploads/2020/04/django-rest-react.png" alt="" /></figure><p>Выглядит просто. И работает!</p><h2>Заключение</h2><p>В этом материале мы сделали простой проект на Django REST API и React. Мы научились:</p><ul><li>создавать простое REST API на Django;</li><li>добавлять React в проект Django;</li><li>соединять Django REST API и React.</li></ul><p>Если этот проект показался сложным, попробуйте другой туториал. В нём мы показали, <a href="https://tproger.ru/translations/create-your-first-django-app/">как создать первое веб-приложение на Django</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Неофициальный и консервативный FAQ по Django</title>
      <link>https://tproger.ru/translations/django-faq</link>
      <comments>https://tproger.ru/translations/django-faq?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Сергей Ринг]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/django-faq</guid>
      <description><![CDATA[<p>Django или Flask, чем хорош этот веб-фреймворк и что выбирать в спорных ситуациях — ответы на вопросы, которых нет в официальной документации.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/django-faq">Неофициальный и консервативный FAQ по Django</a>»</p>]]></description>
      <category><![CDATA[Лучшая практика]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 20 May 2019 08:10:02 GMT</pubDate>
      <content:encoded><![CDATA[<p><a href="https://www.djangoproject.com/start/overview/">Django</a> быстр, многофункционален, безопасен, масштабируем, гибок. Он хорошо взаимодействует с различными рабочими потоками, инструментами, платформами и библиотеками.В этом FAQ вы найдёте ответы на часто возникающие вопросы, которых нет в официальном FAQ. Конечно, универсальных ответов нет, но, возможно, этот FAQ сможет немного прояснить обстановку.</p><h2>Flask или Django?</h2><p>В большинстве случаев — Django.</p><p>Но, если у вас маленькое приложение или скрипт, и вы просто хотите добавить HTTP API, то, конечно же, используйте Flask.<br />Но в других случаях, с усложнением ваших приложений, вам нужно будет внедрять всё больше и больше функциональности, вы будете использовать всё больше и больше библиотек, и с Flask’ом вы просто запутаетесь. Поэтому для больших проектов используйте Django.</p><h2>Нужно ли разбивать свой код на отдельные приложения?</h2><p>Скорее нет.</p><p>Разделение полезно при многократном использовании повторяющихся функций. Когда вы делаете своё собственное приложение, а особенно, если вы только новичок, организовать всё в одном месте будет намного лучше. В какой-то момент вам, возможно, захочется разделить всё на отдельные модули, и в этот момент у вас уже будут намечены чёткие границы, где и что разделять. Это лучше, чем сначала создать структуру, а потом бороться с последствиями изменений.</p><h2>Стоит использовать DTL (Django’s default template language) или что-нибудь другое?</h2><p>Используйте DTL.</p><p>По умолчанию он уже есть в пакете Django, и в принципе может выполнять всё, что вам нужно.</p><h2>DTL не делает то, что мне нужно, могу я использовать Jinja2?</h2><p>Всё равно используйте DTL.</p><p>Наиболее частая претензия: “DTL недостаточно гибкий”. Но нужно учитывать, что есть определённые алгоритмы, реализовать которые на шаблонном языке невозможно.</p><p>Запомните, все “мозги” вы содержите во Views, а шаблоны выступают в роли визуализаторов.</p><h2>Что использовать для запуска Django — uWSGI или Gunicorn?</h2><p>Однозначно <a href="https://gunicorn.org/">Gunicorn</a>.</p><p>Gunicorn — автономный WSGI HTTP сервер, довольно неплохой, развёртывание происходит быстро и просто.</p><p>uWSGI предоставляет полный стек для построения хостинг-сервисов, если это то, что вам нужно — используйте его.</p><h2>Где мне стоит разворачивать своё приложение?</h2><p>В качестве примера посмотрите, <a href="https://tproger.ru/translations/telegram-bot-create-and-deploy/">как написать Telegram-бот на Python и задеплоить его на Heroku</a>.</p><p>Если вам нужно больше управляемости или вы привязаны к AWS, то используйте AWS Elastic Beanstalk.</p><p>Вы, конечно, можете взять простенькую VM, установить туда nginx и настроить всё сами. Но зачем, если для этого уже существуют готовые решения?</p><p>Создать свою собственную платформу то же самое, что написать новую ОС. Зачем возиться?</p><h2>Что использовать для обслуживания статических файлов?</h2><p><a href="http://whitenoise.evans.io/en/stable/">Whitenoise</a>.</p><p>Amazon S3, Nginx, Apache — все они хороши, но Whitenoise относительно маленькая библиотека, которая помогает обслуживать статические файлы без использования сторонних сервисов.</p><h2>Я пытаюсь заставить панель администратора сделать …</h2><p>Может быть, не надо? Панель администратора Django — хорошая штука, но ссылаясь на официальную документацию:</p><blockquote>Возможности панели ограничены. Она не предназначена для того, чтобы в неё ещё что-нибудь добавляли.<br />У панели администратора есть много возможностей для кастомизации, но не переусердствуйте. Если вам нужен более процессо-ориентированный интерфейс, который абстрагирует базы данных, поля и таблицы, время задуматься о написании своей панели.</blockquote><p>Если вы до сих пор ломаете голову, как подстроить администратора под себя, — перестаньте. Пойдите и попробуйте сделать что-нибудь с <a href="https://docs.djangoproject.com/en/2.1/ref/class-based-views/">generic views</a>.</p><h2>Какую базу данных использовать?</h2><p><a href="https://www.postgresql.org/">PostgreSQL</a>.</p><p>Она просто работает.</p><h2>Стоит ли разделять файл конфигурации между разработкой и продакшном?</h2><p>Нет, не стоит.</p><p><a href="https://12factor.net/config">Twelve-Factor App</a> охватывает ряд причин, по которым файлы конфигурации в приложении для каждой среды могут быть проблематичными, и почему вместо этого стоит использовать переменные окружения. <a href="https://github.com/doismellburning/django12factor/">django12factor</a> и другие приложения помогут вам получить конфигурацию из окружения.</p><h2>Стоит ли использовать кастомную модель пользователя?</h2><p>Из официальной документации:</p><blockquote>При запуске нового проекта настоятельно рекомендуется настроить модель пользователя, даже если вам достаточно установок по умолчанию. Эта модель будет вести себя идентично модели по умолчанию, но вы сможете модифицировать её в будущем, если возникнет необходимость.</blockquote><p>Если вы находитесь посреди процесса разработки, всё немного сложнее…</p><blockquote>Это изменение не может быть сделано автоматически и требует ручной работы, перемещения данных из старой таблицы пользователя и, возможно, ручного повторного применения некоторых миграций.</blockquote>]]></content:encoded>
    </item>
    <item>
      <title>ИБ-специалист из SCRT обнаружил возможность удаленного запуска кода на серверах Facebook</title>
      <link>https://tproger.ru/news/scrt-facebook-sentry-vulnerability</link>
      <comments>https://tproger.ru/news/scrt-facebook-sentry-vulnerability?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Тимур Кондратьев]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/scrt-facebook-sentry-vulnerability</guid>
      <description><![CDATA[<p>Специалист SCRT Даниэль Ле Галл обнаружил брешь в сервисе логов Sentry на Django: она позволяла подделать сессию и выполнить PoC-скрипт.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/scrt-facebook-sentry-vulnerability">ИБ-специалист из SCRT обнаружил возможность удаленного запуска кода на серверах Facebook</a>»</p>]]></description>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 25 Aug 2018 18:06:42 GMT</pubDate>
      <content:encoded><![CDATA[<p>Даниэль Ле Галл (Daniel Le Gall), сотрудник компании в области кибербезопасности SCRT, <a href="https://blog.scrt.ch/2018/08/24/remote-code-execution-on-a-facebook-server/">рассказал</a> о найденной им уязвимости в одном из серверов Facebook. Проблема заключается в работе веб-приложения Sentry для хранения логов, написанном на Python с использованием фреймворка Django. Специалисты Facebook уже залатали брешь в безопасности сервера.</p><h3>Дыра в Sentry</h3><p>Даниэль обнаружил проблему во время сканирования IP-адресов, принадлежащих социальной сети. На одном из них находился сервис Sentry с именем хоста sentryagreements.thefacebook.com. При рассмотрении приложения специалист заметил трассировку стека, появляющуюся по неожиданной причине, и проблемы с функцией сброса пользовательского пароля. По его словам, режим отладки Django не был отключен, поэтому трассировка раскрыла все окружение программы:</p><figure><img src="https://media.tproger.ru/uploads/2018/08/facebook_crash.png" alt="" /></figure><p>Покопавшись в списке вызванных методов, специалист SCRT обнаружил среди ключей среды SESSION_SERIALIZER, который относился к методу django.contrib.sessions.serializers.PickleSerializer. Даниэль уточнил, что с помощью подделки сессии, содержащей произвольный контент бинарного протокола <a href="https://www.balda.ch/posts/2013/Jun/23/python-web-frameworks-pickle/">Pickle</a> для сериализации объектов в Python, в системе можно запустить любой код. Для доступа к сессии ему был необходим секретный ключ Django, который оказался в списке настроек Sentry в незашифрованном виде под названием system.secret-key:</p><figure><img src="https://media.tproger.ru/uploads/2018/08/facebook_leak.png" alt="" /></figure><h3>Эксплуатация уязвимости</h3><p>Исследователь написал proof-of-concept-скрипт, который менял существующее содержимое cookie-файлов sentrysid на произвольный объект и заставлял страницу загружаться на 30 секунд дольше:</p><p>После чего он отправил Facebook информацию об уязвимости и получил 5000 $ в рамках программы Bug Bounty. Специалисты компании устранили брешь через 10 дней после получения уведомления.</p><p>Программа поиска проблем с безопасностью в Facebook <a href="https://tproger.ru/translations/bug-bounty-programs/">занимает</a> 3 место среди самых высокооплачиваемых инициатив Bug Bounty. Минимальная выплата составляет 500 $, а потолка у вознаграждений нет.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как использовать отладчик pdb для Python приложений</title>
      <link>https://tproger.ru/translations/debugging-python-with-pdb</link>
      <comments>https://tproger.ru/translations/debugging-python-with-pdb?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Кирилл Поздеев]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/debugging-python-with-pdb</guid>
      <description><![CDATA[<p>Встроенный отладчик pdb позволяет искать ошибки в Python-коде прямо во время работы программы, без правок с print() и перезапуска приложения.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/debugging-python-with-pdb">Как использовать отладчик pdb для Python приложений</a>»</p>]]></description>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Отладка]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 05 Aug 2018 10:38:33 GMT</pubDate>
      <content:encoded><![CDATA[<p>pdb — это встроенный отладчик для Python, который, в отличие от print(), позволяет отлаживать программу в процессе её работы.</p><h2>Отладка Python-кода с помощью print</h2><p>Как уже говорилось ранее, кто-то используют print() для отображения информации, которая помогает понять, что происходит в коде. Кто-то использует логи для тех же целей, но давайте не путать использование логов на продакшене и случаи, когда их используют во время поиска багов в коде и после удаляют.</p><p>Но самая большая проблема в использовании print() – это необходимость вносить изменения в код и перезапускать приложение, чтобы увидеть изменения. Давайте разберёмся, почему отладчики эффективнее.</p><h2>Команды Python-отладчика</h2><p>Главная задача отладчика – предоставить возможность заглянуть в процесс выполнения кода. Так, например, можно просмотреть стек вызовов, узнать значения переменных, установить брейкпоинты или запустить выполнение кода построчно. Можно провести аналогию с тем, как автомеханик заглядывает под капот автомобиля и начинает перебирать деталь за деталью, пока не найдет причину поломки.</p><p>Если вы работаете с Python, то можете не только просматривать код во время отладки, но даже запускать код из командной строки или изменять значения переменных на лету.</p><p>Python есть встроенный отладчик под названием pdb. Это простая консольная утилита, которая обладает основной функциональностью для отладки кода. Но если вы ищете что-то более продвинутое, то стоит обратить внимание на ipdb – отладчик с функциональностью из IPython.</p><p>Проще всего вызвать отладчик pdb из кода, где вы работаете:</p><p>Как только интерпретатор доберётся до этой строчки, запустится отладчик и в консоли будут доступны новые команды.</p><h3>list()</h3><p>Эта команда покажет часть кода, на выполнении которой сейчас находится интерпретатор. Можно передать два аргумента first и last для просмотра определённого участка кода. Если указать только first, то будет выведен код вокруг искомой строки.</p><h3>up(p) и down(d)</h3><p>Эти команды используются для передвижения по стеку вызовов. С их помощью можно отследить, откуда была вызвана текущая функция.</p><h3>step() и next()</h3><p>Другая пара не менее важных команд. С их помощью можно выполнять код построчно. Единственное различие между ними в том, что next() перейдёт к следующей строке вне зависимости от вызываемых функций, а step() перейдёт в вызванную функцию, если это возможно.</p><h3>break()</h3><p>Эта команда позволяет создавать брейкпоинты без внесений изменений в код. Ниже разберём этот этап более детально.</p><p>Краткий список команд отладчика pdb:</p><ul><li>args() — выводит аргументы функции;</li><li>continue() или (cont) — продолжит выполнение до первого брейкпоинта или до завершения программы;</li><li>help() — выводит список доступных команд или подсказки по определённой команде;</li><li>jump() — перепрыгивает к выполнению указанной строчки кода;</li><li>list() — выводит исходный код программы вокруг выбранной строки;</li><li>expression() — выводит значение выражения;</li><li>pp — выводит значение в «красивом» виде;</li><li>quit или exit() — отменяет выполнение программы;</li><li>return() — завершает выполнение текущей функции.</li></ul><h2>Продолжаем изучать Python-отладчик</h2><p>Рассмотренный ранее способ работы с отладчиком требовал внесения изменения в код для вывода чего-нибудь или установки брейкпоинта. Но часто при работе с внешними библиотеками появляется необходимость в их отладке. Конечно, можно открыть исходный код библиотеки и вызвать pdb.</p><p>Но теперь есть возможность запускать приложение напрямую из отладчика без внесения изменения в код. Для этого воспользуемся следующей командой:</p><p>Давайте разберём на примере. Есть простое приложение, которое отслеживает рабочее время. Для её работы используется библиотека requests, отвечающая за выполнение HTTP-запросов. Попробуем прервать выполнение во время запроса. Как это сделать? Запустим приложение через отладчик и установим брейкпоинт внутри библиотеки requests.</p><p>Как можно заметить, не нужно указывать полный путь до библиотеки. Можно указать относительную ссылку от sys.path. Таким же образом можно отлаживать и ваше приложение.</p><p>Теперь куда проще отлаживать код. Не надо вносить изменения в приложение или во внешние библиотеки.</p><p>Но что делать, если в приложении происходит много вызовов, а вам надо обработать только какой-то определённый? Можно точно указать условие, при выполнении которого отладчик будет прерывать выполнение приложения.</p><p>В данном примере прерывание произойдёт только в случае, если json будет иметь в себе ключ time_entry.</p><h2>Отладка кода Django</h2><p>Если вы используете Django, то скорее всего знаете, что, если в настройках значение параметра DEBUG установлено как True, то для каждого исключения будет выводиться отдельная страница с указанием типа исключения, стек вызовов, локальные переменные и т.д.</p><p>Если вы хотите прокачать отладчик, то установите<a href="https://django-extensions.readthedocs.io/en/latest/"> django-extensions</a> и используйте команду runserver_plus для запуска сервера. Также можно указать пароль для доступа к отладке следующей командой:</p><p>Прим. перев.  В Werkzeug, начиная с версии 0.11, появилась возможность доступа по паролю к отладчику. Это сделано для повышения безопасности при попытках несанкционированного доступа.</p><p>Если вы используете django-extensions, то получите страницу со всеми вызовами, кодом и окном отладчика.</p><p>Процесс отладки осуществляется с помощью WSGI библиотеки<a href="http://werkzeug.pocoo.org/"> Werkzeug</a>.</p><p>Существует множество способов отладки приложений, но специализированные инструменты могут дать вам огромное преимущество по сравнению с другими разработчиками и помогут сэкономить время и силы при поиске багов. Cреды разработки предлагают широкий выбор средств отладки, подробнее о них в нашей <a href="https://tproger.ru/translations/python-ide/">подборке лучших IDE и редакторов кода для Python</a>.</p>]]></content:encoded>
    </item>
  </channel>
</rss>