들어가기에 앞서
- 비밀번호를 초기화시키기 위해 정보를 찾아보며 종합해 문서화하였습니다.
- 해당 작업의 목적은 django에서 제공하는 class를 분석하고 Overriding을 시도하여 자신의 소스로 만드는 것입니다.
- 모든 작업은 https://gaebyeokja.tistory.com/10 해당 블로그에서 참고하여 진행하였으며 많은 도움을 받았습니다.
- 기본 설정 및 SMTP 세팅은 다음 게시물을 참고하여 주세요.
- SMTP gmail 설정 및 테스트 : https://integer-ji.tistory.com/274?category=745989
- 로그인, 회원가입 : https://integer-ji.tistory.com/268?category=793135
- django password reset 1 https://integer-ji.tistory.com/275
- django password reset 2 https://integer-ji.tistory.com/276
남은 작업
앞으로 남은 페이지는 PasswordResetConfirmView ( 비밀번호를 변경하는 페이지 )와PasswordResetCompleteView ( 변경 후 페이지 ) 입니다. PasswordResetConfirmView 같은 경우 token을 생성하여 같이 넘겨주어야 합니다.
PasswordResetConfirmView 상속
views.py
from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth.models import User
from django.contrib import auth
from django.contrib import messages
from django.contrib.auth.views import LoginView, LogoutView, PasswordResetView, PasswordResetDoneView, PasswordResetConfirmView, PasswordResetCompleteView
from django.shortcuts import resolve_url
from django.core.exceptions import ValidationError
from django.contrib.auth.forms import UserCreationForm
from django.conf import settings
from django.views.generic.edit import CreateView
from django.views.generic.detail import DetailView
from django.urls import reverse_lazy
from django.views import generic, View
from django.contrib.auth.decorators import login_required
from django.contrib import messages
from django.contrib.auth import login, authenticate
from django.template import RequestContext
from django.http import HttpResponse
try:
from django.utils import simplejson as json
except ImportError:
import json
from django.http import HttpResponse, HttpResponseRedirect
from django.views.decorators.http import require_POST
from django.contrib.auth import (
REDIRECT_FIELD_NAME, get_user_model, login as auth_login,
logout as auth_logout, update_session_auth_hash,
)
from django.contrib.auth.forms import (
AuthenticationForm, PasswordChangeForm, PasswordResetForm, SetPasswordForm,
)
from django.contrib.auth.tokens import default_token_generator
from django.utils.decorators import method_decorator
from django.utils.http import is_safe_url, urlsafe_base64_decode
from django.views.decorators.debug import sensitive_post_parameters
from django.views.decorators.cache import never_cache
from django.utils.translation import gettext_lazy as _
UserModel = get_user_model()
INTERNAL_RESET_URL_TOKEN = 'set-password'
INTERNAL_RESET_SESSION_TOKEN = '_password_reset_token'
class UserPasswordResetConfirmView(PasswordResetConfirmView):
form_class = SetPasswordForm
success_url=reverse_lazy('password_reset_complete')
template_name = 'password_reset_confirm.html'
def form_valid(self, form):
return super().form_valid(form)
class UserPasswordResetCompleteView(PasswordResetCompleteView):
template_name = 'password_reset_complete.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['login_url'] = resolve_url(settings.LOGIN_URL)
return context
수많은 에러를 거쳐 결국 auth의 import들을 모두 가져왔습니다.
비밀번호 변경을 위해 캐시를 남기지 않아야 하고 토큰 값을 생성 및 확인까지 들어가야 합니다.
또한
from django.contrib.auth.forms import (
AuthenticationForm, PasswordChangeForm, PasswordResetForm, SetPasswordForm,
)
을 상속받아 form_class를 넣어줍니다.
password_reset_confirm.html
{% extends 'signBase.html' %}
{% load static %}
{% block signcontent %}
<body class="text-center">
<form action="" method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">비밀번호 초기화</button>
</form>
</body>
{% endblock %}
제 프로젝트의 base.html도 상속받았습니다.
form을 불러와 post로 넘겨줍니다.
PasswordResetCompleteView 상속
class UserPasswordResetCompleteView(PasswordResetCompleteView):
template_name = 'password_reset_complete.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['login_url'] = resolve_url(settings.LOGIN_URL)
return context
마찬가지로 template_name으로 연결할 html을 만들어 줍니다.
password_reset_complete.html
{% extends 'signBase.html' %}
{% load static %}
{% block signcontent %}
<body class="text-center">
<div class="form-signin">
<h1> Password reset complete </h1>
<p> 새 비밀번호가 설정되었습니다. <a href="{% url 'signin'%}"> 로그인 하러가기 </a>.</p>
</div>
</body>
{% endblock %}
비밀번호 설정이 완료되면 이동되는 페이지도 만들어줍니다~
해당 기능을 구현하며 오버 라이딩과 장고에서 제공해주는 기능의 사용을 알게 되었습니다.
특히 기존의 알지도 못하면서 썼던 오버라이딩과 import 그리고 장고에서 제공해주는 기능이니까 ~ 하며 그냥 썻던 클래스들을
하나씩 파고들어가 어떠한 방식으로 작동되는지
또한 토큰과 uid가 무엇인지 너무 신기하고 재밌는 기술을 배우게 되어 좋았습니다.
물론 당연한 이야기 지만 내가 상속받는 클래스가 어떻게 동작하는지
그 클래스를 내가 가지고 왔을 때 어떻게 동작하는지에 대해
한번 더 확인해야 한다는 생각을 갖게 되었습니다.
해당 기능을 완성하며 생긴 에러 처리 보러 가기 >>> https://integer-ji.tistory.com/280
'코딩공부 > Python Django' 카테고리의 다른 글
os.path.isfile 함수를 이용한 secrets.json 관리하기 (1) | 2020.08.31 |
---|---|
django checkbox 값 넘기기 (0) | 2020.08.30 |
django password reset (2) - class PasswordReset Overriding (0) | 2020.08.22 |
django password reset (1) - class PasswordReset 사용하기 (1) | 2020.08.21 |
django SMTP gmail 설정 및 테스트 (0) | 2020.08.20 |