[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

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
15 [python 데이터분석] [jupyter] 주피터 노트북에 이미지 삽입 file 졸리운_곰 2025.09.06 526
14 [python 데이터분석] [Python] Streamlit 사용법 (python 데이터분석 웹 만들기) file 졸리운_곰 2024.12.22 462
13 [python 데이터분석] Anaconda : Error while loading conda entry point: conda-libmamba-solver (libarchive.so.19: cannot open shared object file: No such file or directory) 졸리운_곰 2024.12.14 520
12 [python 데이터분석] Anaconda | Conda update 반영 안됨(update 후에도 버전 변경 없음) file 졸리운_곰 2024.11.18 431
11 [python 데이터분석] Keeping Anaconda Up To Date 졸리운_곰 2024.05.30 552
10 [python 데이터 분석] 국내 경제 100대 통계지표 졸리운_곰 2024.02.18 672
9 [python 데이터 분석] Python 에서 R언어 패키지 호출 : Calling R From Python With rpy2 file 졸리운_곰 2024.01.28 676
8 [python 데이터 분석] 파이썬을 활용한 코스피, 달러 환율정보 수집부터 차트 시각화까지 file 졸리운_곰 2023.12.11 735
7 [Python 데이터분석][pandas] [Python pandas] DataFrame의 문자열 칼럼을 숫자형으로 바꾸기 : pd.to_numeric(), DataFrame.astype() file 졸리운_곰 2023.12.09 357
6 [Python 데이터분석] [Python 환경설정] VS code 설치 및 Anaconda와 연동하기 file 졸리운_곰 2023.03.17 527
5 [Python 데이터분석][python 데이터분석 프로덕션] [Python] Docker를 사용한 Dash 웹앱 생성 file 졸리운_곰 2021.12.10 403
4 [Python 데이터분석] [pandas] 공공데이터(csv) 활용시 한글 깨짐 현상 해결 file 졸리운_곰 2021.09.30 592
3 [Python 데이터분석] 공공데이터포털::공휴일 데이터 조회 (REST API) file 졸리운_곰 2021.09.30 358
2 [Python 데이터 분석] pandas의 to_csv()를 사용해서 csv 파일로 저장하기(save 하기) 졸리운_곰 2021.09.29 603
1 [Python 데이터 분석] 데이터 과학을 단순하게 만드는 3가지 Python 패키지 file 졸리운_곰 2021.09.24 513
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED