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의 보안과 기능 확장에 필수적인 요소로,
올바른 상황에 맞춰 사용하는 것이 중요합니다. 🔐