Оптимизация Django. 8 - Redis и ручной кеш

Поделиться
HTML-код
  • Опубликовано: 27 ноя 2024

Комментарии • 62

  • @hhhscvx
    @hhhscvx 6 месяцев назад +3

    видос топ
    наконец то нашел нормальное объяснение работы redis с джанго

  • @Rulezzz3
    @Rulezzz3 11 месяцев назад +2

    Отличные видео. Спасибо автору, продолжай снимать. Хейтеры всегда будут, и не снимут свои видео лучше вашего. Очень нравится такая подача материала

  • @dimuha82
    @dimuha82 Год назад

    Огромное спасибо за курс! Освещено много нюансов про которых даже в платных курсах нет инфы.

  • @МурадАхмедов-ч1с
    @МурадАхмедов-ч1с Год назад +1

    Ты просто гигант, Celery примеры просто бомба, особенно всякие побочные проблемы

  • @shaxzodnizamov9773
    @shaxzodnizamov9773 Год назад +5

    Можно ещё delete метод модели Subscription переопределить и не юзать сигналы)

  • @Chel1k7
    @Chel1k7 Год назад +1

    При такой реализации метода, при изменении тарифного плана в уже созданном объекте не будет меняться цена
    def save(self, *args, **kwargs):
    creating = not bool(self.id)
    result = super().save(*args, **kwargs)
    if creating:
    set_price.delay(self.id)
    return result

  • @BELLA_VESTA
    @BELLA_VESTA 5 месяцев назад

    Отличный курс!!!

  • @akimovvadim4736
    @akimovvadim4736 10 месяцев назад +2

    Хорошие видосы у тебя. Я на четвертной Джанге пробую это все делать, пока не встретил больших проблем из-за различия версий.

  • @TaimanSaidaliev
    @TaimanSaidaliev 6 месяцев назад

    Сеньор Помидорович Разработчик вы лучший!

  • @shaxdjuraev5585
    @shaxdjuraev5585 3 месяца назад

    Здравствуйте! я не хочу находить недостатки в коде, так как тут импровизация, но у вас такая проблема получилось, когда вы добавили новую запись с суммой 77, он добавился два раза в тотал прайс 459 + 154 = 613. объясняете замечательно, удачи в вашей работе.

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  3 месяца назад

      Здравствуйте! Еще бы вспомнить что там было)
      Ну да, тоже делаю ошибки , бывает.
      Спасибо за комментарий!

  • @МурадАхмедов-ч1с

    receiver можно не коннектить так в ручную, а сделать автоматически, так же можно повесить на ресивер post_save, в нем проверять создался объект или нет и там уже запускать тачку. Там будет почище, чем в модели на save вешать

  • @vadimnikadon7332
    @vadimnikadon7332 Год назад

    Супер!!! Огромное спасибо

  • @BorisenkoV89
    @BorisenkoV89 Год назад +4

    Лайк не глядя 😎

  • @shaxzodnizamov9773
    @shaxzodnizamov9773 Год назад

    Момент с определением Subscription был создан или изменен не очень нравится, так как могут вызвать save передав id Subscription(id=1, ...). Я на одном из проектом натыкался на такое. Либо self._state.adding is True нужно использовать, либо сигналы )

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  Год назад +2

      Очень плохая практика передавать id в не созданный объект. Надо делать так, как это делают , разрабатывая на Джанго.
      Я могу еще 10 способов придумать, «как делать не надо и все сломать». А зачем?

  • @begula_chan
    @begula_chan Год назад

    Благодарю за еще одно прекрасное видео по интересной теме!
    У меня вопрос, почему вы не использовали django-debug-toolbar? С ним вроде намного удобнее контролировать SQL запросы

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  Год назад +2

      С ним удобнее для веб страниц. Но если какие-то внутренние расчеты иди таски то он бесполезен

  • @ETOVIDEOBLOG-c8u
    @ETOVIDEOBLOG-c8u Год назад +2

    Забавно что в предыдущих уроках ты писал о том, что не любишь сигналы, а тут используешь.
    В целом не нужно было пихать в +100500 сейвов очистку кэша, можно было бы это сделать в одном сигнале перечислив модели.
    @receiver(pre_save, sender=Model1)
    @receiver(pre_save, sender=Model2)
    @receiver(pre_save, sender=Model3)
    def reset_cache(sender, instance, **kwargs):
    pass
    Также файлик никогда никто не называет recievers в любом проекте это файл signals.
    Настройку сигналов делают в apps в функции ready()
    from django.apps import AppConfig
    class BillingConfig(AppConfig):
    name = 'project.test'
    def ready(self):
    from project.test import signals # NOQA
    Вообщем посмотрел 8 уроков, за такой код и такую оптимизацию меня бы уволили) Отписка не глядя!

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  Год назад +7

      Не глядя уже не получится)

    • @dodokwak
      @dodokwak Год назад

      Все будут только рады, если вы покажите лучше вариант.

    • @ЮрийКлименко-к3щ
      @ЮрийКлименко-к3щ Год назад

      Почему pre_save а не post_save? Вдруг сохранить модель не получится, потеряем кэш просто так.

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  Год назад

      Ничего нет плохого в том чтобы потерять кеш просто так.

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  Год назад

      Post save пока отрабатывает может какое-то время выдаваться неактуальный кеш, а это хуже

  • @timofey-0307
    @timofey-0307 6 месяцев назад

    Привет! Вот вы сказали, что не большой любитель django сигналов, но почему? Они чем-то плохие, или вам просто не нравится? Это я спросил, чтобы понимать, стоит ли их использовать в дальнейшей разработке или лучше найти другой метод.

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  6 месяцев назад +1

      По тому что они не очевидные. Вот я сохранил модель , и где-то какие-то сигналы запустились. Если проект большой то увидеть это в когде не всегда просто. Их надо по коду искать, и более того, о них надо всегда помнить. Если я напишу код в методе save() то я всегда буду его видеть , я понимаю что он запуститься на сохранении модели.
      Но вот сигнал на delete штука полезная, его сложно чем-то заменить

    • @timofey-0307
      @timofey-0307 6 месяцев назад

      @@SeniorPomidorDeveloper спасибо за ответ и за курс!

  • @jamjam3337
    @jamjam3337 9 месяцев назад

    спасибо!

  • @nikez600
    @nikez600 Год назад

    Спасибо большое за урок! Можете пояснить для меня, почему Вы предпочитаете не использовать сигналы в Django?

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  Год назад +1

      Не вижу смысла. Точнее есть смысл там отлавливать удаление модели, но это редкий кейс. А по архитектуре, они работают неявно, (а явное лучше неявного) вызываются фреймворком где-то «под капотом», мы не видим в нашем коде когда и в каком количестве они вызываются . А если кода и их в коде много - это очень не удобно. Если просто вызывать тот же код из save() это хотя бы будет видно. А плюсов нет, они также работают синхронно, также нагружают систему, это просто архитектурное решение и по-моему не самое удачное

    • @nikez600
      @nikez600 Год назад

      @@SeniorPomidorDeveloper Еще они хорошо изолируют приложения и да, дебажить их неприятно. С Вашими аргументами согласен, лучше явное. В моем случае с сигналами приходилось комментировать в моделях на какие сигналы они завязаны

  • @ibrahimoglu
    @ibrahimoglu Год назад

    👍

  • @pretcb
    @pretcb Год назад

    Привет! Спасибо за этот урок, как раз хотел на практике пощупать cache! Очень все по делу. В методе save модели Subscription, если мы не создаем модель, а изменяем план или сервис, стоимость подписки price тоже должна пересчитываться как и total_amount, по-этому creating можно не проверять!? об этом уже писали в предыдущих комментах к урокам, но это мелочи:)

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  Год назад +3

      Я бы как-раз не делал пересчет на любые изменения. Если мы уберем проверку creating, то при изменении полей, которые не влияют, тоже будет запускаться пересчет.
      По поводу изменений плана или сервиса. Я бы наверное запретил их изменять в принципе, на уровне приложения, а сделал бы только пересоздание подписки.Но я, почему-то этого не сделал. :)

  • @1978rembo
    @1978rembo Год назад

    Здравствуйте. Не могу найти ваш профиль в GitHub.

  • @storlay
    @storlay 10 месяцев назад

    При попытке добавления нового сервиса на 16:36 ошибка 'Service' instance needs to have a primary key value before this relationship can be used.
    Проблема в переопределении метода save, не могу понять как решить её

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  10 месяцев назад

      Не понятно. Тут надо лог целиком смотреть, в нем должно быть написано

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  10 месяцев назад

      Я имею ввиду что надо смотреть трейсбек ошибки

    • @storlay
      @storlay 10 месяцев назад +1

      @@SeniorPomidorDeveloper курс бесценный я считаю, только благодаря нему смог разобраться в Celery, глубже вник в docker-compose, и узнал много нового об оптимизации
      Спасибо за курс)
      Тоже в БА кстати

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  10 месяцев назад

      Спасибо за отзыв! БА - супер! Где живешь?

    • @storlay
      @storlay 10 месяцев назад

      @@SeniorPomidorDeveloper в Палермо, Las cañitas, рядом с ипподромом. А ты где остановился?

  • @Ch1ck3nWTF
    @Ch1ck3nWTF Год назад

    Получается, что сигналы - это по сути триггеры, но на уровне питона?

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  Год назад

      Ну приблизительно.

    • @Ch1ck3nWTF
      @Ch1ck3nWTF Год назад

      @@SeniorPomidorDeveloper Спасибо ответы и курс в целом, очень толковая инфа в море хеллоуворлд'ов)

  • @akashpmani
    @akashpmani Год назад

    Hello Iam from india i didnt understand a word you said but i learned few things from this video thanks for that , can you share your github or source code of this

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  Год назад

      Namaste!
      This is the source code github.com/chepe4pi/service_app
      I love India, I have visited your country 4 times. What state are you from?

  • @Antinormanisto
    @Antinormanisto 4 месяца назад

    А откуда адрес редиски брать? 2:25

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  4 месяца назад

      Хм. Он вроде у всех одинаковый

    • @Antinormanisto
      @Antinormanisto 4 месяца назад

      @@SeniorPomidorDeveloper, благодарю

    • @Antinormanisto
      @Antinormanisto 4 месяца назад

      @@SeniorPomidorDeveloper, у меня появился новый вопрос. Я не замечал чтобы в функциях ты закрывал соединение(к примеру redis_client.close()). Если мы прописали CACHES и используем cache, то этого делать не надо? Просто в ручную, прямиком с использование библиотеки redis, надо было подключаться(redis_client = redis.Redis(host=, port=)), а в конце, когда мы понаписали всё что хотели, надо redis_client.close()

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  4 месяца назад

      @Antinormanisto @Antinormanisto наверно. Я всегда через caches использую

  • @sayhellotoroy
    @sayhellotoroy Год назад

    охереть.. здесь и тут, такой импорт. Хорошо бы называть где это "здесь" и какой именно импорт продиктовать.