[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

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
64 [python][자료구조] "pdf 취소선 검출" How to identify strike-out text from PDF files using Python 졸리운_곰 2024.07.18 544
63 [python][자료구조] 오픈 소스 Python PDF 파서 라이브러리 file 졸리운_곰 2024.07.16 444
62 [python][자료구조] 벡터화 | Vectorization file 졸리운_곰 2023.12.21 330
61 [python][자료구조] Python의 Loop? NO! , Python의 Vectorization? OK!!! file 졸리운_곰 2023.12.21 473
60 [python][자료구조] Python - MySQL 데이터 추가, 삭제, 업데이트 졸리운_곰 2023.05.13 488
59 [python][자료구조] Python의 JSON - 문자열을 JSON으로 변환하는 방법 졸리운_곰 2023.05.06 456
58 [python][자료구조] [Python] Logging to MongoDB (로그 남기기) file 졸리운_곰 2023.03.24 428
57 [python][자료구조] [스파르타 웹 개발 종합] 파이썬으로 크롤링하고 DB에 저장하기(request, bs4, mongoDB 패키지 사용) 졸리운_곰 2023.03.12 461
56 [python][자료구조] [MongoDB] Document Query(조회) – find() 메소드 졸리운_곰 2023.03.08 315
55 [python][자료구조] Python(flask)으로 mongoDB 제어하기 – pymongo file 졸리운_곰 2023.03.08 604
54 [python][자료구조] django sqlite3 MySQL로 전환하기 file 졸리운_곰 2023.03.02 409
53 [python][자료구조] django에서 db.sqlite3 데이터를 mysql로 옮기기 졸리운_곰 2023.03.02 427
52 [python][자료구조] Python - JSON 파일 읽고 쓰는 방법 졸리운_곰 2023.02.04 480
51 [python][자료구조] [인코딩] 유니코드 인코딩 처리 (특히 json 입출력 시) 졸리운_곰 2023.02.04 363
50 [python][자료구조] Dropbox API 사용하기 (with python) 졸리운_곰 2022.12.03 306
49 [Python][자료구조] SQLAlchemy Tutorial(한글) - 2 졸리운_곰 2022.12.03 393
48 [Python]][자료구조] SQLAlchemy Tutorial(한글) - 1 졸리운_곰 2022.12.03 275
47 [python][자료구조] python anaconda 에서 mysql 접속 졸리운_곰 2022.01.25 657
46 [python 자료구조] 림코딩의 파이썬으로 csv 다루기 강좌 (읽기,쓰기,수정,추가) 졸리운_곰 2022.01.16 521
45 python - 읽은 후 kafka 메시지를 삭제하는 방법 졸리운_곰 2021.07.13 900
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED