터칭 데이터

장고(Django) GET 본문

장고 (Django)

장고(Django) GET

터칭 데이터 2023. 11. 4. 18:20

 

 

 

모든 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