'll Hacker

[WIL] 5주차, Django REST Framework(DRF) 본문

Dev/GDSC

[WIL] 5주차, Django REST Framework(DRF)

씨이오가 되자 2024. 11. 16. 01:39
728x90

django 웹 프레임워크를 기반으로 한 도구세트로, django를 이용해서 REST api를 만들기 위한 라이브러리 

Django Django REST Framework
자체 웹 템플릿에게 데이터 전달

풀스택 개발을 위한 목적으로 사용

html을 응답
플랫폼의 클라이언트에게 데이터를 전달

백엔드 API 서버 개발을 위한 목적으로 사용됨.

json 형태의 response 응답 

 

RESTful API? 간단하고 효율적이고 호환성이 높음!

REST : 인터넷에서 컴퓨터 또는 시스템 간 정보를 주고 받는 방식의 하나
- URL과 웹 페이지를 보거나 변경하는 행위를 사용하여 정보를 쉽고 간단히 찾을 수 있게 함.
- 웹 아키텍처 스타일로 리소스의 상태를 HTTP 메서드를 통해 전송하는 방식 

 

REST 원칙에 기반해 서버의 리소스를 클라이언트와 주고받는 웹 서비스

  • 리소스는 고유한 URL로 식별되며, 서버는 요청에 따라 데이터를 제공하거나 수정, 삭제 등의 작업을 처리 
  • REST의 설계원칙을 따르기 때문에 확장성과 유지보수성이 뛰어남 
Serialization?
serializer는 복잡한 데이터 형식(예: Django 모델 인스턴스, 쿼리셋)을 JSON, XML과 같은 API에서 사용하기 쉬운 형식으로 변환하는 역할을 함.
직렬화(Serialization) : 파이썬 객체를 JSON, XML 등의 형식으로 변환하여 API 응답으로 전송
역직렬화 : API 요청으로 받은 JSON. XML 데이터를 파이썬 객체로 변환
데이터 표현 : Serializer는 데이터를 표현하는 방식을 정의 

 

Serializer 사용방법

1. Serializer 클래스 정의

  • Serializers.Serializer 클래스를 상속받아 Serializer 클래스를 정의.
  • 클래스 내부에서 CharField, IntegerField 등의 필드를 정의하여 데이터 형식을 지정.

2.  Serializer 인스턴스 생성 

  • Serializer 클래스의 인스턴스를 생성.
  • 직렬화할 객체를 data 인수로 전달

3. 데이터 직렬화

  • serializer.data 속성을 사용하여 직렬화된 데이터를 가져옴.

4. 데이터 역직렬화

  • serializer.is_valid( ) 메서드를 사용하여 데이터 유효성을 검사하고, serializer.validated_data 속성을 사용하여 유효성을 검사를 통과한 데이터를 가져옴.

 

여기까지..! 이론을 봤다면 이젠 실습을 해보자.


1. DRF 설치

pip install djangorestframework

2. settings.py의 INSTALLED_APPS 에 rest_framework 추가 

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',  # Django REST framework
    'myapp',  # 새로 만든 앱 추가
]

3. 모델 생성

from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=100)
    published_date = models.DateField()

    def __str__(self):
        return self.title

4. app 하단에 serializer.py 생성 후 모델에 맞는 serializer 작성

from rest_framework import serializers
from .models import Book

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = ['id', 'title', 'author', 'publication_date']
        # fields = '__all__'  # 모든 필드를 포함

5. serializer을 활용해 api 작성

from rest_framework.response import Response
from rest_framework.views import APIView
from .models import Book
from .serializers import BookSerializer

class BookList(APIView):
    def get(self, request):
        books = Book.objects.all()  # 모든 책 가져오기
        serializer = BookSerializer(books, many=True)
        return Response(serializer.data)

    def post(self, request):
        serializer = BookSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=201)
        return Response(serializer.errors, status=400)

 


APIView?

Django REST Framework에서 제공하는 가장 기본적인 뷰 클래스 

GET, POST, PUT, DELETE와 같은 HTTP 메서드를 처리하는 메서드를 제공 

 

<주요 특징>

1. HTTP 메서드 처리

  • APIView는 GET, POST, PUT, DELETE 등의 HTTP 메서드를 처리하기 위한 메서드를 직접 정의
  • 이를 통해 각각의 HTTP 요청에 따라 다른 로직을 수행

2. 직접적인 응답 처리

  • APIView는 JSON이나 다른 형식으로 데이터를 직접 응답할 수 있도록 Response 객체를 제공
  • 이를 통해 데이터를 직렬화하거나 상태코드와 함께 응답 

3. 권한 및 인증

  • APIView는 DRF에서 제공하는 인증 및 권한 시스템과 쉽게 연동됨
  • 예를 들어, 특정 사용자만 접근할 수 있도록 제어할 수 있음 

