개요

프로젝트 중 REST API를 제공해야 하는 개발 내용이 있었다. 간단히 경량 웹서버에서 url 요청 처리를 json으로 응답하는 형태로도 구현 가능하겠지만 기존에 존재하는 프레임워크를 도입해 보기로 했다. 그 중 Django에 기반한 Django REST framework를 사용하는 것이 확장성 및 사용 편의성이 높을 것 같아 테스트 해보기로 했다.

설치

Django는 설치되었다는 상황을 가정하고 Django REST framework만 설치해본다.

$ pip install djangorestframework
$ pip install markdown       # Markdown support for the browsable API.
$ pip install django-filter  # Filtering support

REST framework 테스트

$ django-admin.py startproject rest
$ cd rest
$ python manage.py migrate
$ python manage.py createsuperuser

아이디와 패스워드는 임의로 admin / password로 설정하였다.

이제 REST framework 적용을 위한 설정 작업을 수행한다.

$ vi rest/settings.py

settings.py를 열어 보면 INSTALLED_APPS 구문이 보인다. 해당 구문에 다음과 같이 'rest_framework' 를 추가한다.

INSTALLED_APPS = (
    ...
    'rest_framework',
)

그리고 마지막 줄에 다음 내용을 추가한다.

REST_FRAMEWORK = {
    # Use Django's standard `django.contrib.auth` permissions,
    # or allow read-only access for unauthenticated users.
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
    ]
}

settings.py 설정후에는 urls.py를 수정한다.

$ vi rest/urls.py

기본적으로 Django의 프로젝트를 생성하면 urls.py에 다음과 같은 내용이 존재한다.

from django.conf.urls import patterns, include, url
from django.contrib import admin
 
urlpatterns = patterns('',
    # Examples:
    # url(r'^$', 'rest.views.home', name='home'),
    # url(r'^blog/', include('blog.urls')),
 
    url(r'^admin/', include(admin.site.urls)),
)

위 내용을 REST framework를 위해 다음과 같이 수정한다.

from django.conf.urls import url, include
from django.contrib.auth.models import User
from rest_framework import routers, serializers, viewsets
 
# Serializers define the API representation.
class UserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = User
        fields = ('url', 'username', 'email', 'is_staff')
 
# ViewSets define the view behavior.
class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
 
# Routers provide an easy way of automatically determining the URL conf.
router = routers.DefaultRouter()
router.register(r'users', UserViewSet)
 
# Wire up our API using automatic URL routing.
# Additionally, we include login URLs for the browsable API.
urlpatterns = [
    url(r'^', include(router.urls)),
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]

위와 같은 설정 작업이 끝났다면 runserver 명령으로 서버를 동작한다.

$ python manage.py runserver 0.0.0.0:8000

서버 동작 후 브라우저로 접속하면 아래와 같은 페이지를 확인할 수 있다.

튜토리얼

Django REST framework 사이트에서 제공하는 tutorial을 참고하여 테스트 해보았다.

Django REST Swagger

REST는 URI 정의가 중요하다. 해당 URI를 이용해 어떤 리소스를 사용자에게 제공할 것인지가 결정되기 때문이다. 이런 URI와 제공 메소드를 문서화하는 방법 중 하나로 Swagger라는 오픈소스를 활용하는 것이 있다.

$ pip install django-rest-swagger

위 명령으로 설치하는 것이 가능하다. 실제 사용을 위해서는 Django 프로젝트에 다음 설정들을 적용한다.

$ vi settings.py

INSTALLED_APPS에 다음 내용 추가

INSTALLED_APPS = (
    ...
    'rest_framework_swagger',
)

urls.py에는 다음 내용을 추가한다.

patterns = ('',
    ...
    url(r'^docs/', include('rest_framework_swagger.urls')),
)

위와 같이 설정 후 서버를 실행하면 다음과 같은 페이지를 확인 할 수 있다.

참고