사용자 관리와 로그인 - 회원가입 기능 & 로그인 기능 만들기

장현웅·2023년 9월 1일
0

목차

  1. model을 사용한 회원가입 기능 만들기
  2. model을 사용한 로그인 기능 만들기
  3. 회원가입 시에 이미 있는 사용자 인지 확인하는 코드만들기
  4. 사용자가 로그인을 성공한 후에 HttpResponse를 사용해서 화면에 '사용자 이름'을 출력하게 만들기

1. user model을 사용한 회원가입 기능 만들기


  • 회원가입 페이지를 보여주는 URL('sign-up/')은 GET 방식으로 화면을 사용자에게 보여준다.
  • 가입정보를 입력하고 전송 하는 url('sign-in/')은 POST 방식으로 서버로 데이터를 전송하여 저장한다.
  • GET 요청 방식 : 값을 읽어올 떄
  • POST 요청 방식 : 값을 서버로 주거나 수정, 삭제를 요청할 때

1) templates/user 폴더에서 'signup.html'파일을 불러오는 View함수 'sign_up_view'에 HTTP 요청 방식을 구분하는 코드 추가

  • user/views.py
def sign_up_view(request):
    if request.method == 'GET': # GET 메서드로 요청이 들어 올 경우
        return render(request, 'user/signup.html')
    elif request.method == 'POST': # POST 메서드로 요청이 들어 올 경우
     
        return ""

2) HTML에서 사용자의 정보에 해당하는 태그의 속성에 method(POST)와 action('/sign-up/')을 추가

  • '회원가입'버튼을 누르면 '/signup/' url로 post 요청을 보냄.
    post 요청을 보낼 때, input의 입력값을 input태그의 id값을 담아간다.
  • {% csrf_token %} : 장고 템플릿에서 사용되는 템플릿 태그 중 하나로 웹 브라우저가 사용자가 제출한 폼 데이터를 식별하고 검증하는 데 사용하며 CSRF(Cross-Site Request Forgery) 공격을 방지하기 위한 토큰을 생성하고 폼과 함께 제출할 때 사용한다. 쉽게 말해서 '보안 기능 자동 활성화'라고 보면 된다.
  • <form> 태그 : 화면에 있는 데이터를 서버로 전송할 때 많이 쓰이는 태그이다.

3) views.py의 sign_up_view 함수는 signup.html의 form 태그에 사용자가 제출한 데이터를 객체 형태로 받아서 저장

  • 실제 데이터 요청 동작은 views.py에서 일어난다.
  • 화면에서 데이터를 받아와서 데이터베이스에 저장할 사용자(user) Model을 저장
  • html의 input에 입력값은 각 input 태그의 id값으로 View 함수에 들어간다.
from django.shortcuts import render, redirect	# 회원가입 버튼을 누르면 로그인 페이지로 이동하기 위해 redirect 임포트
from .models import UserModel	# 내가 가진 앱(.)의 모델 중 UserModel을 가져온다.

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)	# 'None' : 아직 데이터가 들어오지 않았다.
        password = request.POST.get('password', None)
        password2 = request.POST.get('password2', None)
        bio = request.POST.get('bio', None)

        if password != password2:		# password와 password2가 다르면
            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')		# redirect() 함수 : 특정 URL에서 다른 URL로 이동

4) 데이터 저장이 완료되면 로그인 페이지로 이동

2. user model을 사용한 로그인 기능 만들기


서버와 클라이언트 사이에서 '요청'과 '응답'을 할 때 동일한 클라이언트가 요청하는지 확인할 수 있도록 도와주는 '세션'을 이용할 것이다.

  • 세션
    웹 애플리케이션의 사용자 상태를 유지하고 관리하기 위한 메커니즘 중 하나로, 세션을 사용하면 사용자가 로그인한 상태를 유지하거나 사용자 지정 데이터를 저장할 수 있다. 세션은 일반적으로 사용자 식별, 로그인 상태, 장바구니, 언어 설정 등과 같은 정보를 저장하는데 사용된다.

