터칭 데이터
장고(Django) GET 본문
모든 Question에 대해 JSON 형식으로 조회할 수 있는 API 서버 기능을 하나씩 구현해 보려 합니다.
먼저 뷰 polls_api/views.py에 시작해보겠습니다.
from django.shortcuts import render
from rest_framework.decorators import api_view
from polls.models import Question
from .serializers import QuestionSerializer
from rest_framework.response import Response
# Create your views here.
@api_view()
def question_list(request):
questions = Question.objects.all()
serializer = QuestionSerializer(questions, many = True)
return Response(serializer.data)
1. questions로 Question 모델의 객체들을 가져옵니다.
2. questions의 데이터는 여러개이므로 Serializer에서 many = True로 주었습니다.
다수의 객체를 직렬화할 때: many=True는 여러 개의 모델 객체를 직렬화하려고 할 때 사용됩니다. 일반적으로 Serializer는 단일 모델 객체를 직렬화하는 데 사용되며, many=True를 설정하지 않으면 단일 객체만을 다룹니다. 그러나 many=True를 사용하면 여러 모델 객체를 직렬화할 수 있습니다.
3. QuestionSerializer의 결과물 serializer.data는 JSON 형태이고 이를 Response로 return합니다.
그런데 한가지 눈에 띄는 부분이 있습니다.
바로 @api_view()인데요
@api_view() 데코레이터 너는 누구냐?
Django REST framework의 `@api_view` 데코레이터는 Django 뷰 함수를 API 뷰로 변환하는 역할을 합니다. 이 데코레이터를 사용하면 일반적인 Django 뷰 함수를 RESTful API 뷰로 변환하여 API 엔드포인트를 처리하도록 만들 수 있습니다.
`@api_view` 데코레이터의 주요 역할은 다음과 같습니다:
1. **HTTP 메서드 지원**: `@api_view` 데코레이터를 사용하면 해당 뷰 함수가 특정 HTTP 메서드 (GET, POST, PUT, DELETE 등)에 응답할 수 있습니다. 예를 들어, `@api_view(['GET'])`를 사용하면 해당 뷰 함수는 GET 요청에 응답할 수 있으며, `@api_view(['POST'])`를 사용하면 POST 요청에 응답할 수 있습니다.
2. **Request와 Response 처리**: `@api_view` 데코레이터를 사용하면 뷰 함수는 Django의 `HttpRequest`를 받아들이고, REST framework의 `Response` 객체를 반환할 수 있습니다. 이를 통해 클라이언트 요청을 처리하고 응답을 생성하는 API 뷰를 만들 수 있습니다.
3. **에러 처리**: `@api_view` 데코레이터를 사용하면 뷰 함수에서 발생한 예외를 쉽게 처리하고 적절한 HTTP 상태 코드와 함께 응답으로 반환할 수 있습니다. 예를 들어, 404 에러를 처리하고 해당 API 엔드포인트에서 찾을 수 없는 자원에 대한 응답을 생성할 수 있습니다.
4. **인증과 권한 확인**: `@api_view` 데코레이터를 사용하여 API 뷰에서 인증 및 권한 확인 로직을 구현할 수 있습니다. 이를 통해 요청을 보낸 클라이언트가 요청을 수행할 권한이 있는지 확인하고, 필요한 경우 인증을 처리할 수 있습니다.
예를 들어, 아래는 `@api_view` 데코레이터를 사용하여 GET 요청에 응답하는 간단한 API 뷰의 예입니다:
from rest_framework.decorators import api_view
from rest_framework.response import Response
@api_view(['GET'])
def example_api_view(request):
data = {'message': 'This is a simple API view.'}
return Response(data)
이렇게 작성된 API 뷰는 GET 요청을 처리하고 JSON 형식의 응답을 반환합니다. `@api_view` 데코레이터는 API 개발에서 매우 유용하며, Django REST framework를 사용하여 RESTful API를 빠르고 쉽게 구축할 수 있게 도와줍니다.
이제 polls_api의 폴더에 urls.py파일을 하나 만들어줍니다.
polls_api/urls.py
from django.urls import path
from .views import *
urlpatterns = [
path('question/', question_list, name='question_list'),
]
그리고 위와 같이 작성합니다.
question이 붙은 URL이 오면 views.py의 question_list 메서드에서 처리하도록 urlpatterns에 path를 추가했습니다. 이렇게 새로 만든 polls_api앱에 새로 urls.py를 만들어 path를 작성했다면 가장 먼저 URL을 관리 및 처리하는 프로젝트 즉, 여기서는 mysite/urls.py의 코드를 수정해줘야 합니다.
mysite/urls.py
우리는 지금 rest_framework를 실습하는 중이니 이름을 rest로 붙였습니다. 이제 http://127.0.0.1:8000/rest/ 로 시작하는 URL이 오면 polls_api앱의 urls.py로 보내고 그 다음은 위에서 보았듯이 http://127.0.0.1:8000/rest/question/ 로 뒤에 question이 붙으면 views.py의 question_list로 보내게 됩니다.
이제 브라우저에서 http://127.0.0.1:8000/rest/question/ 접속했을 때 우리가 목표한 대로 Question의 모든 데이터들이 JSON 형태로 조회되는지 살펴보겠습니다.
잘 조회가 됩니다. 저희가 템플릿(templates)를 따로 구현하지 않았지만 장고의 RestFramework가 자동으로 그려준 것입니다.
실제 RestFramework의 도움 없이 저희가 구현한 화면을 보고 싶다면
json 버튼을 눌러주세요.
원본 그대로를 확인할 수 있습니다.
만약 여기서 조회가 안되고 에러가 났다면?
만약 DRF(Django RestFramework)를 설치하지 않았다면
가상환경에서
>python -m pip install djangorestframework
위와 같이 설치하시고
DRF를 설치했음에도 에러가 났다면
mysite의 settings.py의 INSTALLED_APPS를 찾아
rest_framework를 입력해주세요.
'장고 (Django)' 카테고리의 다른 글
장고(Django) PUT/DELETE (0) | 2023.11.04 |
---|---|
장고(Django) POST (0) | 2023.11.04 |
장고(Django) ModelSerializer (0) | 2023.11.04 |
장고(Django) 장고 쉘에서 Serializer 사용하기 (0) | 2023.11.04 |
장고(Django) 시리얼라이저(Serilaizer) (0) | 2023.11.04 |