API_Server IN Django +4

LEE EUI JOO·2023년 2월 6일
0

Web Programming

목록 보기
6/17

모델 생성

  • models.py 파일에 클래스를 생성 - 클래스 이름이 테이블 이름이 된다
from django.db import models

# Create your models here.
class Book(models.Model):
    bid = models.IntegerField(primary_key=True)
    title = models.CharField(max_length=50)
    author = models.CharField(max_length=50)
    category = models.CharField(max_length=50)
    pages = models.IntegerField()
    price = models.IntegerField()
    published_date = models.DateField()
    description = models.TextField()
  • 명령어를 사용해서 DB 에 반영

❗️❗️❗️ 이름이 어떻게 만들어지는지 알 필요가 있기 때문에 이렇게 만든 것이고, 실무에서는 DB 의 테이블을 이런 방식으로 생성하지 않는다 ❗️❗️

python manage.py makemigrations 
python manage.py migrate

시리얼라이저 작업

  • Django 에서는 ModelSerializer 클래스를 상속받아서 model 과 fields 속성을 설정하면 되는데 model 은 변환할 Model 클래스 이름을 설정하고 fields 에는 변환할 컬럼(속성)을 배열로 설정하면 된다.

  • example 앱에 serializers.py 파일을 생성하고 작업 (이름 고정)

from  rest_framework import serializers
from .models import Book

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = ['bid','title','author','category',
                  'price','pages','published_date','description']

views.py 파일에 요청을 처리하는 함수를 생성

from rest_framework.response import Response
from rest_framework.decorators import api_view

from rest_framework import status
from rest_framework.generics import get_object_or_404
from .models import Book
from .serializers import BookSerializer

# @으로 시작하는 것은 decorator 라고 하는데
# 자주 사용하거나 만들기가 복잡한 코드가 있을 때
# 이 코드를 직접 작성하는 대신에 decorator 가 그 코드를 대신 작성

@api_view(['GET'])

def helloAPI(request):
    return Response('전송될 데이터')

# Create your views here.

@api_view(['GET'])
def booksAPI(request):
    # 전체 데이터 가져오기
    books = Book.objects.all()
    # 파이썬 데이터를 JSON 형식으로 변환
    # 데이터가 1개인 경우는 many=True 생략

    serializer = BookSerializer(books, many=True)
    # 응답 전송
    return Response(serializer.data, status=status.HTTP_200_OK)

urls.py 파일에 url 과 views 함수를 연결하는 작업을 추가

from django.urls import path, include
from .views import helloAPI
from .views import booksAPI

urlpatterns = [
    # example 에 오면 helloAPI를 불러라
    path('hello',helloAPI),
    path('fbv/books', booksAPI)

]

실행한 후 브라우저에서 확인 : http://localhost:8000/example/fbv/books

  • ❗️ 현재 데이터가 없는 상태이기 때문에 [] 라고 찍혀 있음❗️

데이터 삽입

  • 서버 사이드 렌더링에서는 삽입 화면으로 이동하는 GET 요청 과 실제 데이터를 입력한 후 삽입을 처리하는 2개의 과정으로 진행되지만 API 서버에서는 실제 데이터를 삽입하는 처리만 수행해주면 된다

  • 결과는 어떤 방식으로 전송할 것인지 판단해야한다

    • 일반적으로 삽입이나 수정 및 삭제가 된 데이터를 다시 돌려주거나 아니면 성공 과 실패 여부를 알려주는 둘 중에 하나로 많이 처리한다
  • views.py 에서 삽입 요청을 처리하는 함수를 만든다

@api_view(['POST'])
def booksInsertAPI(request):
    # 삽입에서 넘어온 파라미터를 모델로 변환
    # 클라이언트에서는 BookSerializer 에 설정된 속성들의 값을 모두 전달해야 함
    # 전송된 파라미터를 Model 의 데이터로 변환하는 것을 역직렬화 라고 한다

    serializer = BookSerializer(data = request.data)
    # 데이터 유효성 검사
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data, status=status.HTTP_200_OK)
    return Response(serializer.data, status=status.HTTP_400_BAD_REQUEST)

urls.py 파일에 url 과 views 함수를 연결하는 작업을 추가

from django.urls import path, include
from .views import helloAPI
from .views import booksAPI
from .views import booksInsertAPI
urlpatterns = [
    # example 에 오면 helloAPI를 불러라
    path('hello',helloAPI),
    path('fbv/books', booksAPI),
    path('fbv/books/insert', booksInsertAPI)
]

실행한 후 브라우저에서 확인

GET 방식 과 POST 방식을 하나의 URL로 처리

  • Models.py
from rest_framework.response import Response
from rest_framework.decorators import api_view

from rest_framework import status
from rest_framework.generics import get_object_or_404
from .models import Book
from .serializers import BookSerializer

# @으로 시작하는 것은 decorator 라고 하는데
# 자주 사용하거나 만들기가 복잡한 코드가 있을 때
# 이 코드를 직접 작성하는 대신에 decorator 가 그 코드를 대신 작성

@api_view(['GET'])

def helloAPI(request):
    return Response('전송될 데이터')

# Create your views here.

