Django 프로젝트-To Do List(9): 회원가입
1. 회원가입 페이지 작성
지금까지는 새로운 유저를 만들기 위해서 관리자 페이지를 이용해야만 했다. 이제 회원가입창을 만들어 새로운 유저들이 회원가입을 할 수 있게 폼을 만들어보자.
우선 회원가입창으로 이동할 수 있도록 링크를 만들고 회원가입 페이지도 만들어주자. 회원가입 페이지는 로그인 페이지와 별 다를 것이 없다.
<!-- task/templates/task/login.html -->
<h1>Login</h1>
<form method="POST">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="login">
</form>
<p>Don't have am account? <a href="{% url 'register' %}">Register</a> </p>
<!-- task/templates/task/register.html -->
<h1>Register</h1>
<form method="POST">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Register">
</form>
<p>Already have am account? <a href="{% url 'login' %}">Login</a> </p>
2. 회원가입 뷰 작성
이제 회원가입을 위한 폼을 만들어보자.
먼저 새로 불러와야 할 모듈이 몇가지 있다. 우선 폼 생성을 위한 FormView가 있다. 또한 UserCreationForm는 회원가입을 위한 아이디, 비밀번호 입력폼이 미리 작성되어 있는 모듈이다. 이를 이용해 기본적인 폼 양식을 가져온다.
login을 알려면 세션에 대해 알아야 하고, 세션을 알려면 우선 HTTP의 특징을 알아야 한다. HTTP 프로토콜은 서버 자원을 절약하기 위해 사용자의 요청마다 연결과 해제가 이루어지기 때문에 연결 상태가 유지되지 않고, 연결 해제 후에는 상태 정보가 저장되지 않는다. 이러한 특징을 비연결성, 무상태성이라 한다.
하지만 우리가 웹사이트를 이용하는 것을 살펴보면 한 번 로그인을 한다면 다시 로그인할 필요없이 계속 로그인 상태가 유지된다. 이를 가능케해주는 것이 쿠키와 세션이다.
우선 쿠키는 클라이언트 상태 정보를 로컬에 저장하였다가 참조하는 역할을 한다. 프로세스를 간단히 도식화하면 다음과 같다.
쿠키가 상태 데이터를 클라이언트의 로컬에 저장하였다면 세션은 서버에 저장한다. 세션은 기본적으로 쿠키를 사용하는데 다른 점은 세션 id만 쿠키로 저장하고 나머지 상태 데이터들은 세션 id를 id값으로 하여 서버에 저장한다. 세션의 프로세스는 다음과 같다.
다시 login 메서드로 넘어가보면 해당 메서드는 유저의 아이디를 장고의 세션 프레임워크를 통해 세션에 저장하여 인증된 유저가 로그인한다면 현재 세션에 연결시켜주는 역할을 한다.
# task/views.py
from django.views.generic.edit import CreateView, UpdateView, DeleteView, FormView
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth import login
이제 본격적으로 회원가입 뷰를 작성해보자. 우선 회원가입 뷰가 가질 템플릿을 설정한다. 템플릿 이름은 register로 정해주고, form_class를 통해 보여줄 form을 설정한다. 여기서는 UserCreationForm를 통해 만들어져 있는 회원가입 form을 사용했다.
다음은 form_valid를 이용하여 입력받은 form을 저장하고 장고의 세션에 유저 정보를 생성, 저장한다.
회원가입이 이루진 다음 로그인을 한 후에는 회원가입 페이지로 가지 못하게 해야한다. 여기서 get 메서드를 사용하는데 이 메서드를 이용하여 유저가 인증에 성공했다면 리다이렉트를 할 수 있게 해준다.
class RegisterPage(FormView):
template_name = 'task/register.html'
form_class = UserCreationForm
success_url = reverse_lazy('tasks')
def form_valid(self, form):
user = form.save()
if user is not None:
login(self.request, user)
return super().form_valid(form)
def get(self, *args, **kwargs):
if self.request.user.is_authenticated:
return redirect('tasks')
return super().get(*args, **kwargs)
마지막으로 url을 연결해준다.
# task/urls.py
from .views import TaskList, TaskDetail, TaskCreate, TaskUpdate, TaskDelete, CustomLoginView, RegisterPage
urlpatterns = [
path('register/', RegisterPage.as_view(), name='register'),
]
핵심요약
- 쿠키와 세션
- get()
Leave a comment