본문 바로가기

파이썬

파이썬 보아뱀 나홀로 사냥 4 - REST API 구현

반응형

REST API란?

REST(Representational State Transfer) 라는 용어는 Roy Fielding이라는 사람의 2000년 박사학위 논문에 소개되었다. 

웹에서 어플리케이션간 정보를 주고받기 위한  클라이언트 - 서버간 통신 방식으로 http기반으로 동작되는 아키텍쳐이며, RESTful이란 용어로도 불린다.

 

예)

http method: GET url: /category/post          : 포스트 이름 나타내기

http method: POST url: /category/post        : 포스트 이름 추가

http method: PUT url: /category/post          : 포스트 이름 변경

http method: DELETE url: /category/post      : 포스트 이름 삭제

 

 

1) Django 설치 및 프로젝트 생성 환경을 만듭니다.

   - 장고 설치와 프로젝트 생성 단계를 안하신 분은 아래로 들어가보세요

 

파이썬 보아뱀 나홀로 사냥 2 - Django 설치 - 윈도우즈 가상 환경

장고를 가상환경(Virtual environment)으로 설치 I. 가상환경 virtualenv를 구성 1) 장고 가상환경을 만들 디렉토리 생성, >C:\Users\사용자명\ 아래에 DjangoVirtu 디렉토리 생성 2) 콘솔 창을 열고,  C:\Python..

imaking.tistory.com

 

2) cmd 창을 열고 앞 스토리에서 설명한 장고 가상환경을  activate한다

  \myDdjangoVirtu>mydjango\Scripts\activate

  - (mydjango) D:\...\DjangoVirtu>  콘솔로 변경되면 정상 

 

3) 가상환경에서 'Django REST framework(DRF)'를 설치 (devenv)
 > pip install djangorestframework

(mydjango) C:\Users\..\DjangoVirtu>pip install djangorestframework
Collecting djangorestframework
  Downloading djangorestframework-3.12.4-py3-none-any.whl (957 kB)
     |████████████████████████████████| 957 kB 1.3 MB/s
Requirement already satisfied: django>=2.2 in c:\users\..\appdata\local\programs\python\python39\lib\site-packages (from djangorestframework) (3.2.2)

....
Installing collected packages: djangorestframework
Successfully installed djangorestframework-3.12.4
WARNING: You are using pip version 21.0.1; however, version 21.1.1 is available.
You should consider upgrading via the 'c:\users\..\appdata\local\programs\python\python39\python.exe -m pip install --upgrade pip' command.


경고 warning 메시지는 무시하려다, 그래도 메시지에 적힌 경로와 pip 업그레이트 명령어를 수행해준다

(mydjango) c:\users\..\appdata\local\programs\python\python39\python.exe -m pip install --upgrade pip
Requirement already satisfied: pip in c:\users\bonofaber\appdata\local\programs\python\python39\lib\site-packages (21.0.1)
Collecting pip
  Downloading pip-21.1.1-py3-none-any.whl (1.5 MB)
     |████████████████████████████████| 1.5 MB 1.1 MB/s
Installing collected packages: pip
  Attempting uninstall: pip
    Found existing installation: pip 21.0.1
    Uninstalling pip-21.0.1:
      Successfully uninstalled pip-21.0.1
Successfully installed pip-21.1.1


성공했다니 조금 개운하고 기쁘다

 

4) REST 프로젝트 생성

 - (mydjango) D:\..\DjangoVirtu>django-admin startproject REST_proj

동일한 이름의 프로젝트 디렉토리가 생성된 것을 확인

(mydjango)C:\Users\..\Django\DjangoVirtu 디렉터리

2021-05-19  오전 09:32    DIR       .
2021-05-19  오전 09:32    DIR        ..
...
2021-05-19  오전 09:32    DIR        REST_proj
1개 파일             197,291 바이트

(mydjango) C:\Users\..\Django\DjangoVirtu\REST_proj 디렉터리

2021-05-19  오전 09:32    DIR          .
2021-05-19  오전 09:32    DIR          ..
2021-05-19  오전 09:32               687 manage.py
2021-05-19  오전 09:32    DIR          REST_proj
               1개 파일                 687 바이트

 

