본문 바로가기
Personal Project

django로 diary 만들기 [accounts(회원) 세션 구현] -2

by applepick 2020. 8. 7.
반응형

저번시간에 이어서 만들어보겠습니다. 이제 urls.py와 받을 폼을 만들었으니 views.py를 구현해야겠죠?

django 내부 유저모델을 사용한다고 했으니 사용해보겠습니다.

accounts/views.py에서 

from django.shortcuts import render, redirect
from django.contrib.auth.models import User
from django.contrib import auth

def signup(request):
    if request.method  == 'POST':
        if User.objects.filter(username=request.POST['username']).exists(): #아이디 중복 체크 
            return render(request, 'signup_error.html')
        if request.POST['password1'] == request.POST['password2']:
            user = User.objects.create_user(
                request.POST['username'], password= request.POST['password1'])
        auth.login(request, user)
        return redirect('home')
    return render(request, 'signup.html')

def login(request):
    if request.method  == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        user = auth.authenticate(request, username=username, password= password)
        if user is not None:
            auth.login(request, user)
            return redirect('home')
        else:
            return render(request, 'login.html', {'error': '아이디 또는 비밀번호를 확인해주세요'})
    else:
        return render(request, 'login.html')

def logout_request(request):
    auth.logout(request)
    return redirect('/')
    return render(request, 'login.html')   

이렇게 구현했습니다. 하나 하나씩 설명해보겠습니다. 일단 singup부분을 보자면 회원가입 함수입니다.

if request.method  == 'POST':에서 값을 받아오는 형식에는 get과 post가 있는데 post가 좀 더 보안성을 가지고있어 post로 받아왔습니다. 이것은 나중에 정리하겠습니다.

이것을 쓴이유는 html파일에서 받아온값이 post이면 실행하겠다! 이것입니다.

 if User.objects.filter(username=request.POST['username']).exists(): #아이디 중복 체크 
            return render(request, 'signup_error.html')

이 부분은 만약 기존에 가입하려던 아이디와 동일하면 가입을 못하게 하는것입니다. 저는 signup_error.html에 예외처리를 해두어 연결해놓았습니다. 그냥 오류를 넘기지말고 내부에 알람으로 하는 방법도있습니다.

아이디가 같지않으니 밑으로 내려오겠죠?

 if request.POST['password1'] == request.POST['password2']:
            user = User.objects.create_user(
                request.POST['username'], password= request.POST['password1'])
        auth.login(request, user)
        return redirect('home')

여기서 이제 패스워드를 검토하기위해 사용자에게 페스워드를 두번 입력하라고 합니다.

그리고 만약 맞다면 django 내부의 유저모델을 사용하여 유저를 생성합니다. 만약 틀리면다시 회원가입창으로 넘어갑니다.

이로써 회원가입은 성공했습니다. 이제 로그인할수있도록 해주어야겠죠?

login부분을 보자면

if request.method  == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        user = auth.authenticate(request, username=username, password= password)
        if user is not None:
            auth.login(request, user)
            return redirect('home')
        else:
            return render(request, 'login.html', {'error': '아이디 또는 비밀번호를 확인해주세요'})
    else:
        return render(request, 'login.html')

login.html에서 받아온 값을 변수에다가 넣어줘야겠죠? 

저는username과 password라는 변수를 선언해서 값을 넣어줬습니다. 그리고

유저라는 변수에 django 내부 모델에서 사용하는auth.authenticate를 사용하여 값을 비교합니다.

만약 user라는 변수안에 값이 없으면 다시 홈으로 돌아가게 해놓았습니다.

그게아니라 값이 다르면다시 login.html을 불러와 다시입력할수있도록해놓았습니다.

만약 입력받은값이 POST가 아니라면 위와같이 login.html을 불러올수있도록 했습니다.

이제 로그인 까지 구현했으니 로그아웃도 할수있게 해야겠죠? 로그아웃은 쉽습니다. django 내부에서 제공하는 함수를 사용하면 됩니다.

def logout_request(request):
    auth.logout(request)
    return redirect('/')
    return render(request, 'login.html')   

엄청 간단하죠? auth.logut을 사용해서 로그인 된 값을 로그아웃합니다. 로그아웃하고 다시 홈화면으로 돌아가고

그게아니라면 다시 로그인 창으로 넘어가게되어있습니다.

이렇게 accounts(회원)을 구현하였습니다. 

반응형

댓글