본문 바로가기
Django/Django Vanila

5. Django 사용자 관리와 로그인

by S.T.Lee 2022. 5. 26.

1. 페이지 만들기

우선 파일 구성을 한다.

그리고 만드는데 Django가 재밌는건 다른 html파일을 연장 시킬수 있다.

{% extends 'base.html' %}

해당 코드를 적용시키면 base.html을 sigin, signup에 적용시킬 수 있다. 물론 파일마다 적용해야 한다.

 

우선 user app 내부에서 user/views.py, user/urls.py을 통해 연결을 한다.

#views.py
from django.shortcuts import render

# Create your views here.
def sign_up_view(request):
    return render(request, 'user/signup.html')

def sign_in_view(request):
    return render(request, 'user/signin.html')
#urls.py
from django.contrib import admin
from django.urls import path
from . import views

#name은 url에 /뒤에 들어가는 내용이다.
#ex) http://127.0.0.1:8000/sign-up/
urlpatterns = [
    path('admin/', admin.site.urls),
    path('sign-up/', views.sign_up_view, name='sign-up'),
    path('sign-in/', views.sign_in_view, name='sign-in'),
]

이제 user와 project의 url을 연결해줘야한다.

project/urls.py에 들어가서

from django.urls import include

를 추가해준다. 이는 다른 app의 url을 추가해주는 기능인데

urlpatterns = [
    path('', include('user.urls')),
]

상단과 같이 적용을 하면 user에 urls.py 파일과 project의 urls.py을 연결시킬 수 있다. 

 

 

2. 회원가입 기능 구현

회원가입이니 당연히 user app에서 진행된다.

우선 user/view.py에서

from django.shortcuts import render

# Create your views here.
def sign_up_view(request):
    if request.method == 'GET':
        return render(request, 'user/signup.html')
    elif request.method == 'POST':
        #데이터베이스 저장 기능
        return ''


def sign_in_view(request):
    return render(request, 'user/signin.html')

GET일때는 화면을 보여주고 POST일때는 데이터베이스에 변화를 주는 코드를 작성한다.

이후 signup.html로 가서 코드를 추가해준다.

<form class="form-area" method="post" action="/sign-up/">
    {% csrf_token %}
  • method는 말그대로 어떤 방식을 사용하는지이다.
  • action은 주소를 의미한다. 뒤에 무조건 / 를 붙여줘야한다.
  • {% csrf_token %}는 Django에서 기본적으로 제공하는 보안 기능이다. 
  • action과 method의 순서는 상관 없다.

html을 보면

{% extends 'base.html' %}

{% block title %}
    회원가입
{% endblock %}
{% block content %}
    <div class="container">
        <div class="wrap">
            <h2 class="title-center"> 회원가입 </h2>
            <form class="form-area" method="post" action="/sign-up/">
                {% csrf_token %}
                <div class="form-group mt-2 mb-2">
                    <label for="username">이름</label>
                    <input type="text" class="form-control" id="username" name="username">
                </div>
                <div class="form-group mt-2 mb-2">
                    <label for="password">비밀번호</label>
                    <input type="password" class="form-control" id="password" name="password">
                </div>
                <div class="form-group mt-2 mb-2">
                    <label for="password2">비밀번호 확인</label>
                    <input type="password" class="form-control" id="password2" name="password2">
                </div>
                <div class="form-group mt-2 mb-2">
                    <label for="bio">나를 한마디로</label>
                    <input type="text" class="form-control" id="bio" name="bio">
                </div>
                <hr>
                <div style="float: right">
                    <button type="submit" class="btn btn-primary">회원가입</button>
                    <a href="/sign-in" class="btn btn-secondary">로그인 페이지로</a>
                </div>
            </form>

        </div>
    </div>
{% endblock %}

이와 같이 구성되는데 button type="submit"은 form안에 있을때 input 값들을 전송해준다. 이때 input의 name값으로 전송이된다. 이를 잘 기억해야 연결할 수 있다.

 

이제 user/views.py에 데이터 받는 과정을 추가한다.

from django.shortcuts import render, redirect #redirect는 name 즉, url로 이동해주는 방법이다.
from .models import UserModel #UserModel을 불러와 받은 데이터를 저장해준다.

# Create your views here.
def sign_up_view(request):
    if request.method == 'GET':
        return render(request, 'user/signup.html')
    elif request.method == 'POST':
        username = request.POST.get('username', None) #''안에 name값이 들어간다.
        password = request.POST.get('password', None) #None은 아무것도 안받았을시 
        password2 = request.POST.get('password2', None) #None으로 두는것을 의미한다.
        bio = request.POST.get('bio', None)

        if password != password2: #비밀번호가 틀리면
            return render(request, 'user/signup.html')
        else:
            old_user = UserModel.objects.filter(username=username) #기존 유저를 가져와서
            if old_user: #있다면
                return render(request, 'user/signup.html')
            else: #없다면
                new_user = UserModel()
                new_user.username = username
                new_user.password = password
                new_user.bio = bio
                new_user.save()
                return redirect('/sign-in')

이제 회원가입을 하고 db에 가서 보면

짜잔! 들어가져 있는걸 확인할 수 있다.

 

3. 로그인 기능 구현

우선 세션을 사용할 것인데 세션은 사용자의 정보를 저장하는 공간이다.(음.... 근데 분명 jwt를 활용하는게 더 좋은것으로 알고 있다만....)

signup과 같은 작업을 해준다.

<form class="form-area" method="post" action="/sign-in/">
   {% csrf_token %}

이제 user/views.py에서 데이터를 받는 작업을 한다.

from django.shortcuts import render, redirect
from .models import UserModel
from django.http import HttpResponse

# Create your views here.
def sign_up_view(request):
		''''''
        return redirect('/sign-in')


def sign_in_view(request):
    if request.method == 'POST':
        username = request.POST.get('username', None) #마찬가지로 name값을 받고
        password = request.POST.get('password', None)

        me = UserModel.objects.get(username=username) #UserModel에서 객체를 받아오는데
        if me.password == password: #비밀번호가 같다면
            request.session['user'] = me.username #user세션 안에 데이터를 넣어주고
            return HttpResponse(f'{me.username} 로그인에 성공하셨습니다!')
        else: #다르다면
            return redirect('/sign-in')
        
    elif request.method == 'GET':
        return render(request, 'user/signin.html')

이제 로그인을 해보면

완료되었다.

'Django > Django Vanila' 카테고리의 다른 글

7. Django 로그인 이후 기능  (0) 2022.05.27
6. Django에서 제공하는 사용자 기능  (0) 2022.05.27
α. 기타 Django 상황들(VsCode, 오류 등)  (0) 2022.05.26
4. Django admin  (0) 2022.05.26
3. Django ORM & Database  (0) 2022.05.26