@api_view(['GET','POST'])
def booksAPI(request):
    if request.method == 'GET':

        # 전체 데이터 가져오기
        books = Book.objects.all()
        # 파이썬 데이터를 JSON 형식으로 변환
        # 데이터가 1개인 경우는 many=True 생략

        serializer = BookSerializer(books, many=True)
        # 응답 전송
        return Response(serializer.data, status=status.HTTP_200_OK)

    elif request.method == 'POST':
        # 삽입에서 넘어온 파라미터를 모델로 변환
        # 클라이언트에서는 BookSerializer 에 설정된 속성들의 값을 모두 전달해야 함
        # 전송된 파라미터를 Model 의 데이터로 변환하는 것을 역직렬화 라고 한다

        serializer = BookSerializer(data=request.data)
        # 데이터 유효성 검사
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_200_OK)
        return Response(serializer.data, status=status.HTTP_400_BAD_REQUEST)
  • urls.py

from django.urls import path, include
from .views import helloAPI
from .views import booksAPI

urlpatterns = [
    # example 에 오면 helloAPI를 불러라
    path('hello',helloAPI),
    path('fbv/books', booksAPI),

]

상세보기

  • 기본키 값을 서버에 전달해서 기본키에 해당하는 데이터를 찾아서 리턴
  • 예전에는 파라미터 형태로 전달했지만, 최근에는 URL에 포함시켜 전송하는 것이 일반적임
  • 처리 방식은 GET 인 경우가 많다

view.py 파일에 상세보기 처리 코드를 추가

# 상세보기 처리를 위한 메서드
@api_view(['GET'])
def bookAPI(request, bid):
    # 데이터 찾아오기
    # bid 에 해당하는 데이터가 없으면 404에러를 발생시키고 존재하면 찾아와서
    # book에 대입
    book = get_object_or_404(Book,bid=bid)
    serializer = BookSerializer(book)
    return Response(serializer.data, status=status.HTTP_200_OK)

urls.py 과 함수를 연결


from django.urls import path, include
from .views import helloAPI
from .views import booksAPI
from .views import bookAPI

urlpatterns = [
    # example 에 오면 helloAPI를 불러라
    path('hello',helloAPI),
    path('fbv/books', booksAPI),
    path('fbv/books/<int:bid>',bookAPI),

]

  • bid : 2

사용자의 요청 처리 방식

  • 방식
    • Function Based View(FBV) : @api_view 와 함수를 이용해서 처리하는 방식

    • Class Based View(CBV) : 클래스를 만들어서 함수를 오버라이딩 형태로 요청을 처리

      • 클래스 내부에 get, put, delete, post 형태의 데이터 함수가 존재하고, 매개변수를 받아서 list(목록 보기), create(삽입), retrieve(1개 가져오기), update(수정), destroy(삭제) 를 호출하면 작업을 수행

      • 클래스를 만들 때는 mixins 라는 패키지의 ListModelMixin, CreateModelMixin, RetriveModelMixin, UpdateModelMixin, DestroyModelMixin, GenericAPIView 클래스를 상속받아서 사용한다.

  • urls 에서 url 과 처리하는 클래스를 연결할 때는 클래스 이름 .as_view()로 연결

클래스 형 뷰를 이용해서 CRUD 작업을 수행

from rest_framework import generics, mixins
# 전체 목록 보기 와 삽입을 처리
class BooksAPIMinxins(mixins.ListModelMixin,generics.GenericAPIView):
    # 전체 데이터와 serializer 를 설정
    queryset = Book.objects.all()
    serializer_class = BookSerializer

    # get 요청 처리
    def get(self,requset,*args,**kwargs):
        return self.list(requset, *args, **kwargs)
    # post 요청 처리
    def post(self,requset,*args,**kwargs):
        return self.create(requset, *args, **kwargs)

# 상세보기, 수정, 삭제를 처리할 클래스 - bid 를 매개변수로 받아야 한다

class BookAPIMinxins(mixins.RetrieveModelMixin,mixins.UpdateModelMixin,
                     mixins.DestroyModelMixin, generics.GenericAPIView):
    # 전체 데이터와 serializer 를 설정
    queryset = Book.objects.all()
    serializer_class = BookSerializer

    # 매개변수 필드를 설정
    lookup_field = 'bid'

    # bid 를 이용해서 하나의 데이터 찾아오기
    def get(self,requset,*args,**kwargs):
        return self.retrieve(requset, *args, **kwargs)

    # bid 를 이용해서 데이터 수정
    def put(self,requset,*args,**kwargs):
        return self.update(requset, *args, **kwargs)

    # bid 를 이용해서 데이터 삭제
    def delete(self,requset,*args,**kwargs):
        return self.destroy(requset, *args, **kwargs)

urls.py 에서 url 과 연결

from django.urls import path, include
from .views import helloAPI
from .views import booksAPI
from .views import bookAPI
from .views import BookAPIMinxins
from .views import BooksAPIMinxins


urlpatterns = [
    # example 에 오면 helloAPI를 불러라
    path('hello',helloAPI),
    path('fbv/books', booksAPI),
    path('fbv/books/<int:bid>',bookAPI),
    path('mixin/books',BooksAPIMinxins.as_view()),
    path('mixin/book/<int:bid>',BookAPIMinxins.as_view()),

]
  • 실행 한 브라우저에서 확인


  • create - delete

profile
무럭무럭 자라볼까

0개의 댓글