안녕하세요
이번 시간에는 Django에서 회원가입 기능을 추가하는 방법에 대해 알아보고 두 가지 방법으로 간단한 실습을 UserCreationForm을 이용하는 방법과 이용하지 않고 구현하는 방법을 통해 진행하겠습니다
0. 사전 준비하기 (템플릿 확장, Bootstrap4)
[Django] Django에서 템플릿 확장의 개념과 템플릿 확장 적용하는 방법 실습하기 (tistory.com)
[Django] Bootstrap4에 대해 알아보고 Django에 Bootstrap4 부트스트랩 적용하기 (tistory.com)
실습을 진행하기 앞서 개발 환경을 맞추고자 Django 템플릿 확장과 Bootstrap4를 적용해야 합니다.
1. 기본 설정하기
1. Django App 생성하기
python manage.py startapp accounts
회원가입을 구현하기 앞서 회원가입 기능을 모아 둘 accounts라는 이름의 앱을 생성하겠습니다.
`python manage.py startapp accounts` 명령어를 실행하면 다음과 같이 accounts 앱이 생성됩니다.
2. Settings.py에 등록하기
# blog/settings.py
INSTALLED_APPS = [
...
...
'accounts',
]
위와 같이 INSTALLED_APPS에 accounts를 등록합니다.
생성된 accounts 안에 템플릿을 만들어 줄 templates라는 디렉터리와 urls.py를 만들어줍니다.
3. URLconf 설정하기 (accounts 안에 urls.py를 사용하기 위한 설정)
# blog/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('blogapp.urls')),
path('accounts/', include('accounts.urls')),
]
모듈화하기 위해 blog 프로젝트 urls.py 위와 같이 accounts.urls를 include 해줍니다.
이렇게 include 함으로써 accounts 앱 내의 urls.py를 사용할 수 있습니다.
4. Settings.py에서 정적 파일 설정하기
# blog/settings.py
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATICFILES_DIRS = [ BASE_DIR, "Static", ]
Settings.py에 다음과 같은 설정으로 정적 파일을 불러올 수 있습니다.
이렇게 `static/css/default.css`의 구조를 가지고 있다면 static 아래에 있는 모든 정적 파일들을 사용할 수 있습니다.
2. accounts 회원가입 View 만들기
# accounts/views.py
from django.contrib import auth
from django.contrib.auth import authenticate
from django.contrib.auth.models import User
from django.shortcuts import render, redirect
def signup(request):
if request.method == 'POST':
if request.POST['password1'] == request.POST['password2']:
user = User.objects.create_user(
username=request.POST['username'],
password=request.POST['password1'],
email=request.POST['email'],)
auth.login(request, user)
return redirect('/')
return render(request, 'signup.html')
return render(request, 'signup.html')
해당 코드는 Django의 회원가입 기능을 구현하는 코드입니다. 다음은 코드에 대한 설명입니다.
(1) if request.method == 'POST':
HTTP 요청이 POST 방식일 때 실행합니다.
(2) if request.POST['password1'] == request.POST['password2']:
사용자가 입력한 비밀번호와 비밀번호 확인 값이 일치하는지 확인합니다.
(3) user = User.objects.create_user(username=request.POST['username'], password=request.POST['password1'], email=request.POST['email'],)
create_user() 함수를 이용해 새로운 유저 객체를 생성합니다. username, password, email 필드를 입력받습니다.
(4) auth.login(request, user)
user 객체로 로그인합니다.
(5) return redirect('/')
회원가입이 성공적으로 처리되었다면, '/'(홈) 페이지로 이동합니다.
(6) return render(request, 'signup.html')
회원가입이 실패한 경우, 다시 회원가입 페이지를 보여줍니다.
위 코드에서는 사용자가 입력한 폼 데이터를 검증하지 않고 DB에 바로 저장하고 있기 때문에 좋은 방법은 아닙니다. 이러한 방식은 보안 상의 이유로 권장되지 않으므로, 적절한 폼 검증과 사용자 인증 절차를 추가하여 보안적인 취약성을 방지해야 합니다.
3. 템플릿 만들기 (accounts/templates/sighup.html)
<!-- accounts/templates/signup.html -->
{% extends 'base.html' %}
{% load bootstrap4 %}
{% block content %}
<div class="wrapper" style="text-align: center;">
<h1>회원가입</h1>
<form method="POST">
{% csrf_token %}
아이디: <br>
<input name="username" type="text">
<br>
비밀번호: <br>
<input name="password1" type="password">
<br>
비밀번호 확인: <br>
<input name="password2" type="password">
<br>
이메일: <br>
<input name="email" type="email">
<br><br>
<input type="submit" class="btn btn-primary" value="Sign Up">
</form>
</div>
{% endblock %}
장고에서 지원하는 UserCreationForm을 사용할 수 있지만 UserCreationForm을 사용하지 않고 템플릿을 작성합니다.
3. URLconf 만들기 (accounts/urls.py)
# accounts/urls.py
from django.urls import path
from .views import *
urlpatterns = [
path('home/signup/', signup, name='signup'),
]
아까 `blog/urls.py`에서 `accounts/urls.py`를 Include 한다고 선언했습니다. 그러면 `accounts/urls.py`의 Path경로가 `blog/urls.py`의 뒤로 붙게 됩니다. 이 말 뜻은 `accounts/urls.py`에서는 'signup/'으로 경로가 잡혀있지만 `blog/urls.py`에서 'accounts/'로 작성했기 때문에 전체 url의 주소는 127.0.0.1:8000/accounts/signup/ 이 됩니다. 따라서 `accounts/views.py`에 매핑되는 주소는 127.0.0.1:8000/accounts/signup/이 됩니다.
4. 서버 실행하기
python manage.py runserver
서버를 실행시키신 후에 [127.0.0.1:8000/accounts/signup]에 접속하여 확인해 주세요.
다음과 같이 [127.0.0.1:8000]에 접속하면 회원가입 페이지가 사용자에게 반환되는 것을 확인할 수 있습니다.
따로 Bootstrap을 이용하여 CSS를 고치긴 했지만 기본적인 회원가입 기능은 같습니다. 다음과 같이 회원 정보를 넣고 Sign Up을 눌러주세요.
회원가입 후 redirect를 인덱스 페이지로 잡아주었기 때문에 정상적으로 회원가입을 완료하고 index 페이지로 넘어온 모습입니다.
5. UserCreationForm을 이용한 구현
1. UserCreationForm을 이용한 회원가입 기능 구현(accounts/views.py)
# accounts/views.py
from django.contrib import auth
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
from django.shortcuts import render, redirect
def signup2(request):
if request.method == 'POST':
if request.POST['password1'] == request.POST['password2']:
user = User.objects.create_user(
username=request.POST['username'],
password=request.POST['password1'],
email=request.POST['email'],
)
auth.login(request, user)
return redirect('/')
return render(request, 'signup.html')
else:
form = UserCreationForm
return render(request, 'signup.html', {'form':form})
장고에서 기본적으로 제공해 주는 내장 폼이 UserCreationForm을 이용하여 똑같이 회원가입 기능을 만들어보겠습니다.
2. 템플릿 만들기 (accounts/templates/signup2.html)
<!-- accounts/templates/signup2.html -->
{% extends 'base.html' %}
{% load bootstrap4 %}
{% block content %}
<div class="wrapper" style="text-align: center;">
<h1>회원가입</h1>
<form method="POST">
{% csrf_token %}
{% bootstrap_form form %}
<input type="submit" class="btn btn-primary" value="Sign Up">
</form>
</div>
{% endblock %}
앞서 작성한 뷰에서 인스턴스 값으로 UserCreationForm을 form에 담아서 넘겨주었기 때문에 템플릿에서는 {{ form }}으로 사용할 수 있습니다. bootstrap4를 사용하면 다음과 같이 {% bootstrap_form form %} 폼을 사용할 수 있습니다.
bootstrap을 사용하지 않는다면 {% form form %}으로 설정해주시면 됩니다.
3. URLconf (accounts/urls.py)
# accounts/urls.py
from django.urls import path
from .views import *
urlpatterns = [
path('signup/', signup, name='signup'),
path('signup2/', signup2, name='signup2'),
]
이렇게 URLconf를 구성한 후에 다시 한번 서버를 실행시켜서 확인해 보겠습니다.
4. 서버 실행하기
python manage.py runserver
서버를 실행시키신 후에 127.0.0.1:8000/accounts/signup2에 접속하여 확인해 주세요.
템플릿에 첫 번째 실습처럼 템플릿에 폼을 직접 작성하셔도 되고 아래 UserCreationForm을 이용해서 구현해 주셔도 상관없습니다. 다만 두 가지 방법 모두 현재 데이터베이스에 값을 저장하기엔 검증 단계가 없기 때문에 valid를 통해 검증해야 합니다.
이번 시간에는 Django에서 회원가입 기능을 추가하는 두 가지 방법에 대해 실습을 진행했습니다. 템플릿을 직접 만드셔도 되고 제공하는 UserCreationForm을 사용하셔도 됩니다.
감사합니다.
'Framework > Django' 카테고리의 다른 글
[Django] Django 게시판 구현하기(3) Sign Up, Login, Logout, Style 추가 (0) | 2021.02.23 |
---|---|
[Django] Django 회원가입 구현하기(2) Login, Logout (0) | 2021.02.23 |
[Django] Django 게시판 구현하기(2) Update, Delete (0) | 2021.02.08 |
[Django] Django 게시판 구현하기(1) Create (0) | 2021.02.08 |
[Django] Django-MySQL 연동하는 방법과 MySQL Workbench 사용 실습하기 (0) | 2021.02.08 |
클라우드, 개발, 자격증, 취업 정보 등 IT 정보 공간
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!