본문 바로가기
Techeer

[Django] 파이썬 Django 프레임 워크 정리/django-rest framework

by JM0121 2024. 1. 16.

테커 실리콘밸리 겨울 부트캠프에 참여하면서 Python의 오픈소스 웹 프레임워크인 django를 사용하게 되었다.

 

flask VS django

 

flask

- Micro Framework

- 가볍고 원하는 기능을 쉽게 확장 가능, 자유도가 높다.

 

django

- Full-stack-Framework

- flask의 비해 10가량 무겁고 대부분의 기능을 다 지원, 자유도가 낮다.


 

MTV 

 

Mdoel: DB에 저장되는 데이터, 데이터베이스에 데이터를 저장하고 조회하기 위해 장고의 모델을 사용 (ORM제공)

- ORM(Object Relation Mapper): SQL 명령문 대신 간단한 파이썬 명령문으로 데이터베이스를 다를 수 있는 추상화된 레이어

 

모델 코드예제

rom django.db import models


class Question(models.Model):
    subject = models.CharField(max_length=200)
    content = models.TextField()
    create_date = models.DateTimeField(default=0)


class Answer(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    content = models.TextField()
    create_date = models.DateTimeField(default=0)

 

Template: 사용자에게 보여지는 부분 (HTML)

 

View: HTTP 요청을 받고 model을 통해 데이터에 접근하고 템플릿에게 응답

 

 

뷰 코드예제

from django.http import HttpResponse


def index(request):
    return HttpResponse("안녕하세요 pybo에 오신것을 환영합니다.")

 

 

 

URL: view와 해당 url을 이어주는 역할

 

 

url 코드예제

from django.contrib import admin
from django.urls import path

from pybo import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('pybo/', views.index),
]

 

 


 

Django Rest Framework

Spring의 Spring boot 과의 관계처럼 Django에서 REST API 서버를 만들기 위한 framework이다.

 


DRF 설치법 생략

 

API를 만들기 위해 해당 엔드포인트로부터 Request body를 정하고 View를 작성한다.

 

#example.views.py

# 단일 GET함수
@api_view(['GET'])
def TestApi(request):
	return Response("Test")
    
# 다중 함수 정의 
# 같은 엔드포인트의 각각 post, get, put, delete 요청
class TestAPIView(APIView):
	def get(self, request):
    		return Response("GET Test")
        
    	def post(self, request):
    		return Response("POST Test")

 

 

Serializer: 모델 인스턴스나 쿼리셋 같은 복잡한 데이터 유형을 JSON 형식으로 변환하는 역할 (직렬화)

반대로 JSON데이터를 Python 객체데이터로 변환하는 역할(역직렬화)를 모두 가능하게 하는 기능

 

직렬화를 사용하여 게시글 작성 API 만들어보기

 

모델은 위에서 사용한 모델을 그대로 사용하여 작성할 것이다.

 

 

#example.serializers.py

from rest_framework import serializers
from .models import Question

class QuestionCreateSerializer(serializer.ModelSerializer):
	class Meta:
    model = Question
    fields = ['subject', 'content']

 

#example.views.py

from rest_framework.views import APIView
from .models import Question
from .serializers import QuestionCreateSerializer
from rest_framework import status

class QuestionCreateAPIView(APIView):
	def post(self, request):
        serializer = QuestionCreateSerializer(data=request.data)
        if serializer.is_valid():
        	return Response({'message': "게시글 작성 성공",
            serializer.data}, status=status.HTTP_204_NO_CONTENT)
        return Response({
            'message': "게시글 작성에 실패했습니다.",
            'result': None

 

이제 url을 적절히 정의하고 API를 테스트하면 성공적으로 응답이 보내지는 것을 알 수 있다.

 


참고

https://wikidocs.net/book/4223