[Python 인터넷] django REST framework로 간단한 api 만들기

 

django REST ramework (DRF)는 RESTful한 API를 쉽게 만들 수 있도록 해준다.  

지금부터 DRF를 사용해 영화 리스트를 CRUD (Create,Read,Update,Delete) 할 수 있는 간단한 API를 만들어 볼 것이다.

혹시 REST가 뭔지 모른다면 알아보고 만들어보도록하자. 

http://meetup.toast.com/posts/92

1. 환경 셋팅

먼저 virtualenv나 pyenv로 가상환경을 만들어 준다. 

필자는 python 3.6.5 django 2.0.6 환경에서 작업했다.

2. django와 django-rest-framework 설치

가상환경에 진입해 pip로 django와 django-rest-framework를 설치한다.

pip install django
pip install djangorestframework

3. project 생성

movie_api이라는 django project를 생성한다.

django-admin startproject movie_api

4. movies app 생성

movies 앱을 생성한다.

python manage.py startapp movies

5. settings.py 설정

settings.py에서 DRF와 만든 movies앱을 등록해준다.

또한 ALLOWD_HOSTS도 설정해주자. develop 용으로 모두 허용해준다.(배포할 땐 허용 가능 호스트를 설정해준다.)

# settings.py

ALLOWED_HOSTS = ['*']

INSTALLED_APPS = [
    ...
    'rest_framework',
    'movies.apps.MoviesConfig',
]

6. Model 생성

Movie 모델을 생성한다. 간단하게 영화 제목,장르,제작 년도의 필드를 갖는다.

# movie_api/movies/models.py

from django.db import models

class Movie(models.Model):
    title = models.CharField(max_length=30) # 제목
    genre = models.CharField(max_length=15) # 장르
    year = models.IntegerField() # 제작 년도

    def __str__(self):
        return self.title

코드 작성 후 마이그레이션,마이그레이트를 해준다.

python manage.py makemigrations
python manage.py migrate

 

7. serializer 생성

Serializer란 queryset과 모델 인스턴스와 같은 복잡한 데이터를 json,xml 또는 다른 콘텐츠 유형으로 쉽게 변환할 수 있다. 받은 데이터의 유효성을 검사한 다음, 복잡한 타입으로 형 변환할 수 있도록 serializeation을 제공한다. 

# movie_api/movies/serializers.py

from rest_framework import serializers
from .models import Movie

class MovieSerializer(serializers.ModelSerializer):
    class Meta:
        model = Movie # 모델 설정
        fields = ('id','title','genre','year') # 필드 설정

8. views.py 작성

DRF는 보통 사람들이 자주 사용하는 공통적인 view 로직을 그룹화 한 viewset을 제공한다. viewset을 사용하게 되면 CRUD 로직을 직접 짜지 않아도 이 기능들이 사용 가능해진다. 필자는 처음에 '읭 아무것도 안했는데 다 되네...? ㅇ0ㅇ' 했다.

# movie_api/movies/views.py

from rest_framework import viewsets
from .serializers import MovieSerializer
from .models import Movie

class MovieViewSet(viewsets.ModelViewSet):
    queryset = Movie.objects.all()
    serializer_class = MovieSerializer

9. urls.py 작성

DRF는 url을 자동으로 맵핑해주는 router를 제공한다. 앞서 생성한 viewset을 router에 연결하게 되면 자동으로 url을 맵핑해주어 사용자가 직접 url을 맵핑하지 않아도 된다.

# movie_api/urls.py

from django.conf.urls import url,include
from django.contrib import admin
from rest_framework import routers
from movies.views import MovieViewSet

router = routers.DefaultRouter() 
router.register('movies',MovieViewSet) # prefix = movies , viewset = MovieViewSet

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^',include(router.urls)),
]

위에서 router.register로  prefix를 'movies'로 설정을 해주었다. 

router는 이를 바탕으로 url을 맵핑하게 된다.

URL pattern: ^movies/$ Name: 'movie-list'
URL pattern: ^movies/{pk}/$ Name: 'movie-detail'

10. 실행

자 이제 코드 작성은 끝이 났다! 런서버로 실행해본다. 

python manage.py runserver 

11. 완성! 검토!

만든 api로 CRUD 요청을 해보자.

api 요청 uri과 method를 정리해보자면 

GET /movies/ 영화 리스트 조회

POST /movies/ 영화 객체 추가

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

