본문 바로가기
Web Backend/Django

[Django] Django 학습 정리 - FBV(Function Based View)와 URL

by 요호유후 2025. 3. 29.
반응형

지금까지 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):
...

 

 

 

 

 

반응형

댓글