5) 프로젝트내 사용할 API 앱을 생성    (주의 ! 장고가 아닌 파이썬에서 생성)

 - (mydjango) C:\Users\..\Django\DjangoVirtu\REST_proj>python manage.py startapp API_app

동일한 이름의 앱 디렉토리가 생성된 것을 확인

(mydjango)C:\Users\B..\Django\DjangoVirtu\REST_proj 디렉터리

2021-05-19  오전 10:34    DIR          .
2021-05-19  오전 10:34    DIR          ..
2021-05-19  오전 10:34    DIR          API_app
2021-05-19  오전 09:32               687 manage.py
2021-05-19  오전 10:30    

 

6) DRF를 사용하기 위해 settings.py에 어플리케이션을 정의

  - settings.py는 REST_proj 디렉토리 아래 똑같은 이름의 디렉토리내  존재한다

 C:\Users\..\DjangoVirtu\REST_proj\REST_proj 디렉터리
2021-05-19  오전 09:32    <DIR>          .
2021-05-19  오전 09:32    <DIR>          ..
2021-05-19  오전 09:32               411 asgi.py
2021-05-19  오전 09:32             3,373 settings.py
2021-05-19  오전 09:32               772 urls.py
2021-05-19  오전 09:32               411 wsgi.py
2021-05-19  오전 09:32                 0 __init__.py
               5개 파일               4,967 바이트

 

- settings.py를 코드 에디터로 열고( 저는 python IDLE 사용),  INSTALLED_APPS  ‘rest_framework’ 및 ‘APP_api’ 앱을 같이 추가해주어야 한다

# Application definition
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',   # 추가
    'API_app',   # 추가
]

 

settings.py내 ALLOWD_HOSTS도  develop 용으로 모두 허용해준다.(배포할 땐 호스트를 지정)

ALLOWED_HOSTS = ['*']   # All로 변경

 

 

이제부터 REST API가 동작하는 웹 어플리케이션을 구현해본다

 

먼저, 웹 어플리케이션 프레임웍의 동작절차의 개념은 다음 그림과 같다.

 

- 웹브라우저로부터 http 요청을 받으면,

- get/post 등의 메서드의 요구사항을 알내고, 데이터베이스에서 정보를 읽고 쓰는 작업을 한 후 

- 웹브라우저로 결과를 응답해주는 것이 일반적인 절차이다

Django Web Application Framework

 

 

7) Models 생성

모델은 장소, 제목, 년도의 필드를 예로 해본다.

모델 정의 화일은 생성한 API_app 디렉토리내 models.py이다

from django.db import models
# Create your models here.

# API_api/models.py
from django.db import models

class ApiModel(models.Model):
    loca = models.CharField(max_length=20) # 장소
    title = models.CharField(max_length=30) # 제목
    year = models.IntegerField()                # 제작 년도

    def __str__(self):
        return self.title

 

8) 모델 작성후 마이그레이션, 마이그레이트 

  - (mydjango) C:\Users\..\Django\DjangoVirtu\REST_proj>python manage.py makemigrations

  - (mydjango) C:\Users\..\Django\DjangoVirtu\REST_proj>python manage.py migrate

(mydjango) C:\Users\..\Django\DjangoVirtu\REST_proj>python manage.py makemigrations
Migrations for 'API_app':
  API_app\migrations\0002_rename_movie_api.py
    - Rename model Movie to API

(mydjango) C:\Users\..\Django\DjangoVirtu\REST_proj>python manage.py migrate
Operations to perform:
  Apply all migrations: API_app, admin, auth, contenttypes, sessions
Running migrations:
  Applying API_app.0001_initial... OK
  Applying API_app.0002_rename_movie_api... OK
  ....
  Applying sessions.0001_initial... OK

 

9) Serializers 생성

Serializer란?

Django 이용 웹 개발에서 Django ORM의 Queryset은 Django template로 넘겨지며 HTML로 렌더링되어 Response로 보내진다. 하지만 JSON으로 데이터를 보내야 하는 REST API는 HTML로 렌더링 되는 Django template를 사용할 수 없어 Queryset을 감싼(Nested) JSON으로 매핑하는 과정을 하는데, 이 작업을  Serializer이 한다

 

즉, queryset과 모델 인스턴스와 같은 데이터를 json, xml 또는 다른 콘텐츠 유형으로 변환한다. 받은 데이터의 유효성을 검사한 다음, 형 변환할 수 있도록 serializeation을 제공한다. 

 

