Django

Chapter 3-7 Django 회원가입(SignUp) 및 로그인(Login) 페이지 만들기

Chansman 2025. 5. 6. 18:31

🧾 Django 회원가입(SignUp) 및 로그인(Login) 페이지 만들기

1️⃣ App 분리: 회원가입 전용 member 앱 생성

python manage.py startapp member

→ 기능별로 앱을 분리하면 유지보수와 확장에 유리합니다. (예: 회원 관리, 블로그 기능, 댓글 등 개별 앱)

📌 settings.py에 앱 등록:

OWN_APPS = [
    'blog',
    'member',  # ✅ 회원 기능 추가
]
INSTALLED_APPS = DJANGO_APPS + OWN_APPS + THIRD_PARTY_APPS

2️⃣ 회원가입 뷰 작성 (member/views.py)

from django.contrib.auth.forms import UserCreationForm
from django.shortcuts import render, redirect
from django.conf import settings

def sign_up(request):
    form = UserCreationForm(request.POST or None)  # POST 데이터가 있을 경우 포함해 폼 생성

    if form.is_valid():  # 아이디 중복, 비밀번호 규칙 검증 포함
        form.save()  # 새 유저 DB에 저장
        return redirect(settings.LOGIN_URL)  # 로그인 페이지로 리디렉션

    context = {'form': form}
    return render(request, 'registration/signup.html', context)

📌 UserCreationForm은 username, password1, password2 필드 포함
📌 유효성 검사 실패 시 오류 메시지가 form에 포함되어 템플릿에 전달됨


3️⃣ 회원가입 템플릿 구성 (signup.html)

경로: templates/registration/signup.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>회원가입</title>
</head>
<body>
    <h1>회원가입</h1>
    <form method="post">
        {% csrf_token %}  <!-- CSRF 보안 토큰 필수 -->
        {{ form.as_p }}    <!-- 폼 필드를 <p> 단위로 출력 -->
        <button type="submit">가입하기</button>
    </form>
</body>
</html>

4️⃣ URL 연결 (urls.py)

from django.contrib import admin
from django.urls import path, include
from blog import views
from member import views as member_views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.blog_list, name='blog_list'),
    path('<int:pk>/', views.blog_detail, name='blog_detail'),
    path('accounts/', include('django.contrib.auth.urls')),

    # ✅ 사용자 기능 연결
    path('signup/', member_views.sign_up, name='signup'),
    path('login/', member_views.login, name='login'),
]

📌 auth.urls는 Django 기본 로그인/로그아웃/비밀번호 기능 포함
📌 직접 만든 login 뷰는 /login/ 경로에 연결


5️⃣ 로그인 설정 (settings.py)

LOGIN_URL = '/login/'  # 로그인 페이지 경로 지정

→ 인증되지 않은 사용자가 보호된 페이지 접근 시 이 경로로 리디렉트됨


6️⃣ 직접 구현한 로그인 뷰 (Mini Project)

# member/views.py
from django.conf import settings
from django.contrib.auth.forms import UserCreationForm, AuthenticationForm
from django.shortcuts import render, redirect
from django.contrib.auth import login as django_login
from django.urls import reverse

def login(request):
    form = AuthenticationForm(request, request.POST or None)  # 요청 데이터를 바탕으로 로그인 폼 생성

    if form.is_valid():
        django_login(request, form.get_user())  # 인증된 사용자 세션에 등록 (로그인 처리)
        return redirect(reverse('blog_list'))   # 로그인 성공 시 블로그 메인 페이지로 이동

    context = {
        'form': form
    }
    return render(request, 'registration/login.html', context)

📌 AuthenticationForm: Django 기본 제공 로그인 폼 → username/password 필드 포함
📌 form.get_user(): 검증 성공 시 로그인 대상 사용자 반환
📌 reverse('blog_list'): URL 하드코딩 대신 name으로 라우팅 경로 찾아 이동
📌 django_login: 내부적으로 request.session에 사용자 정보 저장


7️⃣ 로그인 템플릿 구성 (login.html)

<!-- templates/registration/login.html -->
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">로그인</button>
</form>

📌 로그인 실패 시 오류 메시지가 자동 포함됨 (form 오류 처리 포함)


✅ 전체 흐름 요약

  1. /signup/ → 회원가입 폼 (UserCreationForm)으로 사용자 등록
  2. /login/ → 로그인 폼 (AuthenticationForm)으로 인증 및 세션 저장
  3. 로그인 성공 시 → LOGIN_URL 및 LOGIN_REDIRECT_URL 기반 이동

항목 설명

UserCreationForm 회원가입 시 기본 유저 검증 폼
AuthenticationForm 로그인 시 인증용 폼
django_login() 인증된 유저를 세션에 저장
reverse() URL 하드코딩 방지용 도우미
settings.LOGIN_URL 로그인 리디렉션 경로 설정

💬 회원가입과 로그인을 직접 구현하면서 Django의 인증 흐름과 세션 관리 방식에 대한 이해도를 높일 수 있습니다. 보안 기능과 폼 처리까지 자동화되어 있어 생산성과 안정성이 모두 보장됩니다.