GET /movies/{pk}/ 영화 객체 조회.(한개)

PUT /movies/{pk} 영화 객체 수정

DELETE /movies/{pk} 영화 객체 삭제

이렇게 된다.

 

먼저 localhost:8000 으로 들어가게 되면 해당 화면이 보일 것이다.

movies/ 링크로 들어가본다.

 

GET /movies/는 영화의 리스트를 요청하는 uri이다. 

현재 movie 값이 하나도 없으므로 빈 리스트만 반환하는 것을 볼 수 있다.

아래 폼으로 영화 정보를 입력해보자. 입력 하면 post 버튼을 누른다. 

그러면 POST 메소드로 /movies/ uri에 요청이 가고, 해당 정보는 저장이 될 것이다.

 

그리고 이렇게 방금 저장한 movie 객체의 정보가 json 형태로 반환되는 것을 볼 수 있다.

테스트를 위해 영화를 더 저장해 보았다.

GET /movies/3 요청은 id가 3번 째인 movie 객체를 조회하게 된다.

PUT 메소드로 보내면 해당 객체를 수정하고, DELETE 메소드로 요청하면 해당 객체를 삭제할 것 이다.

api 테스트 프로그램 postman에서도 api 요청이 잘 이루어진 다는 것을 알 수 있다.

 

이렇게 DRF로 RESTful한 API를 만들어 보았다.

DRF는 더욱 많은 기능을 제공하고 커스텀을 할 수 있도록 제공하므로 Web api를 강력하고 유연하게 만들 수 있다. ㅎㅎ 

 

 

refer

http://www.django-rest-framework.org/

https://cjh5414.github.io/django-rest-framework/

http://brownbears.tistory.com/71

[출처] https://jamanbbo.tistory.com/43

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
122 [Python 인터넷] 7 - 개요 file 졸리운_곰 2023.03.30 402
121 [Python 인터넷] 6 - href 연결하기 file 졸리운_곰 2023.03.26 363
120 [Python 인터넷] 5 - 다른 페이지 크롤링 file 졸리운_곰 2023.03.26 275
119 [Python 인터넷] 4 - flask에 css 적용하기 file 졸리운_곰 2023.03.26 349
118 [Python 인터넷] 3 - 크롤링한 데이터 html에 보여주기 file 졸리운_곰 2023.03.26 428
117 [Python 인터넷] 2 - flask 프로젝트 생성, 세팅 file 졸리운_곰 2023.03.26 399
116 [Python 인터넷] 1 - 트렌드 홈페이지 개발 개요 file 졸리운_곰 2023.03.26 381
115 [Python 인터넷] Python Python - 파이썬 REST API 통신 예제(POST 요청하기, 서버만들기) file 졸리운_곰 2023.03.21 460
114 [Python 인터넷] Using a Python HTTP Proxy Server to Simulate an API Gateway file 졸리운_곰 2023.03.11 366
113 [Python 인터넷] Django REST API 서버 만들기 file 졸리운_곰 2023.03.09 305
» [Python 인터넷] django REST framework로 간단한 api 만들기 file 졸리운_곰 2023.03.08 489
111 [Python 인터넷] Quickstart - Django REST framework 졸리운_곰 2023.03.08 314
110 [Python 인터넷] 세상에서 가장 간단한 Airflow 튜토리얼 file 졸리운_곰 2023.03.05 316
109 [Python 인터넷] Flask 또는 Django를 Production 서버로 배포(Deploy)하기 file 졸리운_곰 2023.03.03 331
108 [Python 인터넷] django 웹사이트 배포를 하며 겪은 시행착오 졸리운_곰 2023.03.03 282
107 [Python 인터넷] Windows에서 Django와 Apache 연동하기 졸리운_곰 2023.03.02 342
106 [Python 인터넷] 구글로 공부하는 파이썬 - 부록 (IIS, Apache 로 Flask 돌리기) file 졸리운_곰 2023.01.26 438
105 [python 인터넷] Flask로 REST API 구현하기 - 3. JWT로 사용자 인증하기 졸리운_곰 2023.01.26 378
104 [python 인터넷] Flask로 REST API 구현하기 - 2. 파일 분리, 문서화 졸리운_곰 2023.01.26 393
103 [python 인터넷] Flask로 REST API 구현하기 - 1. Flask-RESTX file 졸리운_곰 2023.01.26 363
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED