반응형
지금까지 Django 학습한 내용을 바탕으로 정리를 해보려 한다.
목차 |
1. FBV (Function Based View)
2. 응답 함수 (render, redirect)
3. URL
[작업 환경]
MacOS, PyCharm
pyenv, poetry
Python, Django
1. FBV (Function Based View) |
1. FBV 란?
- Django에서 뷰를 함수(Function)로 작성하는 방식이다.
- Django의 전통적인 방식으로 가장 기본적인 형태이다.
- 직관적이고 간단하게 작성 가능하다.
- 요청 방식에 따라 if문 분기로 작성한다.
⭐️ CBV (Class Based View)
- Django에서 뷰를 클래스(Class)로 작성하는 방식이다.
- FBV에 비해 구조적이고 재사용성이 좋다.
- 요청 방식에 따라 def get(), def post() 와 같이 함수(클래스 메소드) 형태로 정의할 수 있다.
📌 '그래서 FBV보다 CBV가 무조건 좋다.' 이런 의미가 아니라,
프로젝트 규모와 요구사항에 따라 적합한 방식을 선택하여 사용하면 된다.
⭐️ FBV vs. CBV 비교
구분 | FBV | CBV |
개념 | 뷰 로직을 함수로 작성 | 뷰 로직을 클래스로 작성 |
코드 구조 | 직관적이며 간단 | 구조적이고 재사용성이 높음 |
Django 요청 메소드 처리 |
if request.method == 'GET': pass elif request.method == 'POST': pass 의 구조로 작성 (수동처리) |
def get(), def post() 등 클래스 메소드 형태로 작성 가능 상속 받은 부모 클래스에 따라 Django 메소드 자동 인식 됨 |
코드 재사용 | 중복가능성 있음 | 믹스인(Mixin), 상속 등올 재사용 쉬움 |
코드 커스터마이징 | 자유도가 높음 | Django 기본 메소드 오버라이딩 방식 😱 기본 속성, 메소드를 어느정도 알아야 함 |
테스트 용이성 | 상대적으로 용이 | 구조가 복잡할 수 있음 |
2. FBV 사용예시
def blog_delete(request, pk):
if request.method != "POST": # POST 요청
raise Http404
blog = get_object_or_404(Blog, pk=pk, author=request.user)
blog.delete()
return redirect(reverse('fb:list'))
2. 응답함수 (render, redirect) |
1. render() 함수
형태 : render(request, template_name, context)
정의 : 템플릿을 랜더링해서 HTML 페이지로 만들어 변환하는 함수 (HTML 응답)
역할 : HttpResponse 객체를 반환
📌 사용예시
def blog_update(request, pk):
if request.user.is_authenticated:
blog = get_object_or_404(Blog, pk=pk)
else:
blog = get_object_or_404(Blog, pk=pk, author=request.user)
form = BlogPostForm(request.POST or None, request.FILES or None, instance=blog)
print(request.POST, request.FILES)
if form.is_valid():
print(form.cleaned_data)
blog = form.save()
return redirect(reverse('fb:detail', kwargs={'pk': blog.pk}))
context = {
'blog':blog,
'form': form
}
return render(request, 'blog_form.html', context)
2. redirect() 함수
형태 : redirect(to, *args, **kwargs)
정의 : 특정 URL로 재요청 시키는 함수 (리다이렉트 응답)
역할 : HttpResponseRedirect 객체를 반환
📌 사용예시
def blog_delete(request, pk):
blog = get_object_or_404(Blog, pk=pk, author=request.user)
blog.delete()
return redirect(reverse('fb:list'))
3. URL |
1. URL 설정
- 뷰를 작성하고나면 URL과 매칭을 시켜줘야 한다.
[URL 설정 방법]
방법1. config/urls.py 에 작성
방법2. 앱 별 urls.py에 작성한 후 config/urls.py에 include (앱 단위 관리를 위함)
⭐️ View 작성 및 URL 설정 (방법1)
# member/views.py
def login(request):
form = AuthenticationForm(request, request.POST or None)
if form.is_valid():
django_login(request, form.get_user())
next = request.GET.get('next')
if next:
return redirect(next)
return redirect(reverse('blog:list'))
context = {'form': form}
return render(request, 'registration/login.html', context)
# config/urls.py
urlpatterns = [
path('login/', member_views.login, name='login'),
]
⭐️ View 작성 및 URL 설정 (방법2 - 앱 단위)
# blog/views.py
def detail_view(request, pk):
blog_list = Blog.objects.all().select_related('author')
blog = get_object_or_404(blog_list, pk=pk)
serializer = BlogSerializer(blog, many=False)
return Response(serializer.data)
# blog/urls/api_urls.py
app_name = 'api'
urlpatterns = [
path('blog/fbv/<int:pk>', detail_view, name='blog_detail_fbv'),
]
# 호출 시 구조
# <app_name>:<name> => api:blog_detail_fbv
# config/urls.py
urlpatterns = [
path('admin/', admin.site.urls),
# include
path('api/', include('blog.urls.api_urls')),
]
2. URL 관련 함수 정리
개념/함수 | 설명 | 예시 |
URL 엔드포인트 | 사용자가 요청하는 URL의 최종 경로 | 'blog/', 'todo/5', 'signup/ 등 |
urlpatterns = [] | URL과 View를 연결하는 리스트 | urlpatterns = [ path('', views.home, name='home'), ] |
path() | URL 경로 하나를 설정 | path('', views.home, name='home') path('blog/<int:pk>', views.blog_detail, name='blog_detail') |
include() | 앱 단위로 URLConf를 분리할 때 사용 | urlpattrerns = [ path('blog/', include('blog.urls')), ] |
URL Include | include()를 통해 URLConf를 가져오는 구조 | - |
3. 사용자 요청 처리 시퀀스
[사용자 요청] GET /todo/5/ ↓ [config/urls.py] path('todo/', include('todo.urls') ↓ [todo/urls.py] path('<int:pk>/', views.tood_detail, name='detail' ↓ [todo/views.py] def todo_detail(request, pk): ... |
반응형
'Web Backend > Django' 카테고리의 다른 글
[Django] Django 학습 정리 - Django ORM (0) | 2025.03.29 |
---|---|
[Django] Django 학습 정리 - Django Form (0) | 2025.03.29 |
[Django] Django 학습 정리 - 템플릿 문법 정리 (Jinja, extends, block) (0) | 2025.03.29 |
[Django] Django 학습 정리 - Model 정의 및 Migration (0) | 2025.03.28 |
[Django] Django 학습 정리 - Django 초기셋팅 (0) | 2025.03.28 |
댓글