Python/python 클론코딩
(계속) Django Authentication 기능을 통한 로그인 / 인증 / 로그아웃
SeongWon
2020. 4. 2. 22:46
반응형
1. 로그인
login.html
<form class="mt-3" method="post" action='{% url "accounts:login" %}'>{% csrf_token %}
<div class="form-group">
<input type="text" class="form-control" id="user_id" name="user_id" placeholder="사용자 이름">
</div>
<div class="form-group">
<input type="password" class="form-control" id="user_pw" name="user_pw" placeholder="비밀번호">
</div>
<button type="submit" class="btn btn-primary" onclick="">로그인</button>
</form>
loginView.py
from django.contrib.auth import authenticate, login
def new_LoginView(request):
if request.method == "GET":
return render(request, 'login.html')
elif request.method == "POST":
user_id= request.POST.get('user_id')
user_pw= request.POST.get('user_pw')
user = authenticate(request, username=user_id, password=user_pw)
if user is not None:
login(request,user=user)
return redirect('instagram:main')
else:
messages.error(request,'ID 혹은 비밀번호 오류입니다.')
return redirect('accounts:login')
-
authenticate(request=None, **credentials)
: User 인증 함수. 자격 증명이 유효한 경우 User 객체를, 그렇지 않은 경우 None을 반환
-
login(request, user, backend=None)
: 로그인 함수. Django의 세션 프레임 워크를 사용하여 세션에 인증된 사용자의 ID를 저장
2. 로그인 인증
# settings.py
...
LOGIN_URL = '/login/'
...
로그인 상태를 필수로 요구하는 페이지나 기능에 접근하려 할 때, 현재 사용자가 인증된 사용자인지 확인해야 한다.
위는 사용자가 인증에 실패할 시, 리다이렉트 할 기본 경로를 지정해준 것이다.
2.1 View에서의 인증확인
if request.user.is_authenticated:
# 로그인한 유저인 경우
...
else:
# 로그인 하지 않은 유저인 경우
...
return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
- is_authenticated : 대상 User 객체의 로그인 여부를 확인
- '%s?next=%s' : 기본적으로 인증 성공시 사용자를 리다이렉트하는 경로는 "next"라는 쿼리 문자열 매개 변수에 저장
@login_required
def example(request):
if ........
- login_required() 데코레이터를 사용하면 로그인하지 않은 유저에 대한 처리를 위의 방법보다 더 간단하게 구현할 수 있다.
2.2 Templates에서의 인증확인
...
{% if user.is_authenticated %}
<a href="{% url 'login:signout' %}">로그아웃</a>
{% else %}
<a href="{% url 'login:signin' %}">로그인</a>
{% endif %}
...
3. 로그아웃
def Logout(request):
logout(request)
return redirect('accounts:login')
- 현재 로그인된 세션에 대한 모든 데이터를 삭제
반응형