Django

Chapter 10-3 Django 데코레이터와 템플릿 태그 실전 정리

Chansman 2025. 5. 15. 15:52

🧩 Django 데코레이터와 템플릿 태그 실전 정리


1️⃣ @register.simple_tag() – 커스텀 템플릿 태그 만들기

📌 개념 정리

  • Django에서 템플릿에서 재사용 가능한 간단한 로직을 작성할 때 사용
  • @register.simple_tag 데코레이터를 통해 정의함
  • 템플릿에서 {% add a b %}와 같은 방식으로 사용 가능

✅ 예시 코드

from django import template

register = template.Library()

@register.simple_tag
def add(a, b):
    return a + b

📌 강의 실전 코드

# templatetags/custom_tag.py
from django import template

register = template.Library()

@register.simple_tag()
def add_like_class(user, likes):
    for like_obj in likes:
        if like_obj.user == user:
            return ' text-danger'
    return ''

✔️ 사용 예: 템플릿에서 좋아요한 사용자에게 스타일 클래스를 추가


2️⃣ @csrf_exempt – CSRF 보호 비활성화

📌 개념 정리

  • Django는 기본적으로 모든 POST 요청에 CSRF 토큰 검사를 수행
  • 외부 API 연동, AJAX 테스트 등 특정 뷰에서만 검사 비활성화 필요 시 사용
  • 보안상 매우 주의 필요 → 꼭 필요한 경우에만 사용

✅ 예시 코드

from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def my_view(request):
    return HttpResponse("CSRF 보호가 없습니다.")

3️⃣ @login_required – 로그인한 사용자만 접근 허용

📌 개념 정리

  • 로그인하지 않은 사용자는 자동으로 LOGIN_URL로 리디렉션됨
  • 함수 기반 뷰(FBV)에서 사용 → 클래스형 뷰에서는 LoginRequiredMixin 사용

✅ 예시 코드

from django.contrib.auth.decorators import login_required

@login_required
def my_view(request):
    return HttpResponse("로그인한 사용자만 접근할 수 있습니다.")
  • 옵션 설정:
@login_required(login_url='/custom-login/', redirect_field_name='next')

📌 강의 실전 코드

# post/views.py
@csrf_exempt
@login_required()
def toggle_like(request):
    post_pk = request.POST.get('post_pk')
    if not post_pk:
        raise Http404()

    post = get_object_or_404(Post, pk=post_pk)
    user = request.user

    like, created = Like.objects.get_or_create(user=user, post=post)

    if not created:
        like.delete()

    return JsonResponse({'created': created})

📌 이 뷰는 Ajax 요청으로 전달받은 post_pk에 대해 로그인 여부를 검사하고,
해당 게시글의 좋아요 토글(생성 or 삭제)을 수행합니다.

 

post/models.py

class Like(TimestampModel):
    post = models.ForeignKey(Post, related_name='likes', on_delete=models.CASCADE)
    user = models.ForeignKey(User, related_name='likes', on_delete=models.CASCADE)

    def __str__(self):
        return f'[like] {self.post} | {self.user}'

🧠 마무리 요약

데코레이터 주요 기능 사용 위치 주의 사항

@simple_tag 템플릿에서 로직 실행 템플릿 태그 재사용성 높음
@csrf_exempt CSRF 보호 해제 함수형 뷰 보안 취약 가능성 주의 ⚠️
@login_required 로그인한 사용자만 접근 허용 함수형 뷰 리디렉션 경로 설정 가능

이러한 데코레이터는 Django의 보안과 기능 확장에 필수적인 요소로,
올바른 상황에 맞춰 사용하는 것이 중요합니다. 🔐