Meme's IT

[Django] 로그인(4) 로그인 여부에 따른 출력 본문

BackEnd/Django

[Django] 로그인(4) 로그인 여부에 따른 출력

Memez 2023. 10. 5. 17:19

2023.10.05 - [Django] - [Django] 로그인(3) - 비밀번호 바꾸기

 

[Django] 로그인(3) - 비밀번호 바꾸기

2023.10.05 - [Django] - [Django] 로그인(2) 가입/탈퇴/수정 [Django] 로그인(2) 가입/탈퇴/수정 2023.10.04 - [Django] - [Django] 로그인(1) 로그인, 로그아웃 [Django] 로그인(1) 로그인, 로그아웃 # Django Authentication System

memezz.tistory.com

와 이어집니다.


메인페이지에서 

로그인을 했을 때에는 로그인 / 회원가입이 필요없고,

로그인이 안되어 있을 때는 로그아웃 / 회원탈퇴 / 회원정보수정이 필요없다.

 

그래서 로그인 여부에 따라 화면 출력을 다르게 하고 싶을 때

is_authenticated함수를 활용한다.

 

# is_authenticated

사용자가 인증되었는지 여부를 알 수 있는 User model의 속성

인증(= 로그인)되어 있다면 True, 아니라면 False의 결과를 가짐

해당 함수를 이용해서 index 페이지를 수정할 수 있다.

{% if request.user.is_authenticated %}
  <h3>{{ user.username }}님 안녕하세요!</h3>
  <form action="{% url "accounts:logout" %}" method="POST">
    {% csrf_token %}
    <input type="submit" value="LOGOUT">
  </form>
  <a href="{% url "accounts:update" %}">회원정보수정</a>
  <form action="{% url "accounts:delete" %}" method="POST">
    {% csrf_token %}
    <input type="submit" value='탈퇴하기'>
  </form>
  <hr>
{% else %}
  <a href="{% url "accounts:login" %}">LOGIN</a>
  <a href="{% url "accounts:signup" %}">SIGNUP</a>
{% endif %}

로그인이 안 되어있을 때
로그인을 했을 때

 


추가적으로 게시판의 글을 로그인한 사용자만 쓸 수 있도록 구현하고 싶을 때는

login_required라는 데코레이터를 사용한다.

※ 데코레이터란?

더보기

만약 어떤 함수에서 전/후처리가 필요하고, 그런 함수가 여러개라면 중복이 발생한다

그럴때 데코레이션을 이용해서 중복을 줄일 수 있다.

 

# 데코레이터함수
def my_deco(fun):
    def wrapper():
        print("전처리")
        fun()
        print("후처리")
    return wrapper

@my_deco
def myfun():
    print('myfun')
    
myfun()

을 실행하면 

전처리
myfun 
후처리

의 결과를 얻을 수 있다.

 

 

이런 데코레이터를 이용해서 로그인이 되는지 안되는지를 확인하여

특정 함수를 실행할지 말지를 정할 수 있다.

is_logined = False

def login_check(fun):
    def wrapper():
        if not is_logined:
            print('로그인하고와라')
            return
        fun()
        print("후처리")
    return wrapper

@login_check
def myfunc():
    print('메인')

myfunc()
로그인하고와라

다음과 같은 기능을 Django에서 login_required라는 이름의 데코레이터로 제공함

login_required

= 인증된 사용자에 대해서만 view 함수를 실행시키는 데코레이터

비인증 사용자의 경우, /accounts/login/ 주소로 redirect 시킴

 

사용하는 법은 매우 간단, 그냥 views.py에서 해당 함수 위에 @login_required만 추가

# articles/views.py
from django.contrib.auth.decorators import login_required

@login_required		
# 이거만 추가해주면 된다
def create(request):
    if request.method == 'POST':
        form = ArticleForm(request.POST)
        if form.is_valid():
            article = form.save()
            return redirect('articles:detail', article.pk)
    .... 생략