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>''')
- 테스트 서버를 실행 후 아래 url을 확인 합니다.
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})
- 테스트 서버를 실행 후 아래 url을 확인 합니다.
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")
- 테스트 서버를 실행 후 아래 url을 확인 합니다.
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 전달"})
- 테스트 서버를 실행 후 아래 url을 확인 합니다.
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')
- 테스트 서버를 실행 후 아래 url을 확인 합니다.
- 아래 URL은 http://127.0.0.1:8000/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)
- 테스트 서버를 실행 후 아래 url을 확인 합니다.
- 아래 URL은 http://127.0.0.1:8000/fbv/json-response/ 로 변경됩니다.
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")
- 테스트 서버를 실행 후 아래 url을 확인 합니다.
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")
- 테스트 서버를 실행 후 아래 url을 확인 합니다.
- Google 홈페이지로 이동합니다.