본문 바로가기
IT/Django

Django 기초 6.로그인 페이지 구성 및 홈페이지 이동 기능

by 어센트 2019. 10. 7.

회원가입 부분까지 완료 하였고 회원가입 후 로그인 페이지를 만들고 로그인이 완료되면 홈페이지로 이동 하는 것을 구현했다.

 

1. login.html파일을 생성하고  아래와 같이 만든다

 

<html>
  <head>
    <meta charset="utf-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1, shrink-to-fit=no"
    />
    <!-- CDN 이용 -->
    <!-- <link
      rel="stylesheet"
      href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
      integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T"
      crossorigin="anonymous"
    /> -->
    <link rel="stylesheet" href="/static/bootstrap.min.css/" />
    <script
      src="https://code.jquery.com/jquery-3.3.1.slim.min.js"
      integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo"
      crossorigin="anonymous"
    ></script>
    <script
      src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"
      integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1"
      crossorigin="anonymous"
    ></script>
    <script
      src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"
      integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM"
      crossorigin="anonymous"
    ></script>
  </head>
  <body>
    <div class="container">
      <div class="row mt-5">
        <div class="col-12 text-center">
          <h1>로그인</h1>
        </div>
      </div>

      <div class="row mt-5">
        <div class="col-12">
          {{ error }}
        </div>
      </div>
      <div class="row mt-5">
        <div class="col-12">
          <form action="." method="POST">
            {% csrf_token%}
            <div class="form-group">
              <label for="username">사용자 이름</label>
              <input
                type="text"
                class="form-control"
                id="username"
                placeholder="사용자 이름"
                name="username"
              />
            </div>

            <div class="form-group">
              <label for="password">비밀번호</label>
              <input
                type="password"
                class="form-control"
                id="password"
                placeholder="비밀번호"
                name="password"
              />
            </div>

            <button type="submit" class="btn btn-primary">로그인</button>
          </form>
        </div>
      </div>
    </div>
  </body>
</html>

 

2. sampleuser 앱 내부 urls.py 에 새로 만든 html파일인 login.html 경로를 등록

from django.urls import path
from . import views

urlpatterns = [
    path('register/', views.register),
    path('login/', views.login)
]

 

3.views.py에 register 함수를 만들었던 것과 같이 login함수를 만들어준다

views.py에 추가 

from .models import Sampleuser
from django.http import HttpResponse
from django.contrib.auth.hashers import make_password, check_password
from django.shortcuts import render, redirect# 홈으로 이동하기 위해 redirect 추가로 적어준다
def login(request):
    if request.method == 'GET':
        return render(request, 'login.html')
    elif request.method == 'POST':
        username = request.POST.get('username', None)
        password = request.POST.get('password', None)
        res_data = {}
        if not (username and password):  # ID,PW 입력하지않은 경우
            res_data['error'] = '모든 값을 입력해야합니다.'
        else:  # ID,PW검사
            sampleuser = Sampleuser.objects.get(
                username=username)  # ID를 DB로부터 가져오는 과정
            # 뒤의 username이 이번에 입력받은 username

            if check_password(password, sampleuser.password):  # 비밀번호가 일치한경우
                request.session['user'] = sampleuser.id
                return redirect('/')  # redirec를 이용해 로그인 성공 이후 웹페이지로 이동
                # '/'만 써주면 현재 웹사이트의 루트로 이동함 즉 홈페이지로 이동

            else:  # 비밀번호가 틀린경우
                res_data['error'] = '비밀번호가 틀립니다.'

        return render(request, 'login.html', res_data)
def register(request):
    if request.method == 'GET':  # 주소를 치고 들어갔을때의 경우
        return render(request, 'register.html')
    elif request.method == 'POST':  # 등록을 눌렀을때의 액션
        username = request.POST.get('username', None)  # 초기값 None으로 설정
        useremail = request.POST.get('useremail', None)
        password = request.POST.get('password', None)
        re_password = request.POST.get('re-password', None)

        res_data = {}  # 에러를 받을 딕셔너리 만들어줌
        if not(username and useremail and password and re_password):  # 값 3개가 다들어있지않는경우
            res_data['error'] = '모든 값을 가지지않았습니다'
        elif password != re_password:
            res_data['error'] = '비밀번호가 다릅니다'
        else:

            sampleuser = Sampleuser(
                username=username,
                useremail=useremail,
                password=make_password(password)  # 암호화 후 저장
            )
            sampleuser.save()
        # 데이터 포스트를 하고 다시 html페이지를반환

        return render(request, 'register.html', res_data)
        # res_data를 줘야 에러메시지 출력됨
    # 리퀘스트와 반환하고싶은 html파일 리턴

4.홈의 경로를 전체 프로젝트 내부에 있는 urls.py에 추가해준다

from sampleuser.views import home  도 함께 적어준다

from django.contrib import admin
from django.urls import path, include
from sampleuser.views import home  # 홈페이지를 추가해주기위해서

urlpatterns = [
    path('admin/', admin.site.urls),
    path('sampleuser/', include('sampleuser.urls')),
    path('', home)  # 루트 추가
]

5.views.py에 home 의 기능추가 (3번에 전체 views.py가 있기 때문에 함수부분만 작성함)

def home(request):
    user_id = request.session.get('user')  # session에서 아이디를 뺴옴
    #  로그인 할때 session에 넣었던 키가 id값이므로user

    if user_id:
        sampleuser = Sampleuser.objects.get(pk=user_id)  # pk는 기본키
        return HttpResponse(sampleuser.username)
    return HttpResponse('Home!')

 

회원가입 후 로그인 시도

회원가입완료 후 로그인 실패 시

로그인 성공시 홈페이지로 이동