ACHO.pk devlog

[멋쟁이사저처럼10기] Django 블로그 만들기(로그인/로그아웃) 본문

멋쟁이사자처럼

[멋쟁이사저처럼10기] Django 블로그 만들기(로그인/로그아웃)

Acho 2022. 7. 8. 20:35

 

[블로그 만들기] 라는 글이 계속해서 이어지고 있는 만큼 시작 전에 초기설정 먼저 알아보자..

<초기 설정>

1. myproject 생성

2. blogapp 생성 + 등록

3. templates 폴더 생성 + index.html 생성 + url 등록(함수 실행시키기 위함) + def함수 등록(html과 연결시키기 위함)

그리고 각 주제(글 생성이나 댓글 .. 등)에서 따로 코드를 더 적은 admin.py, settings.py. 새롭게 만든 models.py 등은 해당 게시글에서 확인하면 되겠다.

 


로그인 창 띄우기

 

새 글을 생성할 수 있는 사람에 제한을 두기 위해서 로그인/로그아웃 기능이 필요하다.

일단, 'accounts'의 이름을 가진 어플리케이션을 만들어주자. settings.py에 앱등록을 해야하는 것도 잊으면 안된다.

python manage.py startapp accounts

index.html(웹사이트 기본 화면) 에 로그인 url이 실행되도록 한다.

<a href = "{% url 'login' %}">로그인</a>

urls.py 

from blogapp import views
from accounts import views as accounts_views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.home, name='home'),
    
    #로그인
    path('login/', accounts_views.login, name='login'),
]

views.py( accounts 어플리케이션 폴더 )

from django.shortcuts import render

def login(request):
    #POST 요청이 들어오면 로그인 처리를 해줌
    if request.method == 'POST':
        pass
    #GET 요청이 들어오면 login form을 담고 있는 
    #login.html을 띄워주는 역할을 함
    else:
        return render(request,'login.html')

 

acounts 어플리케이션 폴더 안에 templates 폴더를 만든 후, 'login.html'를 만들어준다.

<form action="{% url 'login' %}" method="POST">
    {% csrf_token %}
    username : <input type='text' name="username">
    <br>
    password : <input type='password' name="password">
    <br>
    <input type ="submit" value="로그인">
</form>

 

 


로그인 수행하기

로그인 버튼을 클릭(= POST 요청을 보냄)

 

views.py

  • username과 password을 파이썬 변수에 담아줘야한다.
  • django에서는 데이터베이스에 저장된 회원인지 아닌지 판단해주는 내장된 기능을 제공한다. auth 안에 여러 메서드를 이용할 수 있다. 로그인, 로그아웃 기능도 수행할 수 있다.
  • authenticate 메서드는 username과 password가 실제로 데이터베이스에 존재하는지 userid와 pw로 확인한다.
  • django db에 존재하는 회원이라면 그 user 객체를 반환하고, 그렇지 않으면 NONE를 반환한다.
  • 우리가 만든 관리자(admin) 계정에 id와 password는 django가 내장하고 있는 User 객체가 관리하고 있다. 
from django.shortcuts import render,redirect
from django.contrib import auth
from django.contrib.auth.models import User

def login(request):
    #POST 요청이 들어오면 로그인 처리를 해줌
    if request.method == 'POST':
        userid = request.POST['username']
        pw = request.POST['password']
        user = auth.authenticate(request, username=userid, password=pw)
        if user is not None:
            auth.login(request, user)
            return redirect('home')
        else:
            return render(request, 'bad_login.html')
    #GET 요청이 들어오면 login form을 담고 있는 
    #login.html을 띄워주는 역할을 함
    else:
        return render(request,'login.html')

로그인 했을 때 아이디나 비번이 다를경우 'bad_login.html'로 이동하게 했는데, 이는 다른 'html'로 대체해도 된다.

 

index.html

{% if user.is_authenticated %}
안녕하세요, {{ user.username }}님!
{% else %}
아직 로그인이 되지 않았습니다
{% endif %}
<br>

<a href = "{% url 'login' %}">로그인</a>

 

로그인이 정상적으로 수행되는지 확인하기 위해 admin 계정을 새로 만들어보자.

 python manage.py createsuperuser

로그인에 성공할시에 admin 계정의 Username이 뜨는 것을 확인할 수 있다.

옳지 않은 아이디나 비번을 입력할 시, 로그인 실패라는 url로 이동하게 된다.


로그인한 사람만 '새 글 작성' 가능 + 로그아웃 기능

 

index.html

{% if user.is_authenticated %}
안녕하세요, {{ user.username }}님!<br>
<a href = "{% url 'logout' %}">로그아웃</a>

{% else %}
아직 로그인이 되지 않았습니다
<a href = "{% url 'login' %}">로그인</a>

{% endif %}
<br>

{% if user.is_authenticated %}
<a href="{% url 'modelform' %}">새 글 작성</a>
{% endif %}

 

urls.py

from accounts import views as accounts_views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.home, name='home'),

    #로그아웃
    path('logout/', accounts_views.logout, name='logout'),

]

 

views.py

    
def logout(request):
    auth.logout(request)
    return redirect('home')

로그인 했을 때
로그아웃 했을 때

 

로그인일 때만 새 글 작성 가능


 

로그인에 성공했을 때 자동으로 redirect

하는 곳을 정해줄 수 있음

 

settings.py

LOGIN_REDIRECT_URL = '/'

# Internationalization
# https://docs.djangoproject.com/en/4.0/topics/i18n/

LANGUAGE_CODE = 'en-us'
Comments