4. 직렬화 지원

  • APIView에서는 데이터를 직렬화하고 역직렬화하는 기능을 제공 
  • 이를 활용해 요청 데이터를 저장하거나 응답 데이터를 클라이언트에 전달 
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .models import Book
from .serializers import BookSerializer

class BookList(APIView):
    def get(self, request):
        books = Book.objects.all()  # 모든 책 가져오기
        serializer = BookSerializer(books, many=True)
        return Response(serializer.data)

    def post(self, request):
        serializer = BookSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

 

1. get (self, request) 함수 - 모든 책 데이터를 가져와 반환 

<작동방식>

  1. Book.objects.all( ) : Book 모델에 저장된 모든 책 객체를 가져옴
  2. BookSerializer(books, many=True) : 
    BookSerializer를 사용하여 책 객체들을 직렬화함.
    many = True : 여러 개의 객체를 직렬화할 때 필요한 옵션 
  3. Response(serializer.data) : 직렬화된 데이터를 JSON 형식으로 클라이언트에게 반환함 

2. post(self, request) 함수

<작동방식>

  1. BookSerializer(data=request.data) : 클라이언트가 요청으로 보낸 데이터를 BookSerializer를 통해 직렬화함
  2. Serializer.is_valid( ) 
    요청 데이터가 유효한지 검증
    예 : 필수 필드가 모두 포함되었는지 확인
  3. 유효하다면:
    serializer.save( ) : 데이터를 저장(새로운 Book 객체 생성)
    클라이언트에게 성공 응답과 함께 생성된 데이터를 반환 (status.HTTP_201_CREATED) 
  4. 유효하지 않다면 :
    에러 메시지와 함꼐 실패 응답을 반환 (staus.HTTP_400_BAD_REQUEST)

데코레이터 - 기능을 추가하거나 수정할 수 있는 함수 

다른 함수나 메서드에 적용되어 코드의 중복을 줄이고 가독성을 높임 

Django에서는 인증이나 권한 체크, 캐싱 등 반복되는 작업을 데코레이터로 쉽게 처리 

def my_decorator(func):
    def wrapper():
        print("함수가 실행되기 전에 이 코드가 실행됩니다.")
        func()
        print("함수가 실행된 후에 이 코드가 실행됩니다.")
    return wrapper

@my_decorator
def say_hello():
    print("안녕하세요!")

say_hello()

 

@login_required

사용자가 로그인된 상태에서만 뷰에 접근할 수 있도록 제한하는 데코레이터

비로그인 사용자가 접근하려 할 때 로그인 페이지로 리디렉션 

from django.contrib.auth.decorators import login_required

@login_required
def my_view(request):
    # 로그인된 사용자만 접근 가능
    pass

 

@permission_required

특정 권한이 있는 사용자만 뷰에 접근할 수 있도록 하는 데코레이터

권한이 없는 사용자는 접근이 제한됨 

from django.contrib.auth.decorators import permission_required

@permission_required('app_name.permission_code')
def my_view(request):
    # 특정 권한이 있는 사용자만 접근 가능
    pass

 

@require_http_methods

특정 HTTP 메서드만 허용하도록 하는 데코레이터

예를 들어, POST 요청만 허용하거나 GET요청만 허용

from django.views.decorators.http import require_http_methods

@require_http_methods(["GET", "POST"])
def my_view(request):
    # GET과 POST 요청만 허용
    pass

 

@csrf_exempt

CSRF 검사를 제외시키는 데코레이터 

외부 서비스와의 통신 등에 사용되지만, 보안 문제가 생길 수 있어서 신중히 사용해야함 

from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def my_view(request):
    # CSRF 검사 없이 작동
    pass
CSRF란?
악의적인 사이트(로그인한 상태)가 사용자를 대신해서 요청을 보내는 웹 공격 방식 
Django는 CSRF 토큰을 사용해 이를 방지함. 각 요청에 고유한 토큰을 생성하고, 서버에서 요청이 올 때 이 토큰을 확인하여 올바른 출처에서 온 요청인지 확인함.

 

@cache_page

뷰의 응답을 캐싱하는 데코레이터

성능 향상을 위해 특정 기간 동안 결과를 캐싱해두고, 그 기간 동안에는 같은 요청에 대해 저장된 응답을 반환 

from django.views.decorators.cache import cache_page

@cache_page(60 * 15)
def my_view(request):
    # 15분 동안 캐시된 응답 반환
    pass

오늘의 과제 !!

 

공공포털 활용 요청을 한다음

Request URL을 받아온다. ▼

 

일단 먼저 공공포털 서비스가 잘되는지 확인

잘됨...(잘되는건진 모르겠..)

블로그( https://velog.io/@fairytale779/TIL-postman ) 참고함...

 

이 다음부턴.....모르겠습니다... 데이터베이스에도 저장이 안돼요....

728x90