Django web server 를 구축해 보는 예제입니다. 가장 단순한 형태의 REST API 를 제공하는 예제를 구현해 보는 과정입니다.

구축 환경

OS

Ubuntu 20.04

Python

Python 3.8.5

Django

Django 3.1.3

기타 python project

django rest framework

Python Installs Packages (pip) 설치

$ sudo apt install python3-pip

Django 설치

$ pip3 install django==3.1.3

Django REST framework 설치

Django REST framework는 api 서버를 구축하기에 최적화되어 있는 django plugin입니다. 튜토리얼과 도큐먼트는 링크에서 확인할 수 있습니다. 현재 최신 버전인 3.12.2 로 설치하겠습니다.

$ pip3 install djangorestframework==3.12.2

Django Web Server Project 생성

$ django-admin.py startproject MyAPIServer
$ cd MyAPIServer

프로젝트를 생성한 후 프로젝트 디렉토리에 들어가 보면 프로젝트 이름과 동일한 디렉토리와 manage.py 파일이 생성되어 있을 것입니다.

Edit settings.py

manage.py 와 같은 위치에 있는 프로젝트이름과 동일한 디렉토리에는 settings.py wsgi.py asgi.py urls.py 등과 같은 프로젝트 설정 및 동작을 정의하는 파일들이 포함되어 있습니다. 이 중에서 settings.py 를 익숙한 에디터를 이용해서 편집합니다.

# 허용된 호스트에 포함되지 않은 접근은 금지됩니다.
# ALLOWED_HOSTS = []
ALLOWED_HOSTS = ['*']

# rest_framework 어플리케이션을 설치된 앱 목록에 추가합니다.
# Application definition
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
]
// ...

Django application 생성

$ python3 manage.py startapp api

Django web server 는 여러 어플리케이션으로 구성될 수 있습니다. 프로젝트 디렉토리에서 manage.py를 실행하여 api 라는 이름의 어플리케이션을 생성하였습니다.

API view

새로 생성한 api 어플리케이션 디렉토리에서 view를 생성하겠습니다.

$ cd api
$ mkdir rest

익숙한 에디터를 이용해 api/rest/views.py 파일을 다음과 같이 생성하여 GET method API를 구현해 보겠습니다.

Django에서 view 는 일반적인 MVC 모델의 view 와 약간 다른 개념으로 생각할 수도 있겠습니다.

특히, 여기에서 사용하는 APIView 는 특정한 API path 하나에 대응되는 페이지라고 생각해도 됩니다.

APIView 를 상속하여 생성한 class 는 API 자체를 구현할 수 있는 컨테이너이고, 이 안에 GET, POST, PUT, DELETE, PATCH 등과 같은 HTTP 각 method를 function 형태로 구현할 수 있습니다.

from rest_framework import status
from rest_framework.views import APIView
from rest_framework.response import Response

class TestAPIView(APIView):
    def get(self, request):
        return Response({'result': 'success'}, status=status.HTTP_200_OK)

Project URL 설정

이제 API 뷰를 생성하였으므로, 생성한 뷰를 django url 에 연결하여 실제 API 의 path 를 생성해 주어야 합니다. MyAPIServer/urls.py 에 다음과 같이 생성한 TestAPIView 항목을 추가해 줍니다.

from django.contrib import admin
from django.urls import path
from api.rest.views import TestAPIView

urlpatterns = [
    path('admin/', admin.site.urls),
    path('test/', TestAPIView.as_view())
]

TestAPIView class 를 import 하여 ‘test/’ 라는 path 에 바인딩하였습니다.

Test web server 구동

이제 필요한 코드가 모두 준비되었습니다. 단, 웹서버를 실행하기 전에 database migration이 필요합니다. Database 작업을 전혀 하지 않았지만, admin UI를 위한 DB 연동 데이터가 미리 생성이 되기 때문에 이를 기본 DB 설정인 sqlite 를 생성하여 migrate 하는 과정이 필요합니다. 물론, mysql 이나 postgresql 등의 DB를 사용하고 싶다면 별도의 과정을 통해 설치 및 설정을 완료하면 됩니다. 이 글의 주제와는 다른 내용이므로 여기서는 기본 설정을 이용해 migration 하겠습니다.

$ python3 manage.py migrate

이제 django 에서 제공하는 기본 웹서버를 구동해 보겠습니다.

로컬 머신에서 구동되고 로컬 머신에서 접속하고자 한다면 다음과 같이 구동하면 됩니다.

$ python3 manage.py runserver

만약 클라우드 서버에서 구동하거나 다른 머신에서 접속해서 확인하고자 하는 경우에는 다음과 같이 외부 접속용 서버를 구동합니다.

$ python3 manage.py runserver 0.0.0.0:8000

Connection Test

구동한 서버에 접속해 보겠습니다.

Root 패스 접속하면 제공되는 내용이 없음

웹서버를 구동하고 접속해 보면 root path 에서 제공되는 내용이 없기 때문에 위와 같이 404 에러 화면이 표시됩니다.

Test API path 에 GET method 요청

앞서 GET method 를 구현하여 /test/ 패스에 바인딩 했으므로 생성했던 페이지에 접속해 보겠습니다.

TestAPI GET method 응답

접속이 잘 되고 우리가 앞서 디자인 했던 응답을 주고 있는 것을 확인할 수 있습니다. 유사한 방법으로 필요한 기능을 구현하여 API 서버를 완성하면 되겠습니다.


Jay

Jay

S/W Engineer!!

2개의 댓글

7 kogus · 2020-12-10 16:31

Very good post. I will be going through some of these issues as well..

Django Timezone 시간대를 다루는 방법 - voidint.com · 2022-09-01 12:15

[…] Django Web Server on Ubuntu 20.04에 이어 오랜만에 Django 관련 정확히는 Django Timezone 에 대한 내용입니다. […]

답글 남기기

Avatar placeholder