일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 알고리즘 풀이
- DRF
- c++
- CSS
- web
- django ORM
- API
- 파이썬
- MAC
- django rest framework
- 파이썬 알고리즘
- 알고리즘 문제
- 알고리즘 연습
- js
- Django
- Git
- HTML
- 알고리즘
- form
- Algorithm
- 백준
- django widget
- AWS
- PYTHON
- 장고
- javascript
- react
- es6
- java
- Baekjoon
Archives
- Today
- Total
수학과의 좌충우돌 프로그래밍
[Django] FBV 와 CBV 의 decorators 사용법 본문
decorator
는 처음보는 생소할 수 있지만 python 기초 문법입니다. decorator
가 무엇인지 모르신다면 아래 링크를 통해 기초적인 부분을 먼저 공부하고 오시는걸 추천해드립니다.
FBV 에 decorators 사용법
FBV
는 함수로 작성하기 때문에 기존에 알던 방법과 동일합니다. 아래 처럼 2가지 방법이 있습니다.
from django.contrib.auth.decorators import login_required
from django.shortcuts import render
# 방법 1
@login_required
def post_create(request):
# 생략
return render(request, 'core/index.html')
# 방법 2
def post_create(request):
# 생략
return render(request, 'core/index.html')
post_create = login_required(post_create)
CBV 에 decorators 사용법
CBV
에선 클래스로 작성하기 때문에 일반적으로 위의 방법이 통하지 않습니다.
# 방법 1
from django.contrib.auth.decorators import login_required
from django.views.generic import TemplateView
class MyTemplateView(TemplateView):
template_name= "core/index.html"
index = MyTemplateView.as_view()
index = login_required(index)
첫 번째 방법으로는 as_view
를 이용해서 함수를 만든 다음 함수를 감싸주는 방법입니다.
# 방법 2
from django.utils.decorators import method_decorator
class MyTemplateView(TemplateView):
template_name= "core/index.html"
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super().dispatch(*args, **kwargs)
index = MyTemplateView.as_view()
두 번째 방법은 dispatch
함수를 사용하는 방법입니다. 이 함수는 클래스가 새로운 함수를 만들 때마다 항상 실행되는 함수이기 때문에 이 함수를 재정의하며 메소드 데코레이터를 추가해주는 방법입니다.
dispatch
에 새로운 내용을 추가해주는 것도 아닌데 재정의 함으로서 코드의 가독성을 떨어뜨립니다.
# 방법 3
@method_decorator(login_required, name="dispatch")
class MyTemplateView(TemplateView):
template_name= "core/index.html"
index = MyTemplateView.as_view()
가장 추천하는 방법입니다. @method_decorator
는 name
값을 지정함으로서 클래스 메소드에 대해서 해당 decorator
를 사용할 수 있습니다. 원리적으로는 방법 2와 동일하나 가독성을 해칠 염려도 없습니다.
'웹프로그래밍 > Django' 카테고리의 다른 글
[Django] Form 과 validations (0) | 2019.08.08 |
---|---|
[Django] HttpRequest, HttpResponse (0) | 2019.08.08 |
[Django] CBV (2) Generic display views (2) | 2019.08.06 |
[Django] CBV (1) CBV 와 Base Views (2) | 2019.08.06 |
[Django] media 파일 업로드하기 (7) | 2019.07.30 |
Comments