Верификация email при регистрации пользователя verification email in django

Поділитися
Вставка
  • Опубліковано 14 жов 2024

КОМЕНТАРІ • 80

  • @ishimura19
    @ishimura19 9 місяців тому +3

    Огроменное спасибо! Много чего стало понятно. Особенно за разбор встроенных функций. Всего вам хорошего!

    • @wstanley
      @wstanley  8 місяців тому

      Спасибо за отзыв!

  • @gribnoyananas
    @gribnoyananas 20 днів тому

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

  • @НикитаХрамцов-щ8г
    @НикитаХрамцов-щ8г 11 місяців тому +2

    отличный видос, супер помогает понять как работает отправка почты и работа с токенами. На 19:34 в комнату зашел Винипух)

    • @wstanley
      @wstanley  8 місяців тому

      Ахаха, точно)))

  • @rinzewear
    @rinzewear 2 роки тому +1

    походу это уже продвинутый уровень, уже что то умное, спасибо за урок

  • @OwlCoding
    @OwlCoding 2 роки тому +2

    Классно! Спасибо, топчик.
    Комментарий больше чем из 3 слов для продвижения видео

    • @wstanley
      @wstanley  2 роки тому

      Спасибо большое! :)

  • @andrexxelles
    @andrexxelles 2 роки тому +6

    Когда новые уроки ? :с
    Для создания видео вы проделали просто титанический труд, большое за него спасибо :)

    • @wstanley
      @wstanley  2 роки тому +4

      Всегда пожалуйста! Как будет время сразу запишу еще роликов :):)

  • @3agoskin
    @3agoskin 2 роки тому +1

    Очень крутой ролик! Спасибо большое!!!! Ваш канал открытие просто! Большая благодарность

    • @wstanley
      @wstanley  2 роки тому

      Спасибо за отзыв! Значит буду ещё писать ролики:)

  • @i.e.2650
    @i.e.2650 Рік тому +1

    Супер, спасибо за обзор, помогло сделать домашку 😊

  • @ДмитрийЗемлянкин-ж7г

    Хороший туториал, спасибо очень интересно!!!!
    Есть одна загвостка, я не понимаю как сделать так что если пользователь вводит некорректные логин и пароль, на форме входа выдавалось сообщение о некорректном логине и пароле, и чтобы можно было снова вводить логин и пароль.
    Если понятно о чем я, подскажите как решить задачку

    • @ДмитрийЗемлянкин-ж7г
      @ДмитрийЗемлянкин-ж7г Рік тому

      немного переписал код и вопрос решился, спасибо
      def clean(self):
      username = self.cleaned_data.get("username")
      # username = self.cleaned_data.get("email")
      password = self.cleaned_data.get("password")
      if username is not None and password:
      self.user_cache = authenticate(
      self.request, username=username, password=password
      )
      if self.user_cache is None:
      raise self.get_invalid_login_error()
      elif not self.user_cache.email_verify:
      send_email_for_verify(self.request, self.user_cache)
      raise ValidationError(
      'Почта не верифицирована, проверьте вашу почту!',
      code='invalid_login',
      )
      else:
      self.confirm_login_allowed(self.user_cache)
      return self.cleaned_data

  • @Sao70
    @Sao70 Рік тому

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

  • @coffeefoam00
    @coffeefoam00 Рік тому +1

    Добрый день, спасибо вам за такой детальный разбор. У меня вопрос насчет верификаци по почте, сообщение приходит только в консоль, но не на саму почту. Как сделать так, чтобы ссылка приходила письмом на gmail?

    • @wstanley
      @wstanley  Рік тому +1

      Мы специально для теста поставили настройку github.com/djangouroki/verify_email/blob/master/project/settings.py#L34 чтобы письмо уходило в консоль, а чтобы уходило на почту надо сменить backend на кот необходимо например smtp - 'django.core.mail.backends.smtp.EmailBackend'
      docs.djangoproject.com/en/4.1/topics/email/#email-backends

  • @ИгорьПесоцкий-в3е
    @ИгорьПесоцкий-в3е 2 роки тому +1

    Спасибо вам огромное, очень помогло ваше видео

    • @wstanley
      @wstanley  2 роки тому +1

      Всегда пожалуйста!

  • @vitaliiananiev5038
    @vitaliiananiev5038 Рік тому +1

    Надеюсь в новой Джанге будет базовое представление верификации пользователя через почту, в ДРФ оно есть если не ошибаюсь.

    • @wstanley
      @wstanley  Рік тому

      В ДРФ на сколько я знаю нет авторизации. Про новые фичи в джанго можете посмотреть на этой странице docs.djangoproject.com/en/4.1/releases/

  • @neodixannn1059
    @neodixannn1059 2 роки тому +2

    Спасибо за видео. Хотелось бы увидеть как правильно проектировать базу данных с использованием ForeignKey,ManyToManyField

    • @wstanley
      @wstanley  2 роки тому

      На канале есть два видео, многие к одному это про FK , многие ко многим это про M2M, есть ещё один к одному. Посмотрите, если что задавайте вопросы в комментариях. :)

  • @RockstarAlexander
    @RockstarAlexander 2 роки тому +1

    👍👍👍👍

  • @Igor160594
    @Igor160594 Рік тому +1

    Спасибо!) помогли

    • @wstanley
      @wstanley  Рік тому

      всегда пожалуйста!

    • @Igor160594
      @Igor160594 Рік тому

      @@wstanley как я понял для регистрации более одного человека нужно переопределить username? потому что по дефолту стоить уникальное значение. Или я ошибаюсь?

  • @Manu-ei6tn
    @Manu-ei6tn Рік тому +2

    Подскажите, пожалуйста. В каких случаях в DJANGO нужно использовать self?

    • @wstanley
      @wstanley  Рік тому

      Добрый день! Self не относится к django это относится к ООП и классам, почитайте про классы в python

    • @Manu-ei6tn
      @Manu-ei6tn Рік тому

      @@wstanley Да, я понимаю что self это для экземпляра класса. Я в курсе. Но не совсем понятно, некоторые моменты. Например, если в классе, проверять валидность формы методом form_valid(self, form), то для user не нужно указывать self. Т.е. можно просто прописать user = form.save(). Вот почему здесь не нужно прописывать self.user = form.save()

    • @Manu-ei6tn
      @Manu-ei6tn Рік тому

      @@wstanley
      И вообще, когда создаются запросы от пользователей, то для Класса представления создаются его экземпляры (экземпляры класса) для каждого запроса?

    • @wstanley
      @wstanley  Рік тому +1

      Когда мы пишем user = form.save() то мы инициируем локальную переменную user для функции в которой ее объявили. Если до этого form = UserForm - у которой указано в meta что model=User и наследуется от ModelForm так - UserForm(form.ModelForm) то при form.save() нам вернется user которого мы и запоминаем в переменную user
      Если мы напишем self.user = form.save() то user будет присвоен экземпляру класса и в других методах мы сможем так же к нему обращаться self.user
      Надеюсь понятно написал :)
      для более быстрой коммуникации и ответов на вопросы можешь писать в телеграмм t.me/pydjango тут быстрее ответят, я там тоже иногда отвечаю

    • @Manu-ei6tn
      @Manu-ei6tn Рік тому

      @@wstanley Спасибо большое. Все понятно, что Вы написали. Но я больше хотел понять, почему при одновременных запросах, эта переменная user присваивается правильно (т.е. для каждого пользователя (запроса) отдельно)? Так же и с функциями представлениями

  • @ossetialife3044
    @ossetialife3044 2 роки тому +3

    В вашем коде немного не правильно работает логика сброса пароля. Исходя из примера при введении неправильного email которого в базе нет, выводится что письмо с восстановлением было отправлено, а по сути такого email вообще нет. Было бы не плохо переопределить класс восстановления пароля и отслеживать существует ли такой email вообще и если не существует то выкидывать соответствующую ошибку. Если можно поясните как это сделать...

    • @wstanley
      @wstanley  2 роки тому +1

      Добрый день! Я на отдыхе, приеду посмотрю, что там с паролем не так получилось. Отвечу на выходных только

    • @ossetialife3044
      @ossetialife3044 2 роки тому +2

      @@wstanley вопрос решен следующим образом
      urls.py
      path('password_reset/', auth_views.PasswordResetView.as_view(form_class=PasswordResetForm), name='reset_password'),
      forms.py
      class PasswordResetForm(DjangoPasswordResetForm):
      def clean_email(self):
      email = self.cleaned_data['email']
      if not User.objects.filter(email__iexact=email, is_active=True).exists():
      raise forms.ValidationError("There is no user registered with the specified email address!")
      return email
      Спасибо что ответили😉

    • @wstanley
      @wstanley  2 роки тому

      Доброго дня! Это логика джанги такая, вот на этой строке github.com/django/django/blob/main/django/contrib/auth/forms.py#L331 вызывается метод self.get_users(email) он возвращает пустой генератор если по емаил пользователи(внезапно) не найдены. Если тебе надо доработать логику, то стоит переопределить(наследованием) метод get_users в классе(форме) PasswordResetForm и выдавать raise ValidationError() с текстом что пользователь не найден. И также переопределить PasswordResetView наследованием и указать ей свою новую форму form_class = MyPasswordResetForm, должно сработать

  • @MrSunTrope
    @MrSunTrope Рік тому +2

    Это круто но тяжело))

    • @wstanley
      @wstanley  Рік тому

      Тяжело только по началу, нужно немного практики)))

  • @danilbanan406
    @danilbanan406 2 роки тому +1

    Почему если перехожу по ссылке для верификации,то в окне пишет Страница недоступна
    Если проблема не исчезнет, свяжитесь с владельцем сайта.HTTP ERROR 405 и видимо из-за этого логинит без подтвержденной почты

    • @wstanley
      @wstanley  Рік тому

      Извиняюсь комментарий попал на проверку и я его не увидел. Ошибка 405 говорит что метод у страницы на который вы обращаетесь не существует. т.е. вы обращаетесь на страницу методом POST а его просто нет, проверьте внимательно куда уходит запрос

  • @MrFankerMan
    @MrFankerMan 2 роки тому +1

    Топчик

    • @wstanley
      @wstanley  2 роки тому +1

      Спасибо!

    • @MrFankerMan
      @MrFankerMan 2 роки тому +1

      @@wstanley Будет урок связанный с асинхронным запросом в Django? Например, мне на странице нужно нажать на кнопку/ссылку, чтобы показать инфу в div из базы данных. Чтобы это было без перезагрузки страницы. Я так понимаю Ajax нужно использовать...

    • @wstanley
      @wstanley  2 роки тому +2

      Да, конечно будет на майские праздники постараюсь записать

    • @MrFankerMan
      @MrFankerMan 2 роки тому +1

      @@wstanley огонь🤩 огромная благодарочка!

  • @sosrebet1337
    @sosrebet1337 2 роки тому +2

    все круто, но хотелось бы сделать вход по логину либо по почте

    • @wstanley
      @wstanley  2 роки тому

      Можно дополнить серию таким видео, скоро продолжу записывать новые уроки, сделаю

    • @markvisok3343
      @markvisok3343 2 роки тому +1

      Все, что нужно для мультиполя авторизации - собственный auth backend, там 30 строчек кода и указать его в settings.py как AUTHENTICATION_BACKENDS = ['путь к файлу бекенда',] :)

    • @wstanley
      @wstanley  2 роки тому

      Да, спасибо, попробуем через auth backend сделать, посмотрим когда руки доберутся.

  • @p_witt.
    @p_witt. 2 роки тому +1

    спасибо за серию видео.
    Возникает ошибка при авторизации: AttributeError at /users/login/
    'NoneType' object has no attribute 'email_verify'
    \users\forms.py, line 27,
    Наверно, что-то с условием, if not self.user_cache.email_verify:
    Буду благодарен за помощь, мне не хватает мозгов это решить

    • @wstanley
      @wstanley  2 роки тому

      Привет. Сори, комментарий попал в раздел "на проверке" и я его не видел. Такая ошибка 'NoneType' object has no attribute 'email_verify' возникает если объект к которому ты обращаешься на самом деле None, т.е. не существует. Если это происходит в этой строке -> if not self.user_cache.email_verify:, то user_cache=None, а у None нету атрибута email_verify. Проверь почему так происходит

    • @amirhasanov9686
      @amirhasanov9686 2 роки тому

      У меня была такая же проблема ошибка происходила когда пытался залогиниться через username а не email. В итоге помогло взять if not self.user_cache.email_verify: в try except: pass

    • @АлександрМалых-ъ8и
      @АлександрМалых-ъ8и 2 роки тому

      Привет, когда Ваша программа доходит до 27 строчки кода, выбрасывается ошибка так как скорее всего этого пользователя нет в бд, а None нет поля 'email_verify', перенесите проверку:
      if self.user_cache is None:
      raise self.get_invalid_login_error()
      выше чем:
      if not self.user_cache.email_verify:
      send_email_for_verify(self.request, self.user_cache)
      ... .

  • @showrun4747
    @showrun4747 11 місяців тому

    почему на 28:27 вместо поля логин поле емайла?

  • @vitaliiananiev5038
    @vitaliiananiev5038 Рік тому +1

    Когда форма регистрации не проходит валидацию страница просто обновляеться без наличия ошибок.

    • @wstanley
      @wstanley  Рік тому +1

      Добрый день! Верните код ошибки в таком случае и обработайте ее на фронте с js, мы как раз это и разбирали на этом уроке

    • @vitaliiananiev5038
      @vitaliiananiev5038 Рік тому +1

      @@wstanley сори я просто как новичек тупанул и в контекст при ошибки валидации добавил просто форму, а не форму заполненую пользователем.

    • @wstanley
      @wstanley  Рік тому +1

      Отлично что получилось разобраться! В начале пути всегда сталкиваешься с такими ошибками, с опытом их станет меньше :)))

  • @vitaliiananiev5038
    @vitaliiananiev5038 Рік тому +1

    Если пытаюсь залогиниться не существующим пользователем выдает ошибку 'NoneType' object has no attribute 'email_verify'

    • @wstanley
      @wstanley  Рік тому

      Добрый день! Проверил по всему проекту у меня нет обращения к атрибуту email_verify, если не вижу либо скажите тайм код либо весь трейсбек ошибки скиньте, можно на депаст. Ваша ошибка говорит что вы обращаетесь к атрибуту email_verify у объекта а в объекте по какой-то причине None

    • @vitaliiananiev5038
      @vitaliiananiev5038 Рік тому

      @@wstanley
      Traceback (most recent call last):
      File "C:\Users\Vitaliy\PycharmProjects\Funpay\venv\lib\site-packages\asgiref\sync.py", line 482, in thread_handler
      raise exc_info[1]
      File "C:\Users\Vitaliy\PycharmProjects\Funpay\venv\lib\site-packages\django\core\handlers\exception.py", line 42, in inner
      response = await get_response(request)
      File "C:\Users\Vitaliy\PycharmProjects\Funpay\venv\lib\site-packages\django\core\handlers\base.py", line 253, in _get_response_async
      response = await wrapped_callback(
      File "C:\Users\Vitaliy\PycharmProjects\Funpay\venv\lib\site-packages\asgiref\sync.py", line 444, in __call__
      ret = await asyncio.wait_for(future, timeout=None)
      File "C:\Users\Vitaliy\AppData\Local\Programs\Python\Python39\lib\asyncio\tasks.py", line 440, in wait_for
      return await fut
      File "C:\Users\Vitaliy\AppData\Local\Programs\Python\Python39\lib\concurrent\futures\thread.py", line 52, in run
      result = self.fn(*self.args, **self.kwargs)
      File "C:\Users\Vitaliy\PycharmProjects\Funpay\venv\lib\site-packages\asgiref\sync.py", line 486, in thread_handler
      return func(*args, **kwargs)
      File "C:\Users\Vitaliy\PycharmProjects\Funpay\venv\lib\site-packages\django\views\generic\base.py", line 84, in view
      return self.dispatch(request, *args, **kwargs)
      File "C:\Users\Vitaliy\PycharmProjects\Funpay\venv\lib\site-packages\django\utils\decorators.py", line 46, in _wrapper
      return bound_method(*args, **kwargs)
      self._clean_form()
      File "C:\Users\Vitaliy\PycharmProjects\Funpay\venv\lib\site-packages\django\forms\forms.py", line 455, in _clean_form
      cleaned_data = self.clean()
      File "C:\Users\Vitaliy\PycharmProjects\Funpay\funpay\Pay\forms.py", line 153, in clean
      if not self.user_cache.email_verify:
      AttributeError: 'NoneType' object has no attribute 'email_verify'
      HTTP POST /ru/login/ 500 [0.04, 127.0.0.1:56765]

    • @vitaliiananiev5038
      @vitaliiananiev5038 Рік тому +1

      @@wstanley Ну да я типа хочу залогиниться пользователем которого нет в БД и мне выдает эту ошибку(

    • @wstanley
      @wstanley  Рік тому +2

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

    • @vitaliiananiev5038
      @vitaliiananiev5038 Рік тому +1

      @@wstanley так работает:
      def clean(self):
      username = self.cleaned_data.get("username")
      password = self.cleaned_data.get("password")
      if username is not None and password:
      self.user_cache = authenticate(
      self.request,
      username=username,
      password=password,
      )
      if self.user_cache is None:
      raise self.get_invalid_login_error()
      else:
      if self.user_cache.email_verify:
      self.confirm_login_allowed(self.user_cache)
      else:
      from .utils import send_user_for_verify
      send_user_for_verify(self.request, self.user_cache)
      raise ValidationError(
      _("Почта не верифицирована, проверьте почту."),
      code='invalid_login',
      )
      return self.cleaned_data

  • @НикитаКульпинов-р3к

    [WinError 10061] Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение

    • @wstanley
      @wstanley  2 роки тому

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

  • @smokibits4365
    @smokibits4365 Рік тому +1

    Dai bog tebe zdorovya. Laik i podpiska!

  • @Michael-mb6ew
    @Michael-mb6ew Рік тому +1

    Здравствуй. Спасибо тебе за этот плейлист!!!
    Я задеплоил свой сайт на хостинг, и теперь мне нужно сделать так, чтобы подтверждение о завершении регистрации приходило на почту юзера, который регистрируется. Я поменял EMAIL_BACKEND на 'django.core.mail.backends.smtp.EmailBackend', но теперь у меня возникает следующая ошибка:
    ConnectionRefusedError at /users/register/
    [Errno 111] Connection refused
    Request Method: POST
    Подскажи, пожалуйста, что мне нужно сделать?

    • @wstanley
      @wstanley  Рік тому

      Не помню почему такая ошибка может быть, напиши в телеграмм группу, есть в описании канала. Я просто не за ПК сейчас, не могу глянуть(((

    • @Michael-mb6ew
      @Michael-mb6ew Рік тому

      @@wstanley Я написал, мне ничего не ответили (

    • @Michael-mb6ew
      @Michael-mb6ew Рік тому +1

      @@wstanley Можете мне помочь, пожалуйста, не имею представления из-за чего возникает эта ошибка. У меня в остальном такой же код, как и у вас, только отличие в том, что сайт на хостинге сейчас

    • @wstanley
      @wstanley  Рік тому

      Сори я уезжал в другую страну отдохнуть там не было связи. Эта ошибка вызвана неправильными настройками почты, надо ее правильно настроить, для этого надо знать какой ты почтой пользуешься и какие там настройки, придется помучится
      Пиши в группу в телеге еще раз,
      либо смотри тут www.google.com/search?q=ConnectionRefusedError+at+%2Fusers%2Fregister%2F+%5BErrno+111%5D+Connection+refused&oq=ConnectionRefusedError+at+%2Fusers%2Fregister%2F+%5BErrno+111%5D+Connection+refused&aqs=chrome..69i57.843j0j15&sourceid=chrome&ie=UTF-8

  • @nuksatanans3782
    @nuksatanans3782 2 роки тому +1

    AttributeError at /users/register/
    'NoneType' object has no attribute 'pk'

    • @wstanley
      @wstanley  2 роки тому

      Доброго дня, где-то не получили объект, а получили None и у этого None пытаетесь получить атрибут pk. Вот он и ругается