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.py2021-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 등의 메서드의 요구사항을 알내고, 데이터베이스에서 정보를 읽고 쓰는 작업을 한 후
- 웹브라우저로 결과를 응답해주는 것이 일반적인 절차이다
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~
'파이썬' 카테고리의 다른 글
파이썬 보아뱀 나홀로 사냥 6 - 윈도우즈에 Open SSL 설치 (1) | 2021.05.22 |
---|---|
파이썬 보아뱀 나홀로 사냥 5 - HTTPS/SSL 인증서 발급/동작 절차 (0) | 2021.05.21 |
파이썬 보아뱀 나홀로 사냥 3 - Django 앱 개발 (메모 게시판) (0) | 2021.05.16 |
파이썬 보아뱀 나홀로 사냥 2 - 윈도우즈 가상 환경 Django 부터 DB설치 까지 (0) | 2021.05.15 |
파이썬 보아뱀 나홀로 사냥 1 - Django 윈도우즈 설치 (0) | 2021.05.11 |