• Как объединить два списка словарей без потери словаря с несовпадающим ключем на Python 3?

    @deliro
    from itertools import chain
    
    a = [{'code': 'a1', 'total1': 7}, {'code': 'a2', 'total1': 17}]
    b = [{'code': 'a1', 'total2': 55}, {'code': 'a3', 'total2': 22}]
    
    def f(a, b):
        cache = {}
        for dct in chain(a, b):
            code = dct["code"]
            cache.setdefault(code, dct).update(dct)
    
        return list(cache.values())
    
    f(a, b)


    Нули расставить по вкусу. Алгоритм ест дополнительную память, но по скорости вряд ли можно что-то быстрей.
    Ответ написан
    1 комментарий
  • Какие книги по Django посоветуете?

    @deliro
    Two scoops of Django
    Ответ написан
    Комментировать
  • Стоит ли начинающему веб-разработчику учить PHP?

    @deliro
    1. PHP актуален, седьмая версия лишний раз его "воскресила"
    2. Где он будет через 5 лет — не важно. Ровно так же не важно, где будет любой язык X через Y лет. Если ты делаешь всё правильно, то ты изучаешь не язык, не фреймворк, а программирование. Если это так — тебе не составит труда перейти на любой другой язык с той же парадигмой, если вдруг твой язык умрёт (как, например, стало с Perl)
    3. Хочешь быстрый результат — бери Python. Хочешь самый правильный результат — бери Java. Хочешь что-то посередине — бери TypeScript или PHP. TS более правильный, но молодой
    Ответ написан
    Комментировать
  • Какие препроцессоры предпочтительнее для разработки сайта?

    @deliro
    У тебя какие-то неочевидные связи. Язык почему-то должен влиять на фронт, IDE должно влиять не препроцессоры. Попахивает дилетантством.

    Лучшее, что ты можешь сейчас сделать — это разделить фронт и бэк. Фронт писать на React'е. Нужен SSR — настроить SSR. Хочешь SASS — легко. Минификацию там сделает за тебя webpack или parcel. ES6 в ES5 переведёт babel.

    А пихать в джангу какие-то фронтовые кишки — ну это прям фу.
    Ответ написан
    7 комментариев
  • Как использовать шаблонизатор django в css?

    @deliro
    Django шаблонизатор — это самый обычный текстовый шаблонизатор, который не зависит от того, к чему ты ты его пытаешься применить — HTML, py-код, CSS, не важно.

    Другое дело, что CSS принято передавать отдельным файлом и кэшировать на стороне браузера. Если ты каждый запрос будешь ворошить многокилобайтный файл, то это будет не только долго на стороне сервера, но и глупо на стороне клиента, ведь в CSS файле не будет никакого смысла, если он будет меняться каждый запрос.
    Ответ написан
    Комментировать
  • Не тривиальный пример библиотеки Logger в python?

    @deliro
    Несколько лет назад я (видимо, как и ты) уверовал в logging. Ведь не зря же там такие дикие и глубокие настройки: и форматтеры есть, и хэндлеры есть, да и фильтры какие-то. И подумал я: крутые программисты всё это используют, а я на задворках рынка побираюсь.

    И начал с тех пор настраивать все мыслимые и немыслимые настройки logging. Все ошибки у меня были в соответствующих файлах для ошибок. Также, был лог с дебаговой инфой. Всё это группировалось по файлам. Дебаг форматировался одним форматтером, ошибочный лог — другим форматтером, более подробным. И всё это росло, цвело и пахло.

    Реальность оказалась жестокой. Все эти форматтеры оказались абузой — грепать логи стало сложней. Отдельные файлы с дебагом и ошибками оказались абузой — ведь проще грепнуть по уровню лога ( | grep ERROR). В куче файлов логов — чёрт ногу сломит. Да и вообще, логи почти всегда оказывались ненужными — ошибки летят в Sentry, а статистика собирается другими механизмами (prometheus). А ротацию и архивирование логов сделали девопсы.

    А вот хорошие практики, которые я вынес:
    1. Возьми loguru, которому буквально не нужны настройки:

    from loguru import logger
    ...
    # Где-то настроил sink-файл (либо будет только stdout)
    ...
    logger.debug("hello")


    2. Иногда удобно логи вести в JSON-формате. Отпадает необходимость придумывать хитрые grep'ы, всё отлично фильтруется с помощью jq

    3. Ошибки надо не логировать, а слать в Sentry. Желательно, если Sentry настроен на веб-хуки в какой-нибудь slack/discord, чтобы ты видел ошибку в ту же секунду, как она произошла. В Sentry должен быть порядок.

    4. Статистику по логам не стоит строить. Для этого есть куда более удобные и быстрые инструменты от обычных баз данных до prometheus + grafana

    5. Куча файлов логов — в топку. Один файл

    6. Ротация логов желательно должна быть извне

    7. Используй ELK

    8. Используй тесты и дебаггер

    Если резюмировать: на логи возлагают слишком большие надежды и ожидания. Логи — это побочный продукт, который ОЧЕНЬ РЕДКО помогает расследовать неожиданное поведение, причём, очень неудобным способом. Чаще всего, логами обкладывается недостаточно нужной информации и много ненужной информации. И в момент аварии логов не хватает, на то ведь она и авария — её нельзя предусмотреть. Вместо логгирования в большинстве случаев удобнее использовать другие инструменты. Также, советую ознакомиться с этим https://sobolevn.me/2020/03/do-not-log
    Ответ написан
    1 комментарий
  • Аннотации Python?

    @deliro
    Серьёзные проекты всегда пользуются, сверху опционально добавляя mypy. С аннотациями типов жить становится сильно проще. Это радикально облегчает понимание кода в дальнейшем, его поддержку и, особенно, работу в команде. Также, аннотации заставляют лучше проектировать архитектуру проекта, использовать интерфейсы вместо конкретных реализаций (в питоне, правда, это ABC) и вовсю использовать полиморфизм.

    А с появлением чудо-pydantic'а жить стало ещё лучше. Ну и fastapi, построенном поверх него и starlette.

    Те, кто аннотации не используют, ни разу не разрабатывали ничего сложнее интернет-магазинчика в одно лицо и не поддерживали проект по 2+ лет.
    Ответ написан
    1 комментарий
  • Для Django на Frontend какой js использовать лучше?

    @deliro
    Вообще пофигу
    Ответ написан
    Комментировать
  • Влияет ли на скорость и как запуск асинхронного серверного фреймворка типа fast_api или starlette в докере?

    @deliro
    Конечно, у докера есть оверхэд. В реальности ты его не заметишь.

    Проектировать приложение нужно так, чтобы оно могло масштабироваться горизонтально. Не стоит думать, что разница между приложением, запущенным прямо на VPS и приложением, запущенным в докере на этом же VPS — это "вот как раз то, чего не хватало". Если CPU/Networking упирается в 100%, то это повод разворачивать ещё несколько идентичных серверов и размазывать нагрузку. А это в сто раз легче сделать, если у тебя контейнеры.

    Более детальный анализ: https://stackoverflow.com/questions/21889053/what-...
    Ответ написан
    Комментировать
  • Как отсортировать список при помощи lambda?

    @deliro
    Поставь минус перед len, будет в обратном порядке по длине
    Ответ написан
    Комментировать
  • Как удалить значение из кэша в Django?

    @deliro
    Если данные в БД изменяются только через Django-приложение, то проще всего повесить хендлер на сигнал на сохранение/удаление модели и вычищать кэш.

    https://docs.djangoproject.com/en/3.1/topics/signals/
    Ответ написан
    6 комментариев
  • Добавлять ли sourcemaps на готовый сайт?

    @deliro
    Добавлять сорцмапы на прод не надо. Но их надо генерировать и заливать в sentry, чтобы падения фронта можно было анализировать.
    Ответ написан
    Комментировать
  • Насколько ui библиотеки замедляют приложение?

    @deliro
    Тормознутость и трафик — разные вещи. Если вам важно экономить байтики — пишите своё и экономьте. Если ваша ЦА живёт там, где 3G — новинка — пишите своё и экономьте. Если нет — не занимайтесь ерундой, а выбирайте удобный инструменты.

    То же касается и "тормознутости". Если ваша ЦА юзает низкобюджетные смартфоны до 200$ — придётся оптимизировать. Иначе — не занимайтесь ерундой.

    Как залагает, тогда профилируйте. Кстати, у Vuetify есть мод a la carte. Там работает tree shaking.
    Ответ написан
    Комментировать
  • Авторизация на секретных куках, это плохая практика в моем случае?

    @deliro
    В целом, это неплохо с некоторыми оговорками:
    1. Нельзя отозвать сессии
    2. Нельзя хранить там что-то изменяющееся и критичное, т.к. все предыдущие куки, которые ты выдал, будут валидными, даже если ты выдал новую
    3. Потеря секрета = возможность хакеру выдать себе любую сессию
    Ответ написан
    Комментировать
  • Как получить подобный список [b'\x01', b'\x02', b'\x03', ...]?

    @deliro
    [bytes([x]) for x in range(1, 4)]
    Ответ написан
    Комментировать
  • Простая БД/Хранилище без SQL на python?

    @deliro
    shelve
    Ответ написан
    Комментировать
  • Получение модели из подключенной базы MYSQL?

    @deliro
    Мне нужно получить из подключенной в settings.py базы данных MYSQl заранее созданную ( не в моем коде) модель

    Тык

    которая может измениться, и эти изменения должны быть также и у меня

    Никак, кроме как по тому, что в какой-то момент твоё приложение начнёт падать, если какие-то столбцы из таблицы удалят или изменят
    Ответ написан
  • Где хранить сессии? SQLite? MySQL? Memcached? Redis? FS?

    @deliro
    SQLite и ФС — абсолютно не подходят, если приложение будет масштабироваться

    Серверы БД (MySQL/PostgreSQL/etc.) — надёжный но самый медленный вариант

    In-memory БД (Redis/memcached) — отличный вариант, из всех выше, самый производительный, но можно упереться в оперативку

    Signed Cookie Session (и его частный случай — JWT) — неописанный тобой вариант, самый экономный по памяти и диску и самый производительный. Сессия хранится прямо в куке. Сами данные сериализуются, например, JSON'ом и сжимаются, например, gzip'ом (но можно и msgpack + lzma взять, как угодно). После, чтобы пользователь (или хакер) не поменял куку по своему желанию, она подписывается, например, HMAC'ом + любой криптостойкой хэш-функцией
    Из плюсов: 0 байт занятой оперативы (кроме момента выполнения запроса), 0 байт занимаемого места на диске, нет зависимостей от баз данных
    Из минусов: нет возможности "разлогинить все остальные сессии" по запросу пользователя, небольшой сетевой оверхэд, так как сессия от браузера отправляется на каждый запрос, ограничение на размер данных в сессии, потому что данных должны влезть в куку, включая подпись и разделители. Но ради эксперимента, мне удалось засунуть в такую сессию первую главу Войны и мира сжатой, прежде чем упереться в лимит.
    Ответ написан