Django 2.0 노트- 7. 함수형 뷰 - FBV(Function Based View)

Django에서는 뷰 부분을 함수형 뷰(Function Based View, FBV)와 클래스형 뷰(Class Based View, CBV)로 나뉘는데 그 중 함수형 뷰에 대해 살펴봅니다.

1. 예제 작성 준비

  • fbv 앱 추가
$ python manage.py startapp fbv
  • settings.py 에 앱 등록합니다. 코드는 생략
  • 프로젝트명/urls.py에 아래 url을 추가합니다.

... 생략

urlpatterns = [
    ... 생략
    
    path('fbv/', include('fbv.urls')),
]

  • fbv/urls.py 파일을 생성합니다.

2. HttpResponse

2.1 HttpResponse 일반

  • fbv/urls.py에 아래 코드를 입력합니다.
from django.urls import path
from . import views

urlpatterns = [
    path('http-response/', views.get_http_response),
]
  • fbv/views.py에 아래 코드를 입력합니다.
from django.http import HttpResponse


def get_http_response(request):

    return HttpResponse('''
    <h1>HttpResonse</h1>
    <p>FBV HttpResponse 출력을 보고 있습니다.</p>''')

2.2 HttpResponse 파일 다운로드

  • 예제 코드
with open(filepath, 'rb') as f:
    response = HttpResponse(f, content_type='application/octet-stream'
    response['Content-Dispostion'] = 'attachment; filename="{}"'.format(filename)
    return response

3. JsonResponse

  • JsonReponse는 HttpReposponse를 상속받아서 작성되어진 클래스

  • fbv/urls.py에 아래 코드를 입력합니다.


... 생략

urlpatterns = [
    ... 생략
    path('json-response/', views.get_json_response),
]
  • fbv/views.py에 아래 코드를 입력합니다.
  • 아래의 코드 중 json_dumps_params={'ensure_ascii': False} 키워드 파라미터를 입력하지 않으면 한글이 유니코드로 출력되어집니다.

... 생략

def get_json_response(request):
    return JsonResponse({
        'message': 'JsonResponse 메세지',
        'title': 'JsonResponse 타이틀',
         },
        json_dumps_params={'ensure_ascii': False})

3. render

  • render()함수는 django.shortcuts 패키지에 포함되어 있는 도우미 함수입니다.
  • 동적으로 template을 이용하여 html을 생성한 후 httpResponse에 포함해 반환해줍니다.
  • request템플릿파일명 이 필수 인자입니다.

  • 앞서 이전 포스팅에서 Django 2.0 노트- 6. Template 설정 template 설정을 하였습니다.
  • 'APP_DIRS': True 값을 주었기 때문에, 앱 내에 fbv 디렉토리 안에 templates 디렉토리를 생성합니다.
  • 다시 templates 디렉토리 안에 test.html을 생성하고, 아래의 코드를 입력합니다.
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>render로 진입하였습니다!</h1>
</body>
</html>
  • fbv/urls.py에 아래 코드를 입력합니다.

... 생략

urlpatterns = [
    ... 생략
    path('render/', views.get_render),
]
  • fbv/views.py에 아래 코드를 입력합니다.

... 생략

def get_render(request):
    return render(request, "test.html")

4. render 함수를 통해 data 전달

  • templates 디렉토리 안에 test_context_data.html을 생성하고, 아래의 코드를 입력합니다.
  • `` render 함수를 통해 전달받을 변수 이름입니다.

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>{{title}}</h1>
</body>
</html>


  • fbv/urls.py에 아래 코드를 입력합니다.

... 생략

urlpatterns = [
    ... 생략
    path('render/pass-context-data/', views.get_render_pass_context_data),
]
  • fbv/views.py에 아래 코드를 입력합니다.

... 생략

def get_render_pass_context_data(request):
    return render(request, "test_context_data.html"
                  , context={"title": "render를 통해서 context data 전달"})

5. redirect

  • redirect()함수는 django.shortcuts 패키지에 포함되어 있는 도우미 함수입니다.
  • 다른 url로 변경해주는 역할을 합니다.

5.1 url로 redirect

  • fbv/urls.py에 아래 코드를 입력합니다.

... 생략

urlpatterns = [
    ... 생략
    path('redirect/', views.get_redirect),
]
  • fbv/views.py에 아래 코드를 입력합니다.

... 생략

def get_redirect(request):
    return redirect('/fbv/http-response')

5.2 url로 permanent 옵션

  • redirect()에서 permanent 옵션은 기본값은 False 입니다.

  • fbv/urls.py에 아래 코드를 입력합니다.


... 생략

urlpatterns = [
    ... 생략
    path('redirect-permanent/', views.get_redirect_permanent),
]
  • fbv/views.py에 아래 코드를 입력합니다.

... 생략

def get_redirect_permanent(request):
    return redirect('/fbv/json-response', permanent=True)

5.3 permanent 옵션의 차이 301 vs 302

  • permanent=True 옵션을 주게되면 HTTP 상태 코드는 301로 반환하며 영구 이동입니다.
  • permanent=False 이거나 옵션을 주지 않게되면 HTTP 상태코드는 302 임시 이동입니다.
  • 차이는 301코드의 경우 브라우저가 캐싱하게되며 캐싱한 후부터는 바뀔 URL로 직접 호출 합니다.
  • 302는 임시이므로 원래 url을 호출하게 됩니다.

  • HTTP 상태코드 자료 - https://ko.wikipedia.org/wiki/HTTP_%EC%83%81%ED%83%9C_%EC%BD%94%EB%93%9C

5.4 UrlConf에 등록된 이름으로 호출

  • Url 함수인 path(), re_path() 함수는 name이라는 키워드 인자를 가지고 있습니다. 이를 이용해 url의 name으로 직접 호출할 수 있습니다.

  • fbv/urls.py에 아래 코드를 입력합니다.


... 생략

urlpatterns = [
    ... 생략
       path('name/', views.get_name, name="given_name"),
       path('redirect-name/', views.get_redirect_name),
]
  • fbv/views.py에 아래 코드를 입력합니다.

... 생략

def get_name(request):
    return HttpResponse('<h1>path함수 name옵션을 주었습니다.</h1>')


def get_redirect_name(request):
    return redirect("given_name")

5.5 외부 url 호출

  • fbv/urls.py에 아래 코드를 입력합니다.

... 생략

urlpatterns = [
    ... 생략
       path('redirect-external/', views.get_redirect_external),
]
  • fbv/views.py에 아래 코드를 입력합니다.

... 생략


def get_redirect_external(request):
    return redirect("http://google.com")