Renderer
๐ก Renderer
Renderer๋ฅผ ๊ฐ์ Endpoint์ ๋ํด์ ๋์ผํ ๋ก์ง์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌ ํ๊ณ ๋์
์ต์ข ์ ์ผ๋ก ์๋ต์ ์ค ๋์ ์ด๋ค ์๋ต ํฌ๋งท์ผ๋ก ์ฒ๋ฆฌํ ๊ฒ์ธ์ง๋ฅผ ๋ํ๋ธ๋ค.
Content-Type, URL์ ๋ฐฉ๋ฒ์ ํตํด์ Renderer ์ง์ ๊ฐ๋ฅํ๋ค.
๐ก ๊ธฐ๋ณธ ์ง์ ๋๋ Renderer
1. JSONRenderer (default ์ง์ )
โช media_type โ application/json โ json
json.dumps๋ฅผ ํตํ JSON ์ง๋ ฌํ
2. BrowsableAPIRenderer (default ์ง์ )
โช media_type โ text/html, format โ api
self-document HTML ๋ ๋๋ง
3. Template(HTML)Renderer
โช media_type โ text/html, format โ api
์ง์ ํ ํ๋ฆฟ์ ํตํ ๋ ๋๋ง
Response์์ template_name ์ธ์ ์ง์ ํ์
API ์๋ฒ๋ผ๊ณ ํด์ ๋ชจ๋ ์๋ต์ JSON์ผ๋ก ๋ฐ์ง ์์๋, ๊ฒฝ์ฐ์ ๋ฐ๋ผ์ HTML์๋ต์ ๋ฐ์ ์๋ ์๋ค.
class PostDetailAPIView(RetrieveAPIView):
queryset = Post.objects.all()
renderer_template = [TemplateHTMLRender]
template_name = 'instagram/post_detail.html'
"""
template_name์ ์ฌ๊ธฐ์ ์ ์ธํด๋ ๋๊ณ ,
๋๋ getํจ์์ kwargs๋ก ๋๊ฒจ๋ ์๊ด์๋ค.
"""
def get(self, request, *args, **kwargs):
post = self.get_object()
return Response({
'post':PostSerializer(post).data
})
์ ์ฝ๋์์ get_object()๋ RetrieveAPIView ํด๋์ค ๋ด๋ถ์ ๊ตฌํ๋์ด ์๋ค.
๊ทธ๋ฆฌ๊ณ kwargs์์ โpostโ:PostSerializer(post).data ๊ฐ์ด ๋๊ฒจ์ฃผ๊ฒ ๋๋ฉด
์๋์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํด์ค๋ค.
๋ฐ๋ฉด์ ๊ทธ๋ฅ post๋ง ๋๊ฒจ์ฃผ๊ฒ ๋๋ค๋ฉด, ์๋์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ ์๋ค.
๐ก ๋ค์ํ Renderer
StaticRenderer
๋ฏธ๋ฆฌ ๋ ๋๋ง๋ HTML์ ๋ฐํํ๋ค.
์๋์ ๊ฐ์ด, Response๊ฐ์ฒด ์์ฑ์์ HTML๋ฌธ์์ด์ ์ง์ ์ง์ ํด ์ค๋ค.
@api_view(['GET'])
@renderer_classes([StaicHTMLRenderer])
def static_view(request):
html = """<html><body>example</body><html>"""
return Response(html)
์ด ์ธ์๋ AdminRenderer, HTMLFormRenderer, MultiPartRenderer๋ฑ์ด ์ง์๋๋ค.
๐ก Renderer ํด๋์ค ๋ฆฌ์คํธ ์ง์ ํ๊ธฐ
1. ์ ์ญ ์ง์ (์ถ์ฒ โ)
settings > REST_FRAMEWORK > DEFAULT_RENDERER_CLASSES ๋ฆฌ์คํธ์ ๋ฌธ์์ด๋ก ์ง์ .
โช rest_framework/settings.py
2. APIView ๋ง๋ค ์ง์
queryset, serializer_class์ ๋๋ถ์ด, renderer_classes ๋ฆฌ์คํธ
3. @api_view ๋ง๋ค ์ง์
๋ณ๋์ renderer_classes ์ฅ์์๊ฐ ์๋ค.
๐ก Renderer ์๋ต ํฌ๋งท
1. ๋ ๊ฐ์ง ์ ํ์ ์๋ต ํฌ๋งท
โช api : API EndPoint์ ๋ธ๋ผ์ฐ์ ๋ฅผ ํตํด ์ ๊ทผํ ๋, ์น UI๋ก ์กฐํ ๊ฐ๋ฅ
http://127.0.0.1:8000/post/1.api
http://127.0.0.1:8000/post/1/?format=api
โช json : ๋ณดํต์ API์ ๊ทผ
http://127.0.0.1:8000/post/1.json
http://127.0.0.1:8000/post/1/?format=json
2. ์๋ต ํฌ๋งท์ ์ด๋ป๊ฒ ๊ฒฐ์ ๋๋๊ฐ?
Accept ํค๋
โข Accept: application/json
โข Accept: text/html
GET์ธ์ format
โข ?format=json
โข ?format=api
URL Captured Values์์์ format ์ธ์
โข .json
โข .api
๐ก URL Captured Values์์์ format ์ธ์
router๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ์๋์ ๊ฐ์ด format ์ธ์๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ํด์ค๋ค.
<URLPattern '^post\.(?P<format>[a-z0-9]+)/?$' [name='post-list']>
๋ฐ๋ฉด์ ๊ฐ๋ฐ์๊ฐ โํจ์๊ธฐ๋ฐ viewโ๋ฅผ ๊ตฌํํ ๊ฒฝ์ฐ์๋ ํํ URLPatterns์ ์ง์ ๋
format=None
์ kwargs๋ก ๋๊ฒจ์ค์ผํ๋ค.
โํด๋์ค ๊ธฐ๋ฐ viewโ๋ ํฌ๊ฒ ๋ฌธ์ ๊ฐ ๋๋ ๋ถ๋ถ์ด ์๋ค.
None์ผ๋ก ๋๊ฒจ์ฃผ๋ ์ด์ ๋ format์ด ์์ ๊ฒฝ์ฐ๋ฅผ ๋๋นํด default๊ฐ์ ์ง์ ํด ์ฃผ๋ ๊ฒ์ด๋ค.
# views.py
from rest_framework.decorators import api_view
@api_view(['GET'])
def hello(request, format=None):
return Response([])
์๋ ์ฝ๋๋ ๊ทธ๋ฆฌ๊ณ router๋ฅผ ์ฌ์ฉํ์ง ์๊ณ , format ์ธ์๋ฅผ URLPatterns์ ์ ์ธํ๋ ๋ฐฉ๋ฒ์ด๋ค.
# urls.py
from rest_framework.url.patterns import format_surfix_patterns
urlpatterns = format_suffix_patterns([
paht('hello/', views.hello)
])
์์ฑ๋ URLPatterns๋ ๋ค์๊ณผ ๊ฐ๋ค.
[
<URLPatterns 'hello'/>,
<URLPaatters 'hello<drf_format_suffix:format>'>
]