Serializer 작성은 Django REST framework가 제공하는 ModelSerializer을 사용한다.

api에 serializers.py 파일을 생성하고, 위에서 정의한 모델 필드들을 입력합니다.

# API_app/serializers.py

from rest_framework import serializers
from .models import ApiModel                       #models.py내 정의된 클래스 이름

class ApiSerializer(serializers.ModelSerializer):
    class Meta:
        model = ApiModel # 모델 설정
        fields = ('loca','title','year') # 필드 설정

 

10) 뷰 View 생성

DRF는 자주 사용하는 공통적인 view 로직을 그룹화 한 viewset을 제공한다.

Queryset 데이터를 Serializer을 통해 매핑시켜 보여주는 View가 필요하다.

Viewset을 이용해 Model 하나를 컨트롤하는 CRUD를 1개의 View로 구현한다.

 

API_app 디렉토리에 view.py 화일이 이미 생성되어 있고, 여기에 뷰 내용을 넣으면 된다

from django.shortcuts import render

# Create your views here.

# API_app/views.py

from rest_framework import viewsets
from .serializers import ApiSerializer           #serializers.py내 정의된 클래스 이름
from .models import ApiModel                 #models.py내 정의된 클래스 이름

class ApiViewSet(viewsets.ModelViewSet):
    queryset = ApiModel.objects.all()
    serializer_class = ApiSerializer  #serializers.py내 정의된 클래스 이름

 

11) 마지막으로 URL 매핑

URL은 앱 url.py 과 프로젝트내 상위 url.py 두개를 정의해주어야 한다.

 

   11-1) 먼저 API_app 디렉토리에 url.py 화일을 생성하고, 아래 내용을 입력

# API_app/urls.py

#여기서는 앱 URL 정의
#REST_proj내 상위 '프로젝트 URL'은 따로 있다.


from django.contrib import admin
from django.urls import path
from django.conf.urls import url # 추가
from API_app.views import ApiViewSet # 추가

app_name = 'API_app'  #추가
urlpatterns = [
    
    url(r'^$',ApiViewSet.as_view({'get': 'list'})), #name='index'),
]

 

     11-2) 프로젝트 REST_proj 디렉토리에 url.py 화일을 열고, 아래 내용을 입력

# 프로젝트 URL
# REST_proj/urls.py

from django.urls import path,include
from django.contrib import admin

urlpatterns = [
    path('API_app/', include('API_app.urls')),
    path('admin/', admin.site.urls),
]

 

( 참고 ) https://berkbach.com/restful-api-in-django-16fc3fb1a238 

 

   11-3) (Option)  admin site에 모델 등록

from django.contrib import admin

# Register your models here.
from .models import ApiModel   # models.py에 정의된 클래스
admin.site.register(ApiModel)

 

12) URL 작성후 마이그레이션, 마이그레이트 

  - (mydjango) C:\Users\..\Django\DjangoVirtu\REST_proj>python manage.py makemigrations

  - (mydjango) C:\Users\..\Django\DjangoVirtu\REST_proj>python manage.py migrate

 

13) 서버 런 실행 

 - (mydjango) C:\Users\..\DjangoVirtu\REST_proj>python manage.py runserver


Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
May 19, 2021 - 12:26:59
Django version 3.2.2, using settings 'REST_proj.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
정상수행 된듯 하지만,  직접 서버에 접속해보아야 한다

 

14) 서버로 접속 및 API 모델 입력/삭제

 localhost:8000/admin으로 접속하여 로그인 하면 API_app으로 넘어가서, 정의한 모델의 필드를 add/delete할수 있다

 

두개 정도 모델 입력후, 로그이웃하고 사용자 화면으로 접속헤본다 (브라우저에서  'localhost:8000/API_app'로 접속) 

우측 GET 으로 들어가 json방식을 선택하면,

브라우저 URL이 'http://127.0.0.1:8000/API_app/?format=json'로 바뀌면서

화면에는 다음과 같이 json 포맷으로 나타난다

성공인것 같다...

 

내가 여기까지 하다니, 스스로 대견하다

 

 

 

여기까지 한 당신 휴식과 충전이 필요하다.  z~ z~ z~

반응형