샘플 데이터 베이스(Sakila) 데이터베이스 임포트하기
먼저 다음과 같은 사이트에 들어가서 sakila database라고 적혀 있는 줄의 zip파일을 내려받고 압축을 해제하겠습니다.
링크 : dev.mysql.com/doc/index-other.html
여기서 이제 sakila database를 다운 받은 후 다음과 같은 명령어를 통해 압축 해제한 파일을 데이터 베이스에 임포트 하겠습니다.
sakila-db가 있는 파일로 찾아 들어간 후 다음과 같은 명령어를 입력하겠습니다.
cd sakila-db
mysql -u root < sakila-schema.sql
mysql -u root < sakila-data.sql
만약 데이터베이스가 비밀번호가 있는 경우 -p를 붙여서 진행하겠습니다.
설치해야할 패키지 목록
django djangorestframework django-filter djangorestframework-filters
프로젝트 시작하기
먼저 django-admin startproject django_movie_api라는 명령어를 통해 프로젝트를 생성하겠습니다.
그 후 프로젝트 내에 movie라는 앱을 생성하겠습니다. 그러면 다음과 같은 파일 구조를 가지는 것을 확인할 수 있습니다.
장고 ORM 모델 정의하기
다음은 장고 ORM 모델을 정의하겠습니다. 장고에서는 실제 데이터 베이스의 내용을 기반으로 데이터베이스를 자동으로 생성해 주는 기능이 있습니다. 다음 명령어를 통해 데이터베이스 모델의 기본 형태를 만들겠습니다.
먼저 settings.py에 들어가서 데이터 베이스 설정을 다음과 같이 바꾸겠습니다.
만약 오류가 많이 난다면 mysql-connector-python을 설치해준 후 ENGINE = 'mysql.connector.django'로 바꾸겠습니다.
이제 다음과 같은 명령어를 통해 movie/models.py를 작성하겠습니다.
python manage.py inspectdb > movie/models.py
그러면 다음과 같이 models.py에 자동으로 모델들이 생성된 것을 확인할 수 있습니다.
이제 settings py에 들어가서 환경설정을 바꾸겠습니다.
settings.py의 내용 변경하기
먼저 ALLOWED_HOSTS를 *로 처리해서 모두 허용합니다.
다음은 Installed APP항목에 rest_framework와 django_filters를 추가하고 마지막으로 아까 만든 앱인 movie를 추가해줍니다.
다음 REST_FRAMEWORK내용은 settings_py에 없으므로 추가해줍니다.
그러면 여기서 settings.py의 설정은 마무리 됩니다.
다음은 film 테이블에서 데이터베이스의 내용을 확인해보겠습니다.
먼저 장고 환경에서 확인하지 않고, 간단하게 인터렉티브 셀을 사용해서 확인하기 위해 다음과 같은 명령어를 입력하겠습니다.
⭐️ 이때 다양한 오류가 발생하는데 제가 겪은 오류는 아래와 같고 해결방법은 다음과 같습니다.
- django-filters의 버전이 낮아서 생긴오류 : 최근 버전의 django-filters를 강제로 지정해서 설치 하였습니다.
- 장고 버젼이 최근꺼여서 six를 import할수 없다는 오류 : 해당 파일로 들어가서 import명을 바꿔 주었습니다.
python manage.py shell
그 후 다음과 같이 진행하겠습니다.
from movie import models
# sakila 데이터 베이스의 film 테이블에서 film_id = 10의 내용 추출하기
film = models.Film.objects.get(film_id=10)
film.film_id
# 출력 값
# 10
film.title
# 출력 값
# 'ALADDIN CALENDAR'
# sakila 데이터베이스에서 film 테이블의 앞 데이터 3개 추출하기
films = models.Film.objects.all()[:3]
# 장고의 model을 딕셔너리로 변환하는 유틸리티 읽어 들이기
from django.forms.models import model_to_dict
# 변환 내용 확인해보기
[model_to_dict(film) for film in films]
# 출력값
#[{'film_id': 1, 'title': 'ACADEMY DINOSAUR', 'description': 'A Epic Drama of a Feminist And a Mad Scientist who must Battle a Teacher in The Canadian Rockies', 'release_year': 2006, 'language': 1, 'rental_duration': 6, 'rental_rate': Decimal('0.99'), 'length': 86, 'replacement_cost': Decimal('20.99'), 'rating': 'PG', 'special_features': {'Behind the Scenes', 'Deleted Scenes'}, 'last_update': datetime.datetime(2006, 2, 15, 5, 3, 42, tzinfo=<UTC>)}, {'film_id': 2, 'title': 'ACE GOLDFINGER', 'description': 'A Astounding Epistle of a Database Administrator And a Explorer who must Find a Car in Ancient China', 'release_year': 2006, 'language': 1, 'rental_duration': 3, 'rental_rate': Decimal('4.99'), 'length': 48, 'replacement_cost': Decimal('12.99'), 'rating': 'G', 'special_features': {'Trailers', 'Deleted Scenes'}, 'last_update': datetime.datetime(2006, 2, 15, 5, 3, 42, tzinfo=<UTC>)}, {'film_id': 3, 'title': 'ADAPTATION HOLES', 'description': 'A Astounding Reflection of a Lumberjack And a Car who must Sink a Lumberjack in A Baloon Factory', 'release_year': 2006, 'language': 1, 'rental_duration': 7, 'rental_rate': Decimal('2.99'), 'length': 50, 'replacement_cost': Decimal('18.99'), 'rating': 'NC-17', 'special_features': {'Trailers', 'Deleted Scenes'}, 'last_update': datetime.datetime(2006, 2, 15, 5, 3, 42, tzinfo=<UTC>)}]
이처럼 film에 지정된 값들 중에서 앞에서 3개가 출력 되는것을 확인 할 수 있습니다.
다음은 views.py에 있는 코드를 수정하겠습니다. 먼저 API전용 뷰는 아래와 같이 생긴것을 확인할 수 있습니다.
views.py에서 API 전용뷰 만들기
먼저 코드는 다음과 같이 입력하였습니다.
from django.shortcuts import render
from rest_framework import serializers, viewsets
# Create your views here.
# movie/models.py 읽어들이기
from movie import models
# models.py의 Language 모델 데이터를 JSON으로 변환하는 클래스
class LanguageSerializer(serializers.ModelSerializer):
"""Language 시리얼 라이저"""
class Meta:
model = models.Language # models.Language와 연결
fields = '__all__' # 모든 필드 출력하기
# models.py의 Film 모델 데이터를 JSON으로 변환하는 클래스
class FilmSerializer(serializers.ModelSerializer):
""" Film 시리얼라이저 """
# language 필드에는 위의 LanguageSerializer 적용하기
language = LanguageSerializer()
class Meta:
model = models.Film # models.Film과 연결
fields = '__all__' # 모든 필드 출력하기
# /films의 URL에서 호출될 클래스
class FilmViewSet(viewsets.ModelViewSet):
""" Film 전용 ViewSet"""
# Film 모델에서 쿼리 객체를 추출하고, queryset에 설정(필수)
queryset = models.Film.objects.all()
# 직렬화 해당 지정(필수)
serializer_class = FilmSerializer
# 옵션
filter_fields = '__all__'
ordering_fields = '__all__'
search_fields = ('title',)
⭐️ 직렬화 : 객체의 내용을 바이트열 또는 특정 형식을 가진 문자열로 변환하는 것을 직렬화라고 합니다. 장고 REST Framework는 serializers.ModelSerializer 클래스를 상속해서 직렬화 클래스를 정의한 다음 어떤 데이터 모델이 가진 데이터를 JSON 형식으로 변환하게 됩니다. 장고 REST 프레임워크의 직렬화와 관련된 자세한 내용은 아래 링크에 나와있습니다.
링크 : www.django-rest-framework.org/
또한 위에 보면 ViewSet을 설정한 것이 있습니다. ViewSet이란 시리얼라이저 클래스를 통해서 연결된 데이터베이스 테이블의 데이터 추출, 생성, 변경, 제거가 이루어 질 수 있게 할 수 있습니다. 이것에 대한 자세한 내용도 위에 나와있는 django-rest-framework를 참고하시면 나와있습니다.
다음은 url을 설정하겠습니다.
urls.py
from django.contrib import admin
from django.urls import path
from django.conf.urls import url,include
from rest_framework import routers
from movie import views
router = routers.DefaultRouter()
# /movies의 URL에 views.FilmViewSet연결하기
router.register(r'movies',views.FilmViewSet)
urlpatterns = [
path('admin/', admin.site.urls),
url(r'^',include(router.urls)),
]
1. 먼저 DRF의 라이브러리인 rest_framework에서 url라우팅 전용 모듈인 routers를 import해줍니다.
2. 또한 /moive/views.py를 import합니다.
3. router = routers.DefaultRouter()는 DRF의 URL 라우팅 정보를 생성합니다. routes 모듈의 DefaultRouter 클래스를 인스턴스화 해서 router 객체를 생성하고 있습니다.
4. router.register를 통해 movies라는 URL 경로와 views.FilmViewSet 클래스를 연결한 다음 router 객체에 등록합니다.
5. 마지막으로 url 패턴에 등록을 해줍니다.
그 후 python manage.py migrate명령어를 실행 시킨 후 python manage.py runserver를 통해 서버를 실행 시키겠습니다.
그럼 다음과 같이 잘 실행되는 것을 확인할 수 있습니다.
또한 경로 뒤에 /movies를 붙혀도 잘 나오는 것을 확인할 수 있습니다.
마지막으로 httpie를 설치 한 후 결과를 확인하겠습니다.
JSON으로 결과 값 확인하기
먼저 httpie를 설치하겠습니다.
pip install httpie
그 다음 서버가 실행되고 있는 상태에서 다음과 같은 명령어를 입력하겠습니다.
http 'http://localhost:8000/movies/?page=3'
그러면 다음과 같이 JSON형식의 데이터가 잘 나오는 것을 확인할 수 있습니다.
이렇게 DRF를 이용하면 쉽게 웹 API를 만들 수 있는것을 확인할 수 있습니다.
'Django > Django개념' 카테고리의 다른 글
settings.py 살펴보기 (0) | 2020.11.17 |
---|---|
Django를 사용하는 이유 (0) | 2020.11.17 |
002. Django App 만들기 (0) | 2019.08.15 |
001. Django project 시작하기 (0) | 2019.08.15 |
000. Django 시작하기 (0) | 2019.08.15 |
댓글