티스토리 뷰
앞서 url 관리를 할 때 로그인 기능을 구현할 것이라 하였는데 해보도록 하겠습니다.
먼저 로그인과 관련된 기능을 할 app을 하나 만들어줍니다. 저는 accounts 라는 app을 만들도록 하겠습니다.
그 다음 앱을 만들었으니 url 생성 -> template 작성 -> view 작성 과정을 통해 로그인, 로그아웃, 회원가입 기능을 만들어보겠습니다.
1. url 생성
accounts 앱에 urls.py를 하나 만들어주고 다음과 같이 입력하겠습니다.
from django.contrib import admin
from django.urls import path
from . import views
urlpatterns = [
path('login/', views.login, name="login"),
path('logout/', views.logout, name="logout"),
path('signup/', views.signup, name="signup"),
]
아직 views는 만들지 않았지만, login, logout, signup의 url을 만들어주었습니다.
그리고 project의 urls.py에 accounts.urls를 include 합니다.
#생략
import accounts.views
urlpatterns = [
#생략
path('accounts/',include('accounts.urls'),
]
2. template 만들기
로그아웃의 경우 따로 로그아웃 페이지를 만들지 않겠습니다. 간단하게 복습용으로 새로 만드는 중이라 그냥 클릭만 하면 로그아웃이 되도록 하였습니다.
- 로그인
{% extends 'base.html' %}
{% block content %}
<div class="container">
<h1>로그인</h1>
<form method="POST" action="{% url 'login' %}">
{% csrf_token %}
ID :
<input name="username" type="text" value="">
<br>
<br>
PW :
<input name="password" type="password" value="">
<br>
<br>
<input class="btn btn-primary" type="submit" value="로그인">
</form>
{% if error %}
{{error}}
{% endif %}
</div>
{% endblock %}
base.html을 만들었었으니 extends 하고, POST 방식으로 'login'이라는 이름의 url로 넘겨줍니다.
※POST와 GET
django에는 POST와 GET 메소드가 있습니다. 여러 차이가 있지만, 간단히 얘기하면 POST 방식은 데이터를 BODY에 담아서 넘겨줍니다. 그렇기 때문에 url에 따로 뜨지 않습니다. GET 은 데이터를 url 뒤에 붙혀서 보내게 됩니다. 그렇기에 다른 사용자가 접근해도 상관없는 경우는 GET, 그렇지 않은 경우는 POST 방식으로 데이터를 보내면 됩니다.
id와 password 같은 경우는 url에 노출이 되면 곤란하기에 POST 방식으로 login이라는 이름의 url로 넘겨줍니다.
※ csrf_token
csrf_token을 이용해 csrf 공격에 방어를 합니다. csrf 공격이란, 사용자가 접속해있을 때 전송하는 데이터를 임의로 변경, 삭제 등을 하는 공격을 의미합니다. django에서는 csrf_token 을 이용해 제출한 form과 동시에 token값을 보냅니다. 이로써 해당 form에 대해 csrf공격을 막을 수 있습니다.
- 회원가입
signup.html 또한 위와 비슷하게 만들면 됩니다.
{% extends 'base.html' %}
{% block content %}
<div class="container">
<h1>회원가입</h1>
<form method="POST" action="{% url 'signup' %}">
{% csrf_token %}
ID :
<input name="username" type="text" value="">
<br>
<br>
PW :
<input name="password1" type="password" value="">
<br>
<br>
Confirm :
<input name="password2" type="password" value="">
<br>
<br>
<input class="btn btn-primary" type="submit" value="회원가입">
</form>
</div>
{% endblock %}
이제 필요한 template을 다 만들었으므로 accounts/views.py를 만들어봅시다.
3. views 작성
우선 views의 전체적인 모습을 먼저 보겠습니다.
(아이디 같은 user 존재하면 회원가입 불가 등을 추가할 수도 있습니다! 복습용 포스팅이라 간단하게만 만들어보았습니다.)
from django.shortcuts import render, redirect
from django.contrib.auth.models import User
from django.contrib import auth
# Create your views here.
def signup(request):
if request.method == "POST":
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':'username or password is incorrect'})
else:
return render(request,'login.html')
def logout(request):
if request.method == "POST":
auth.logout(request)
return redirect('home')
return render(request,'signup.html')
- signup
POST 방식으로 데이터가 넘어온 경우 password1, password2를 확인하여 둘이 일치하면 해당 user를 만들어줍니다.
django의 User를 활용하여 입력한 id와 password를 가지는 user를 생성합니다.
그리고 auth는 authentication으로 인증이라는 뜻입니다. request한 user를 login 시켜 home으로 보내도록 만들었습니다.
- login
마찬가지로 POST를 이용하여 데이터가 넘어온 경우, auth.authenticate를 이용해 request한 user정보를 가지는 user를 인증하여 로그인시켜 home으로 보내도록 만들었습니다. 아이디나 비밀번호가 틀린 경우 에러메시지도 포함하였습니다.
- logout
로그아웃 기능은 따로 템플릿 없이 함수로써만 구현했습니다. 그냥 auth.logout을 이용해 request한 user를 로그아웃 시킵니다.
이제 base.html의 원하는 부분에 해당 url들을 연결시켜주면 됩니다.
abcd 라는 아이디를 가지는 user를 만들어보겠습니다.
만들고 나면 자동 로그인이 되도록 했지만 로그아웃 시킨 뒤 다시 login페이지를 이용해 login 시켜보겠습니다.
abcd 라는 녀석을 로그인시켰습니다!