My Profile Photo

DongChanS's blog


수학과 학생의 개발일지


Django로 REST API 서버 만들기

REST API SERVER

Django로 API Server를 만드는 방법을 소개합니다.

1-1 설치

Django REST framework 공식문서를 참고해주세요

  1. pip 설치

    (api-venv) start666:~/workspace/API $ pip install djangorestframework
    
  2. INSTALLED_APP에서 'rest_framework'를 추가해주기.

1-2. 기본설정

  1. 모델을 만든다.

    class Artist(models.Model):
        name = models.TextField()
           
        def __str__(self):
            return self.name
               
    class Music(models.Model):
        title = models.TextField()
        artist = models.ForeignKey(Artist, on_delete=models.CASCADE)
           
        def __str__(self):
            return self.title
               
    class Comment(models.Model):
        content = models.TextField()
        music = models.ForeignKey(Music, on_delete=models.CASCADE)
           
        def __str__(self):
            return self.content
    
  2. RESTFUL URL 규칙

    • 모든 Artist 가져올 때 : GET '/artists'
    • 특정 Artist 가져올 때 : GET '/artists/1'
    • Artist 만들 때 : POST '/artists'
    • Artist 수정할 때 : PUT/PATCH '/artists/1'
    • Artist 삭제할 때 : DELETE 'artists/1'

    기본적으로 Django는 GET, POST밖에 못하기때문에 djangorestapiframework의 도움을 받는 것입니다.

  3. 이런 URL에 따라서 요청 url 만들기.

    1. Main URL dispatcher 만들기

      • api : api를 제공한다는 것을 명시하기 위해서
      • v1 : 버전도 만들어주는것이 관례
      from django.contrib import admin
      from django.urls import path, include
            
      urlpatterns = [
          path('admin/', admin.site.urls),
          path('api/v1', include('musics.urls'))
      ]
      
    2. Sub URL dispatcher 만들기

      • 앱 이름을 같이 끼워주는게 좋다.

1-3. Djangorestapiframework 사용하기

  1. 일반적으로는 Django view의 리턴값으로 html파일을 보여줬는데,

    API 서버로 사용할 것이므로 JSON파일을 반환해줘야 합니다.

    • parse : JSON 파일 -> Python Object

    • serialize : Python Object -> JSON 파일

      그래서 serializer를 통해서 결과물을 JSON으로 바꿔줘야 합니다.

      (얘가 알아서 JSON으로 바꿔줌.)

    # serializers.py
    from rest_framework import serializers
    

    이 serializers.py에서 Model에 맞는 Serializer를 만들어줘야합니다. (ModelForm과 완전 비슷함.)

    class MusicSerializer(serializers.ModelSerializer):
        class Meta:
            model = Music
            fields = ['id','title','artist']   
    
  2. api_view 데코레이터

    Decorator that converts a function-based view into an APIView subclass.

    Takes a list of allowed methods for the view as an argument.

    • 인자 : 허용하는 메서드들의 리스트
    • 기능 : 우리의 View를 APIView로 변환해줌.
  3. 이제 View에서 MusicSerializer 객체를 반환해주기.

    1. MusicSerializer(어떤 것을 json파일로 만들지, many)
    2. 객체를 생성해야 하므로 Response 객체를 만들어주면 됨.
    from django.shortcuts import render
    from rest_framework.decorators import api_view
    from rest_framework.response import Response
    from .serializers import MusicSerializer
    from .models import Music
       
    @api_view(['GET'])
    def music_list(request):
        musics = Music.objects.all()
        serializers = MusicSerializer(musics, many=True)
        return Response(serializers.data)
    

[결과화면]

1

이런식으로 json파일이 리턴되는 것을 볼 수 있습니다.

1-4. API 명세서 만들기

Swagger : API 명세를 만드는 가장 표준적인 프로그램

  1. 설치

    pip install django-rest-swagger
    
  2. Settings.py의 INSTALLED_APP에 'rest_framework_swagger' 넣기

  3. 우리 앱에다가 swagger document를 넣기

    • 보통 주소는 'docs.사이트주소'의 형태가 됩니다.
    from django.urls import path
    from . import views
    from rest_framework_swagger.views import get_swagger_view
       
    app_name = "music"
       
    urlpatterns = [
        path('musics/', views.music_list, name="list"),
        path('musics/<int:music_id>/', views.music_detail, name="detail"),
        path('docs/', get_swagger_view(title="API 문서"), name="swagger")
    ]
    

[결과화면]

2

1-5 . POST, PUT, PATCH 명령은 어떻게?

  1. URL이 같기 때문에 하나의 view에서 로직을 분기하는게 좋습니다.

    @api_view(['GET','POST'])
    def music_list(request):
        if request.method == "POST":
            # CREATE
            serializers = MusicSerializer(data=request.data)
            if serializers.is_valid(raise_exception=True):
                serializers.save()
                return Response(serializers.data)
        else:
            # READ (LIST)
            musics = Music.objects.all()
            serializers = MusicSerializer(musics, many=True)
            return Response(serializers.data)
    
  2. 혹은 @api_view(['PUT']) 같은거처럼 특정 메소드를 통과하면 로직을 구현하게끔 여러가지 함수를 만들 수 있습니다.

comments powered by Disqus