django 07 로그인 기능 만들기

Grace Goh·2022년 9월 29일
0

Django

목록 보기
8/32

지난 시간 : 화면(html form 태그)과 연결되는 URL, view, model
이번 시간 : DB 저장된 회원가입정보로 로그인하기

  • 로그인이란? Session에 사용자 정보를 저장하는 것

  • Session : 사용자 정보 저장하는 공간. 누가 요청했는지 확인할 수 있다. 인증

    서버 <----(Session)----> 클라이언트(요청)

url은 이미 연결되어 있어서

user/views.py 수정할 것

from django.shortcuts import render, redirect
from .models import UserModel
from django.http import HttpResponse # 상단에 추가. 화면에 글자를 띄울 때

(...)

def sign_in_view(request):
    if request.method == 'POST': # POST라면
    	return HttpResponse("로그인 성공!")
      
    elif request.method == 'GET':
        return render(request, 'user/signin.html')

위 signin.html 관련 url은

  • 요청방식이 GET이면 : 화면에 보여준다
  • GET이 아니라면 HttpResponse("로그인 성공!") 화면을 보여준다.

위 화면과 연결되는 signin.html에서 form 태그 수정한다.
어디에, 어떤 방법으로, 보안

user/signin.html 수정

{% extends 'base.html' %}

{% block title %}
    로그인
{% endblock %}
{% block content %}
    <div class="container">
        <div class="wrap">
            <h2 class="title-center"> 로그인</h2>
            <form class="form-area" action="/sign-in/" method="post"> # form태그 실행되면 어디로? /sign-in/으로, 어떻게? POST요청
                {% 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>
                <hr>
                <div style="float: right">
                    <button type="submit" class="btn btn-primary">로그인</button> # 버튼
                    <a href="/sign-up" class="btn btn-secondary">회원가입 페이지로</a>
                </div>
            </form>

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

submit button을 누르면 sign-in url로 POST 요청을 보낸다.
username과 pw를 DB로 가져간다.

user app/views.py 수정

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

(...)

def sign_in_view(request):

    if request.method == 'POST':
        username = request.POST.get('username', None)
        password = request.POST.get('password', None)
		# form에서 전송한 데이터들을 POST로 잘 가져오는 데 성공.
               
        me = UserModel.objects.get(username=username)
        if me.password == password: # password가 같다면
            request.session['user'] = me.username
            return HttpResponse("로그인 성공!") # 문자 출력
        else: # 다르다면 
            return redirect('/sign-in') # 로그인 페이지로 redirect

    elif request.method == 'GET':
        return render(request, 'user/signin.html')

request.POST

  • request.POST에는 요청한 POST data가 다 저장돼 있다. 그 중에서 username과 pw를 가져온다.
  • signin.html input의 name과 같다. 동일하게 작성해야 html-views 연결된다.

변수 me

  • 어떤 데이터를 가져올 것인지 조건을 쓴다.
    • 사용자DB(UserModel)에 username값이 POST에서 들여온 데이터와 같은 사용자의 정보를 호출해서 me에 저장한다.
    • me의 password값과 입력 받은 pw가 같은지 확인한다.
    • 같다면 session(사용자정보 저장공간)에 user를 넣는다.
profile
Español, Inglés, Coreano y Python

0개의 댓글