jc.jang

13강 암호 재설정 구현하기 본문

Django/Django - 인증편

13강 암호 재설정 구현하기

jangstory 2019. 9. 3. 16:51

주제

노트

  • 이번에도 urls.py 등록, views.py 구현으로 지난 강의와 내용이 같다.
  • views.py에서 관련 class based view의 template_name를 지정하지 않으면 admin style의 html이 나오므로 수정이 필요하다.
  • 마찬가지로 PasswordResetDoneView, PaswordResetCompleteView는 완료 메세지만 보여줄 뿐 다른 기능이 없으므로 이전 view의 success_url을 재정의하여 login 페이지로 이동한다.

 

  • accounts/urls.py
from django.urls import path, reverse_lazy
from django.contrib.auth import views as auth_views

from . import views

urlpatterns = [
    # ...
    path('password_reset/', views.MyPasswordResetView.as_view(), name='password_reset'),
    path('reset/<uidb64>/<token>/', views.MyPasswordResetConfirmView.as_view(), name='password_reset_confirm'),
    # ...
]

 

  • accounts/views.py
class MyPasswordResetView(PasswordResetView):
    success_url=reverse_lazy('login')
    template_name = 'accounts/password_reset_form.html'
    email_template_name = 'accounts/password_reset.html'
    # html_email_template_name = ...

    def form_valid(self, form):
        messages.info(self.request, '암호 변경 메일을 발송했습니다.')
        return super().form_valid(form)


class MyPasswordResetConfirmView(PasswordResetConfirmView):
    success_url=reverse_lazy('login')
    template_name = 'accounts/password_reset_confirm.html'

    def form_valid(self, form):
        messages.info(self.request, '암호 리셋을 완료했습니다.')
        return super().form_valid(form)
  • PasswordResetView, PasswordResetConfirmView를 상속받고 몇가지 필드를 오버라이드한다.
  • success_url을 재정의하여 -done 등의 view를 사용하지 않는다.
  • email_template_name은 이메일 전송 시 사용하는 plain text 템플릿을 정의한다.
  • accounts/templates/accounts/password_reset.html
아래 주소를 통해 {{ site_name }}에 접속하여 비밀번호를 초기화 할 수 있습니다.

링크: {{ protocol }}://{{ domain }}{% url 'password_reset_confirm' uidb64=uid token=token %}
  • html_email_template_name은 이메일 전송 시 사용하는 html 템플릿을 정의한다. 만약 메일 서비스에서 html을 지원하지 않으면 email_template_name의 내용이 보여진다.

 

  • accounts/templates/accounts/login.html
{% extends "accounts/layout.html" %}

{% block content %}
    <h2>로그인</h2>
    
    <form action="" method="post">
        {% csrf_token %}
        <table>
            {{ form.as_table }}
        </table>
        <input type="submit">
    </form>

    <hr>

    <a href="{% url 'request_login_via_url' %}">이메일로 로그인하기</a>
    <a href="{% url 'password_reset' %}">암호 리셋하기</a>
{% endblock %}
  • 로그인 페이지에 암호 리셋하기 링크를 등록한다.

질문

  • 비밀번호 재설정할 때 사용되는 토큰이 어떻게 관리되는지 잘 모르겠다.

요약

  • auth에 있는 view를 사용하여 암호 재설정을 구현할 수 있다.

날짜

  • 오후 4시, 20190903

 

Comments