1) templates/user 폴더에서 'signin.html'파일을 불러오는 View함수 로그인을 처리 해 줄 함수 'sign_in_view'에 HTTP 요청 방식을 구분하는 코드 추가

[user/views.py]

from django.http import HttpResponse

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

2) HTML에서 form태그의 속성에 method(POST)와 action('/sign-in/')을 추가

  • '로그인'버튼을 누르면 '/signin/' url로 post 요청을 보냄.
    post 요청을 보낼 때, input의 입력값을 input태그의 id값을 담아간다.

3) views.py의 sign_in_view 함수는 signin.html의 form 태그에 사용자가 제출한 데이터를 객체 형태로 받아서 저장

[user/views.py]

def sign_in_view(request):
    if request.method == 'POST':	# 조건문을 통해서 요청 메서드가 POST인지 검사
        username = request.POST.get('username', None)
	      password = request.POST.get('password', None)

        return HttpResponse("로그인 성공!")
    elif request.method == 'GET':
        return render(request, 'user/signin.html')

4) 이 사용자의 정보가 데이터베이스에 있는지 확인하고 username과 password를 검사해야한다.

# user/views.py
def sign_in_view(request):
    if request.method == 'POST':
        username = request.POST.get('username', None)
        password = request.POST.get('password', None)

        me = UserModel.objects.get(username=username)  # 사용자 불러오기
        if me.password == password:  # 저장된 사용자의 패스워드와 입력받은 패스워드 비교
            request.session['user'] = me.username  # 세션에 사용자 이름 저장
            return HttpResponse("로그인 성공!")
        else: # 로그인이 실패하면 다시 로그인 페이지를 보여주기
            return redirect('/sign-in')
    elif request.method == 'GET':
        return render(request, 'user/signin.html')
  • me = UserModel.objects.get(username=username)
    • Django는 내장된 User 모델을 제공하며, UserModel은 사용자 관리와 인증을 위한 필수적인 정보를 저장하는 모델로 이미 데이터베이스와 연결되어 있는 객체(클래스)이다.
    • 사용자가 회원가입할 때 UserModel 클래스의 인스턴스가 생성되어 데이터베이스에 저장된다.
    • 'objects'는 Django 모델의 기본 매니저로 데이터베이스와 상호작용하는데 사용되며, 모델 객체를 생성, 검색, 업데이트 및 삭제할 때 사용된다.
    • 'get()'은 'objects'매니저의 메서드 중 하나로, 주어진 조건에 맞는 데이터베이스 레코드(행)를 가져온다. 조건에 맞는 결과가 없으면 예외를 발생시킨다.
    • 'username=username'은 데이터베이스에서 검색할 때 사용할 조건이다. (필드 이름, 검색하려는 사용자 이름)

5) 로그인 화면에서 생성한 사용자로 로그인 해보기

3. 회원가입 시에 이미 있는 사용자 인지 확인하는 코드만들기


user/views.py - 회원가입 중복방지

# user/views.py
from django.shortcuts import render, redirect
from .models import UserModel


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)
        password = request.POST.get('password', None)
        password2 = request.POST.get('password2', None)
        bio = request.POST.get('bio', None)

        if password != password2:
            return render(request, 'user/signup.html')
        else:
            exist_user = UserModel.objects.filter(username=username) # 데이터베이스에서 'username'필드의 값 중에 사용자가 제공한 'username'과 같은 데이터를 가져온다.
            
            if exist_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')

4. 사용자가 로그인을 성공한 후에 HttpResponse를 사용해서 화면에 '사용자 이름'을 출력하게 만들기


def sign_in_view(request):
    if request.method == 'POST':
        username = request.POST.get('username', None)
        password = request.POST.get('password', None)

        me = UserModel.objects.get(username=username)  # 사용자 불러오기
        if me.password == password:  # 저장된 사용자의 패스워드와 입력받은 패스워드 비교
            request.session['user'] = me.username  # 세션에 사용자 이름 저장
            return HttpResponse(me.username) # 사용자의 이름을 띄움
        else:
            return redirect('/login')
    elif request.method == 'GET':
        return render(request, 'user/signin.html')

0개의 댓글