로그인, 로그아웃 기능 만들기
settings.py 의 INSTALLED_APPS 에 'account', 추가 ... account 폴더 생성됨
장고에서는 이미 user 라는 모델을 제공
user 모델을 그대로 가져다 쓸 수 있어서 유저 확장? 을 하지 않고 로그인 로그아웃 기능 구현
account/views.py 에 다음 코드 추가
from django.contrib.auth.forms import AuthenticationForm, UserCreationForm
def login_view(request):
form = AuthenticationForm()
return render(request, 'login.html', {'form':form})
Python
복사
from django.urls import path
from .views import *
urlpatterns = [
Python
복사
# from django.contrib import admin 생각해 보니까 blog 에 admin 이 필요 없음
path('login/', login_view, name="login"),
]
Python
복사
위 코드 추가해서 path 를 넣어줌
path('account/', include('account.urls')),
Python
복사
account 폴더에서 templates 폴더 만든 후 login.html 파일 생성
blog/templates 폴더의 new.html 과 형태 비슷할 것이므로 복붙 해넣고 다음 코드 와 같이 바꿈
{% extends 'base.html' %}
{% block content %}
<h1>Login</h1>
<form action="" method="post">
{%csrf_token%}
{{form.as_p}}
<!-- <table>
{{form.as_table}}
</table> -->
<button type="submit"> submit</button>
</form>
HTML
복사
base.html 에서 연결시킬 a 태그 만들기
<a class="nav-link" href="#">Link</a> 을
<a class="nav-link" href="{% url 'login' %}">Login</a> 과 같이 바꿈
... runserver 로 login 페이지 들어가지는지 확인
blog/views.py 에서 create 라는 함수를 따로 만들어줬었는데, 같이 묶어서 사용할 수도 있음
login.html 을 렌더링 해주는 함수는 GET 방식으로 들어오고, create 나 update 같이 데이터베이스에 접근하는(생성하는) 함수는 host method 로 요청이 들어옴
...
login.html 의 <form action="" method="post"> 을
<form action="{% url 'login' %}" method="post"> 로 바꿈
account/views.py 의 코드를 다음과 같이 변경
from django.shortcuts import redirect, render
from django.contrib.auth.forms import AuthenticationForm, UserCreationForm
from django.contrib.auth import authenticate, login, logout
# Create your views here.
def login_view(request):
if request.method == 'POST':
form = AuthenticationForm(request=request, data = request.POST)
if form.is_valid():
username = form.cleaned_data.get("username")
password = form.cleaned_data.get("password")
user = authenticate(request=request, username=username, password=password)
if user is not None:
login(request, user)
return redirect("home")
else:
form = AuthenticationForm()
return render(request, 'login.html', {'form':form})
def logout_view(request):
logout(request)
return redirect("home")
Python
복사
자동으로 import 에 추가 되기도 하는데 추가 안되면 직접 넣자
⇒ login_view 함수 (그냥 login 이라고 지으면 auth 에서 가져오는 login 과 충돌남)
POST 방식으로 들어올건지 GET 방식으로 들어올건지 if else 로 나눔
폼은 AuthenticationForm 으로 받음
폼에 대한 유효성 검사를 했을 때 통과 하면
username 에 username 이라는 cleaned_data 를 저장
password 에 password 이라는 cleaned_data 를 저장
user 는 인증을 받는 객체로 from django.contrib.auth import authenticate 써줘야 함
authenticate 안에 매개변수 받음 → 폼에서 받은 데이터들을 넣고 인증을 받음
user 가 없지 않을 때(존재 시) 로그인을 함(로그인 모듈 import authenticate 옆에 login 추가)
로그인 실패(유효x)시 home 으로 가는 redirect 는 같으므로 인덴테이션(들여쓰기)을 저래 함
⇒ logout_view 함수
로그아웃 모듈 import authenticate login 옆에 logout 추가(자동으로 될지도)
logout 을 request 해주면 됨
logout 도 home 으로 redirect 함(보냄) ... redirect 도 import 해야하는데 from django.shortcuts import redirect, render 처럼 자동으로 생길지도
account/urls.py 에 path('logout/', logout_view, name="logout"), 추가
a 태그를 다음 같이 base.html 에 추가
<li class="nav-item">
<a class="nav-link" href="{% url 'logout' %}">Logout</a>
</li>
HTML
복사
runserver 로 확인 후
superuser 로 로그인 하면 되긴 하는데 무슨 표시가 안 나타남
⇒ 나타내보장
blog/home.html 에서 {% block content %} 아래에 다음을 추가
{% if user.is_authenticated %}
{{user.username}}
{% endif%}
runserver 해보면 위에 아이디 뜸