REST API SERVER
Django로 API Server를 만드는 방법을 소개합니다.
1-1 설치
Django REST framework 공식문서를 참고해주세요
-
pip 설치
(api-venv) start666:~/workspace/API $ pip install djangorestframework
-
INSTALLED_APP에서
'rest_framework'
를 추가해주기.
1-2. 기본설정
-
모델을 만든다.
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
-
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의 도움을 받는 것입니다.
- 모든 Artist 가져올 때 :
-
이런 URL에 따라서 요청 url 만들기.
-
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')) ]
-
Sub URL dispatcher 만들기
- 앱 이름을 같이 끼워주는게 좋다.
-
1-3. Djangorestapiframework 사용하기
-
일반적으로는 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']
-
-
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로 변환해줌.
-
이제 View에서 MusicSerializer 객체를 반환해주기.
MusicSerializer(어떤 것을 json파일로 만들지, many)
- 객체를 생성해야 하므로 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)
[결과화면]
이런식으로 json파일이 리턴되는 것을 볼 수 있습니다.
1-4. API 명세서 만들기
Swagger : API 명세를 만드는 가장 표준적인 프로그램
-
설치
pip install django-rest-swagger
-
Settings.py의 INSTALLED_APP에
'rest_framework_swagger'
넣기 -
우리 앱에다가 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") ]
- 보통 주소는
[결과화면]
1-5 . POST, PUT, PATCH 명령은 어떻게?
-
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)
-
혹은
@api_view(['PUT'])
같은거처럼 특정 메소드를 통과하면 로직을 구현하게끔 여러가지 함수를 만들 수 있습니다.