2020-03-25

Django 06. 회원가입 이용약관 동의 구현

Session을 사용하여 회원가입 전 사이트 이용약관 / 개인정보 수집 동의를 구현합니다.


1. templates 작성

회원가입 버튼을 통해 회원가입 창으로 넘어가기 전 사이트의 개인정보수집 동의 및 이용약관 동의를 구현하기 위해 우선 생성해두었던 templates 폴더에 users 폴더를 생성한 후 user_base.htmlagreement.html 파일을 생성한 후 아래의 코드를 입력합니다.

user_base.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<!-- templates/users/user_base.html -->

<html>

<head>
<meta charset='utf-8'>
<meta name='viewport' content='width=device-width, initial-scale=1'>
{% block header %}
<!-- header 삽입 부분 -->
{% endblock %}
</head>

<body style="background-color: #d6d6d6;">
{% block contents %}
<!-- body 삽입 부분 -->
{% endblock %}

{% if messages %}
{% for message in messages %}
{% if message.tags %}
<script>
alert("{{ message.message }}") <!-- message alert script -->
</script>
{% endif %}
{% endfor %}
{% endif %}
</body>

</html>

이제 templates는 django 템플릿 언어를 통해 이 user_base.html를 상속받습니다. 프로젝트의 전반적인 디자인은 bootstrap4와 부트스트랩 PlugIn인 Material Design Bootsrap을 사용하였습니다. 각 CDN과 추가되는 파일들은 포스팅하지 않겠습니다.

agreement.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<!-- templates/users/agreement.html -->

{% extends "users/user_base.html" %}
{% load static %}
{% block contents %}
//
<form action="" , method="POST">
{% csrf_token %}
<div>
<label">
<input type="checkbox" name="agreement1" />
<span>이용약관에 동의합니다.</span>
</label>
</div>
//
<div>
<label>
<input type="checkbox" name="agreement2" />
<span>개인정보 수집 및 이용에 동의합니다.</span>
</label>
</div>
</form>
//
{% endblock %}

사이트 이용약관과 개인정보 수집동의 텍스트는 법률을 보면서 직접 작성하거나 구글링 등을 통해 쉽게 구할 수 있습니다. 다른 소스들은 제외하고 동의부분 checkboxname을 각각 agreement1, agreement2로 설정해줍니다.

2. views.py 작성

약관 동의 로직은 다음과 같습니다.

  1. 회원가입 버튼 Click시 회원가입(register.html)이 아닌 약관동의(agreement.html)로 redirect
  2. url 강제입력으로 회원가입창으로 넘어가서는 안된다.
  3. agreement.html에서 동의 checkbox가 checked되어야 /register로 redirect가 가능하다.

위의 로직을 바탕으로 users appviews.py를 아래와 같이 작성합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# users/views.py

from django.shortcuts import render, redirect
from django.utils.decorators import method_decorator
from .decorators import *
from .models import User
from django.views.generic import View
from django.contrib import messages

@method_decorator(logout_message_required, name='dispatch')
class AgreementView(View):
def get(self, request, *args, **kwargs):
request.session['agreement'] = False
return render(request, 'users/agreement.html')

def post(self, request, *args, **kwarg):
if request.POST.get('agreement1', False) and request.POST.get('agreement2', False):
request.session['agreement'] = True

if request.POST.get('csregister') == 'csregister':
return redirect('/users/csregister/')
else:
return redirect('/users/register/')
else:
messages.info(request, "약관에 모두 동의해주세요.")
return render(request, 'users/agreement.html')

이전 포스팅에서 구현한 decorator 함수를 통해 로그인 중인 사용자는 접근하지 못하게 합니다. AgreementView CBV를 추가하여 회원가입 버튼을 눌렀을시(GET) agreement란 이름의 세션 값을 False로 생성하고 agreement.html을 render 해줍니다.

agreement.html의 form에서 회원가입 버튼을 Click하여 Submit 했을 시(POST) AgreementView의 post 함수는 Submit된 agreement1과 agreement2의 checked 상태를 확인합니다. checked 상태가 되었다면 agreement의 세션값을 True로 바꾸어 주고 컴퓨터공학부 가입인지 일반 가입인지 구분하여 redirect시켜줍니다.

이제 이 agreement 세션 값을 통해 회원가입 view에서 약관에 동의를 한 사용자인지 아닌지 판별할 수 있습니다.

3. urls.py 작성

view 구현이 끝났다면 urls.pyAgreementView를 연결시키고 index창의 회원가입 버튼에 아래의 agreement path와 연결시킵니다.

1
2
3
4
5
6
7
8
9
10
# users/urls.py

from django.urls import path
from . import views

app_name = 'users'

urlpatterns = [
path('agreement/', views.AgreementView.as_view(), name='agreement'),
]

4. 결과

현재 login view를 구현하지 않았기에 login_message_required는 주석처리를 해둔 뒤 서버를 실행하여 /users/agreement/ 경로로 들어가면 회원가입 전 이용약관 동의 페이지를 확인할 수 있습니다.

django-project-06

*전체 html, css 등은 자세하게 포스팅하지 않습니다. 제 Github에서 소스를 확인하실 수 있습니다.