Бекенд на Django, Урок 5: CRUD через REST Framework

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

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

  • @sayhellotoroy
    @sayhellotoroy 2 года назад +17

    Мне cookies вообще не приходит в Postman
    Однако работает если в хедерах постмана дать 3 вещи key:value следующим образом:
    Cookie: sessionid=91cjecs319qpoqzy9dbhxni83tdqqyh1
    X-CSRFToken: bY1H6xcLhNyAKmdzwndMfFxVun7ozJXb
    Cookie: csrftoken=bY1H6xcLhNyAKmdzwndMfFxVun7ozJXb

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

      Спасибо, помогло.
      Аналогино, в Postman v10.10.9 не отображаются Cookie, но их легко посмотреть в браузере.

    • @Pavel-er4hy
      @Pavel-er4hy Год назад +3

      @@RomanBog Отображаются. Надо первым делом сделать гет запрос 127.0.0.1:8000/admin/
      тогда приходят все нужные ключи их вводишь уже
      127.0.0.1:8000/book/
      в этом чате ниже есть разбор и решение. что нужно через админа зайти в постмэне, чтобы получить ключ

    • @Pavel-er4hy
      @Pavel-er4hy Год назад +1

      @@RomanBog Ещё обрати внимание по переходам в меню сеньора поминадора. Я тоже просидел 15 минут в освоении ключей, потому что был не в тех вкладках.

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

      Спасибо

    • @МаксГла
      @МаксГла 8 месяцев назад

      спасибо! помогло, только как это работает?

  • @kittyanalytics
    @kittyanalytics 4 года назад +40

    Спасибо большое за уроки!
    У кого проблема с CSRF Failed: CSRF cookie not set. Добавляйте в хедер, помимо того, что добавил автор, еще одну куку Cookie: csrftoken=%Ваш токен%. Итого у вас получится следующая структура:
    1) X-CSRFToken: %Токен%
    2) Cookie: sessionid=%ID%
    3) Cookie: csrftoken=%Токен%

    • @sergeytwin
      @sergeytwin 3 года назад

      от души. два дня бился

    • @jimlabable
      @jimlabable 3 года назад +2

      у меня так не сработало, а вот по комменту ниже Да, сначала ввести 127.0.0.1:8000/admin/store/book/, причем без http

    • @ВасилийКатичев-м3е
      @ВасилийКатичев-м3е 3 года назад

      @@jimlabable Спасибо, сработало!

    • @RusFarFaz
      @RusFarFaz 2 года назад +1

      Спасибо!:)

    • @crazymonkey2833
      @crazymonkey2833 2 года назад

      @@jimlabable Спасибо, помогло

  • @ЕвгенийВойтик-ю6п
    @ЕвгенийВойтик-ю6п 4 года назад +6

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

  • @МаксимНовиков-ь4ц
    @МаксимНовиков-ь4ц Год назад +1

    Спасибо большое за контент. Особенно порадовала инфа про sessionid и csrf token. И за тесты респект.

  • @ВладКурлук
    @ВладКурлук 4 года назад +2

    Красавчик. Слежу за твоим сериалом, и меня радует такой мега полезный контент. Все очень доступно и понятно, в общем спасибо тебе за труд!!!!

  • @standust119
    @standust119 4 года назад +2

    Большое спасибо за Ваши уроки! Очень полезные вещи про postman, получение данных из браузера и тесты

  • @alexey_horbunov
    @alexey_horbunov 4 года назад +7

    Большое спасибо, уроки просто супер. Также оставляйте в описании ссылку на поддержку канала. Такой труд должен быть оплачен)

  • @devZu9
    @devZu9 2 года назад +1

    Просто нет слов, от восхищения. Ну настолько всё последовательно и понятно. Удивительно как же это всё просто по сравнению со встроенным в джанго механизмом через создание view функций или классов.

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  2 года назад +1

      А написано «недовольный» )

    • @smokibits4365
      @smokibits4365 2 года назад +1

      @@SeniorPomidorDeveloper 🤣🤣🤣🤣🤣🤣🤣

  • @kirillkruglov1418
    @kirillkruglov1418 4 года назад +1

    Это великолепно! Настолько качественное объяснение что я даже смог сам сделать test_delete )))
    Присоединяюсь к остальным студентам: такой труд стоит благодарности, прикрутите поддержку канала, пожалуйста)

  • @AlexGott
    @AlexGott 4 года назад

    Урок наконец то пройден, спасибо большое, очень жду новые уроки по этой теме.

  • @nurlan6573
    @nurlan6573 2 года назад

    Спасибо за науку. Для тех, кто мучается с новым Постменом (как я): обновленный постмен отдельно создает куки вверху списка с совершенно другим значением CSRF - его и надо вставить в X-CSRF...

  • @svyatcode6412
    @svyatcode6412 4 года назад +1

    Спасибо большое!!! Очень понятные и информативные уроки

  • @AS-fk5fw
    @AS-fk5fw 3 года назад

    Супер, что ты уделяешь такое большое внимание тестам, TDD рулит!

  • @a98cb985
    @a98cb985 2 года назад +1

    Очень хорошо. За тесты два лайка

  • @benjamincoinbull4009
    @benjamincoinbull4009 3 года назад +1

    Алексей, было бы круто если бы Вы сделали курс по Джанго дебагеру) Спасибо Вам за Вашу работу!

  • @ipsorus
    @ipsorus 3 года назад +1

    Можно еще на вкладке Authorization ввести логин и пароль от админки. И будет все работать без куков. Но с целью получения опыта в работе с куки это нужное дело! Это касается только авторизации, CSRF все равно придется прописывать. Мне помог коммент ниже разобраться с ошибкой CSRF Failed: CSRF cookie not set.

  • @ToxicBugsy
    @ToxicBugsy 2 года назад

    Как же топово. Спасибо!

  • @adminadmin6569
    @adminadmin6569 4 года назад +1

    Спасибо я решил вопрос))) Спасибо за уроки!

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

    спасибо!👏

  • @point_crash
    @point_crash 2 года назад

    Спасибо!
    Лучший!

  • @yawneed
    @yawneed 4 года назад +5

    А что делать, если как на 10:58 нет куков?

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  4 года назад

      Проверить что есть правильный sessionid, можно попробовать взять этот csrftoken из другого запроса . Можно хоть из браузера попробовать взять

    • @AlexGott
      @AlexGott 4 года назад

      @@SeniorPomidorDeveloper та же проблема - не приходит в постман ничего, из хрома не принимается, джанга 3.1

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  4 года назад

      Гляну в чем может быть дело..

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  4 года назад

      Странно, никак не могу воспроизвести. Даже если вообще не передаю данных никаких headers или запрос на 403 или 500 , у меня всегда этот Cookie приходит с csrftoken...

    • @AlexGott
      @AlexGott 4 года назад

      @@SeniorPomidorDeveloper окей спасибо, будем смотреть что не так, мне что то кажется разные настройки по дефолту в джанге разных версий

  • @exe88cution
    @exe88cution 3 года назад

    Топ, спасибо большое

  • @dizzivoneverec2737
    @dizzivoneverec2737 3 года назад

    Пишу комментарий чтобы по быстрей вышли новые ролики))

  • @dodokwak
    @dodokwak 3 года назад

    Всё -таки подход с TDD помогает подготовиться ко всякого рода неожиданностям. Стоило мне в attr model добавить ImageField как проснулась настройка parser_classes с необходимостью encode_multipart и проч. прелестями того, что в джанго templates за тебя делает сама джанга, и которые воспринимаются как само собой разумеющ-ся.
    осталось только осилить необходимое setattr(request.data, '_mutable', True) в методе create() и можно успокоиться.

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  3 года назад +1

      TDD сила , а без тестов вообще никуда

    • @dodokwak
      @dodokwak 3 года назад

      @@SeniorPomidorDeveloper Я вам очень,Алексей благодарна, что вы смогли эту тему так преподнести. раньше меня при слове тестирование одолевала только тоска.

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  3 года назад +2

      Рад стараться. Тема правда очень важная и про неё очень мало говорят на курсах . У нас в проекте , на моей основной работе , сейчас более 5000 тестов и когда мы изменяем код постоянно что-то где-то сломается . Стабильный код это наверно самое главное для бизнеса , точно важнее чем скорость , так что изучайте тесты глубже, обязательно пригодится .

  • @АлексМорозов-с2ю
    @АлексМорозов-с2ю 3 года назад

    Вы себе представить не можете, как вы мне помогли этим курсом. Спасибо огромное!!! А есть куда вам денек закинуть в качестве обмена?

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

      Все ок , денег не надо ! Вам спасибо что посмотрели !

  • @adminadmin6569
    @adminadmin6569 4 года назад +1

    Подскажите пожалуйста в postman, сервер не отправляет cookies CSRF token, который вы копируете. Я скопировал csrftoken с браузера и вставил в postmen но это не сработала.

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  4 года назад +1

      Обсуждали эту тему в комментариях ниже, поищите , пожалуйста , там есть решение .

    • @RuslanSkiraUkraine
      @RuslanSkiraUkraine 3 года назад +1

      @@SeniorPomidorDeveloper Ненашел(

  • @life_is_madness3626
    @life_is_madness3626 2 года назад

    Т.е сервер отправляет csrf токен как куки, если изначально его не было? Можно же тогда с вредоносного сайта отправить еще раз запрос, уже с этим токеном, не очень понял момент этот)

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  2 года назад

      Куки связаны с этим доменом. У вредоносного сайта будет свои куки , он не будет видеть токен , которые выдал наш сайт .

    • @life_is_madness3626
      @life_is_madness3626 2 года назад

      @@SeniorPomidorDeveloper понял, спасибо:)

  • @dmitriyn164
    @dmitriyn164 2 года назад

    Добрый день, у меня есть таблица на js которую можно менять на лету, и отправлять данные на сервер.
    Кнопка сохранить формирует список объектов, как правильно мне их отправить на сервер?

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  2 года назад

      Добрый день! Напишите в телеграмм канал , и подробнее, может там кто-то подскажет . Ссылка в шапке профиля

  • @dodokwak
    @dodokwak 4 года назад +1

    А кто-то делал unittests c auth на jwt? если с вариантом Алексея на основе сессий проходит краткий вариант client.force_login(user), то с jwt такий номер похоже не прокатывает. пока пробую пройти полный путь auth in setUp, но пока с умененным успехом.

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  4 года назад

      Да, может там как-то по-другому нужно логинить юзера

    • @dodokwak
      @dodokwak 4 года назад +1

      @@SeniorPomidorDeveloper Thx.Получилось бе3 особых выдумок с помощью .client.force_authenticate(user). иногда документацию нужно читать раньше,чем бросаться в stackoverflow

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  4 года назад

      😀

  • @romanm.4763
    @romanm.4763 2 года назад

    Почему-то не запускаются тесты по команде "python manage.py test". Тесты работают только если ткнуть "manage.py test" носом в конкретный тест ("python manage.py test store.tests.test_serializers") или в конкретную директорию с тестами ("python manage.py test store\tests").
    Сколько не бился (--pattern, __init__.py ...), но добиться запуска тестов с рекурсивным проходом по всем директориям - не смог.
    Среда разработки: Win10, VSCode, Python 3.10, Django 3.2

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  2 года назад

      А что пишут когда не запускаются ?

    • @romanm.4763
      @romanm.4763 2 года назад

      @@SeniorPomidorDeveloper спасибо за ответ! Ошибок нет. Просто
      "System check identified no issues (0 silenced).
      Ran 0 tests in 0.000s
      OK"
      Погуглил. Создал файл __init__.py в директории tests. Не помогло. Пока отложил решение этой проблемы. Со временем перейду на linux и надеюсь там будет все ок. Просто грешу на windows 10. Она, на мой взгляд, неудобна и неподходящая для ВЭБ разработки (Ну кроме .net)

    • @ИванБыков-д8х
      @ИванБыков-д8х 2 года назад

      @@romanm.4763 С windows10 все нормально, попробуй PyCharm

  • @Ssmm3712
    @Ssmm3712 2 года назад

    А для чего мы дампим дату в тестах на пост методе?

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  2 года назад

      Эээ. Честно говоря, уже не помню )

    • @MrCipec
      @MrCipec 2 года назад

      чтобы сериализовать наш написанный питон словарь в json

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

    Это было самое ленивое что я видел, скопировать Cookie и вставить)))) вроде быстрее было написать

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

      🤣 ну да, согласен) копипаст надежнее просто. Привычка осталась.

  • @navin2739
    @navin2739 4 года назад

    Помоги, пожалуйста.
    у меня есть JSON, получаю его с другого сайта, там он постоянно обновляется.
    хочу сделать автоматизацию загрузки данных в БД.
    Это можно через rest_framework сделать или я ни там копаю?
    Я сделал через fixtures, но это ни то что мне нужно(((

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  4 года назад +1

      Rest это не совсем для этого . Получаем файл через http запрос через requests , парсим его , полученные данные сохраняем в базу . В двух словах так . Нужно гуглить про парсинг данных , сохранять в базу нужно через создание объектов через ORM

    • @navin2739
      @navin2739 4 года назад

      @@SeniorPomidorDeveloper @Senior Pomidor Developer парсинг через requests библиотеку делаю, получаю json, мне это и нужно, короче с парсингом проблем нету.
      Проблема с сохранением в бд.((
      Спасибо в любом случае, я понял, пойду дальше читать.
      Отпишусь потом

    • @navin2739
      @navin2739 4 года назад

      @@SeniorPomidorDeveloper Спасибо, что навел на правильный путь, все получилось.
      Однако остался маленький вопрос.
      Слушай может у тебя telegram, skype есть или еще что-то подобное, а то тут не очень удобно писать, доставать не буду, спрошу и отстану))

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  4 года назад

      Может лучше тут спросить? Вдруг кому-то ещё эта информация пригодится.

    • @navin2739
      @navin2739 4 года назад

      ​@@SeniorPomidorDeveloper да, но даже скрин не отправишь.
      Ладно проехали.
      Делаю сохранение в бд в файле models.py, то есть пишу весь код на сохранение всех объектов в этом файле и выходит, что помимо моделей у меня там еще и этот код.
      Так нормально делать вообще?
      Я пытался создать другой файл, в котором разместил код на сохранение объектов, но он не отрабатывает, ошибок нет.
      Собственно, когда код в models.py, то все ок, а когда в другом файле, то не работает сохранение.
      Вообще-то еще раз спасибо за помощь!)

  • @dodokwak
    @dodokwak 4 года назад

    У меня не признаётся равенство:
    self.assertEquals(15.99, self.book1.price)
    AssertionError: 15.99 != Decimal('15.99')
    Вероятно в 15.99 подозревается float...
    пришлось импортировать Decimal from decimal, а ещё и превращать с строку, чтобы 2 знака после , выдерживалось
    self.assertEqual(Decimal('15.99'), self.book1.price).
    В случае self.assertEquals(15, self.book1.price)
    сравнение int and Decimal = OK.

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  4 года назад

      Все верно. Видимо unit test умеет сравнивать int и decimal , но не умеет сравнивать decimal с float , так -как в нем не стабильное количество знаков после запятой .

  • @СтаниславРассказов-ы4м

    Не могу понять в чем беда. Тест на создание и апдейт валится тут: response = self.client.post(url, data=json_data, conent_type='application/json') с формулировкой AttributeError: 'str' object has no attribute 'items'
    Код уже повторил весь символ в символ
    Обычный requests нормально отрабатывает с теми же входными переменными.
    Куда копать? python 3.10

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  3 года назад +1

      Попробуйте сравнить с кодом github.com/chepe4pi/books_lessons/tree/day_5/books

    • @АндрейСмагур-з3ф
      @АндрейСмагур-з3ф 2 года назад

      Не создавайте отдельную переменную - json_data. response = self.client.post(url, json.dumps(data), content_type="application/json"_

  • @darkhanaaaa
    @darkhanaaaa 4 года назад

    В чем различие modelviewset и Generic views

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  4 года назад

      ModelViewSet нужен для работы с моделью через CRUD, методами GET, POST, PUT, DELETE
      а GenericViewSet не имеет никаких методов связанных с запросами.

  • @habitML
    @habitML 2 года назад

    Не знаю проверял ли кто нибудь или нет, но попробуйте поработать в браузере мозила, там очень удобное отображение json.

    • @Sergey-cz7ym
      @Sergey-cz7ym Год назад +1

      Если в хром добавить плагин JSON Formatter, то будет еще удобнее: можно менять вид, цвет, распарсить и тд, удобно однако

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

      В новом курсе так и сделал

  • @koshakpoc2876
    @koshakpoc2876 2 года назад

    Работает без refresh_from_db
    наверное за год починил)

  • @galaxycode2877
    @galaxycode2877 2 года назад

    не понятно как работает reverse(book-list)

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  2 года назад +1

      создает из viewset по базовому имени урла ссылку для получения списка объектов

    • @galaxycode2877
      @galaxycode2877 2 года назад

      @@SeniorPomidorDeveloper только начинаю понимать немного джангу. я так понял что в джанге все крутится вокруг моделей и их всевозможных представлений пользователю. я правильно понял?

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  2 года назад

      Ну я бы сказал что все крутится вокруг базы, по тому что любой бизнес в интернете это работа с данными. Ты им даёшь свои данные , они на их основе создают другие данные , ты им за это платишь денежку )

  • @pretcb
    @pretcb 2 года назад

    У кого как и у меня нет в постмане JSON формата передачи данных, не знаю куда его занесло в последней версии:))
    закоментируйте 'DEFAULT_PARSER_CLASSES': ['rest_framework.parsers.JSONParser', ]
    И используем from-data закладку postman при post запросе...

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  2 года назад

      😯

    • @pretcb
      @pretcb 2 года назад +1

      @@SeniorPomidorDeveloper Блин, сам дурак... TEXT -> JSON поменять забыл... сижу такой и думаю чего сани не едут:))

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  2 года назад +1

      😁

    • @pretcb
      @pretcb 2 года назад

      @@SeniorPomidorDeveloper Пора создавать чат в дискорде:)) или выкладывать курс на площадку с монетизацией

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  2 года назад

      Есть группа в телеграмме, ссылка в шапке профиля

  • @yrysit3796
    @yrysit3796 2 года назад

    AssertionError: 201 != 400 - Вот такая ошибка, когда создаю выходит

  • @montecristo31
    @montecristo31 2 года назад

    есть еще insomnia - альтернатива postman, можно скачать без регистрации и прочей мешуры.

    • @Pavel-er4hy
      @Pavel-er4hy Год назад

      Подскажи, как добавил куки и айди сесси в инсомнию? Справа в мэнэдж куки я вписал 127001 + кей + айди но в главное окно не перекочевали данные и я не могу авторизоваться

  • @МаратАғай
    @МаратАғай Год назад

    тест delete написал с чеком количества записей в бд, вроде проходит, но что-то будто не так
    def test_delete(self):
    self.assertEqual(3, Book.objects.all().count())
    url = reverse('book-detail', args=(self.book1.id,))
    data ={
    "name": self.book1.name,
    "price": 575,
    "author_name": self.book1.author_name
    }
    json_data = json.dumps(data)
    self.client.force_login(self.user)
    response = self.client.delete(url, data=json_data,
    content_type='application/json')
    self.assertEqual(status.HTTP_204_NO_CONTENT, response.status_code)
    self.assertEqual(2, Book.objects.all().count())

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

      А что не так?

    • @МаратАғай
      @МаратАғай Год назад

      @@SeniorPomidorDeveloper вроде все так😁 смутило в data 'price', таки не понял, почему изменение 'price' никак не влияет на тест, или каждый тест идёт независимо от предыдущих?

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

      Да, каждый тест независимо и на новой чистой базе запускается