본문으로 바로가기
반응형

장고(Django)를 사용해 REST API 만드는 방법에 대해 포스팅한다.

Restframework를 사용하면 쉽게 만들 수 있다.

최종 목표는 게시글 목록을 불러오고 삽입, 수정, 삭제까지 가능한 API를 구현하는 것이다.

먼저 아래의 폴더를 하나 생성하고 해당 폴더에 가상 환경을 구축한다.


mkdir rest

python3 -m venv env

source env/bin/activate


그럼 위와 같이 맨 앞에 (env) 라는 게 생긴다.

가상 환경이라는 뜻이다.

다음으로 django와 restframework를 설치해준다.

현재 Django 최신버전은 2.0이지만 기존에 사용하던 1.11.6 버전을 설치할 것이다.

그리고 Django는 기본적으로 데이터베이스로 Sqlite를 사용하지만

나는 MySQL이 더 익숙하므로 pymysql을 사용해 MySQL로 바꿔줄 것이다.


pip install django==1.11.6

pip install djangorestframework

pip install pymysql


이제 장고를 통해 프로젝트를 하나 생성한다.

(나는 프로젝트 이름을 project_rest, 앱 이름을 project_app으로 생성할 것이다)


django-admin startproject project_rest


그러면 project_rest라는 폴더가 하나 생성된다.

다음으로 App을 하나 생성한다.

(장고는 하나의 프로젝트와 다수의 앱으로 구성된다.)


cd project_rest

django-admin startapp app_rest


이제 rest framework와 만든 app을 등록해줘야 한다.

프로젝트 폴더의 settings.py로 들어가서 INSTALLED_APPS 부분에 추가해준다.


아래로 내려보면 DATABASES 부분이 있다.


이 부분을 아래와 같이 바꿔준다.


이 때 NAME부분에 입력하는 DB명은 MySQL에 미리 생성된 DB명이어야 한다.

그렇지 않을 시 django.db.utils.InternalError: (1049, "Unknown database 'DB명'") 에러가 발생한다.

마지막으로 최상단에 아래의 내용을 추가한다.


import pymysql

pymysql.install_as_MySQLdb()


이제 터미널로 돌아와서 변경 사항을 migrate 해줘야 한다.


python3 manage.py migrate


이제 기본적인 세팅은 끝났다.

project_app/models.py로 들어가서 테이블과 컬럼에 관한 정보를 입력한다.


from django.db import models


class article(models.Model):

    author = models.CharField(max_length=20)

    title = models.CharField(max_length=20)

    content = models.CharField(max_length=100)

    date = models.DateTimeField(auto_now=True)


CharField 형태로 컬럼을 생성하면 MySQL의 varchar형태로 생성된다.

max_length를 통해 최대 길이를 정해준다.

위 문장을 MySQL문법으로 바꿔보면 다음과 같다.


create table article(author varchar(20), title varchar(20), content varchar(100), date datetime))


물론 기본적으로 id라는 컬럼이 추가되고 테이블명도 앞에 django~라는 접두사가 붙지만

대충 느낌이 저렇다고 생각하자.



다음으로 project_app(앱폴더) 안에 serializers.py 라는 파일을 생성한 후 아래의 코드를 입력한다.


from app_rest.models import article

from rest_framework import serializers


class articleSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:

        model = article

        fields = ('pk', 'author', 'title', 'content', 'date')


serializers.py는 정보를 직렬화 시켜주는 기능을 한다고만 이해하면 될 것 같다.

다음으로 views.py로 들어가서 아래의 코드를 입력한다.


from rest_framework import viewsets

from app_rest.serializers import articleSerializer

from app_rest.models import article


class articleViewSet(viewsets.ModelViewSet):

    queryset = article.objects.all()

    serializer_class = articleSerializer




마지막으로 project_rest/urls.py로 들어가서 아래의 코드를 입력한다.


from django.conf.urls import url, include

from django.contrib import admin

from app_rest import views

from rest_framework import routers


router = routers.DefaultRouter()

router.register(r'list', views.articleViewSet)


urlpatterns = [

    url(r'^', include(router.urls)),

    url(r'^admin/', admin.site.urls),

]



다음 명령어를 통해 migrate 시켜준다.


python3 manage.py makemigrations

python3 manage.py migrate


서버를 실행시킨다.


python3 manage.py runserver


아마 위와 같은 화면이 나올것이다.

중간에 있는 http://127.0.0.1:8000/list/ 를 클릭해본다.


아직 아무런 값이 입력되지 않았기 때문에 비어있는 상태다.

밑에 Author, Title, Content를 차례대로 입력하고 POST버튼을 누른다.


그러면 데이터베이스에 저장이 되고 그 내용을 성공적으로 불러온다.

간단하게 어떠한 요청으로 값을 읽고 추가할 수 있는지 파이썬 코드로 나타내보았다.


--------------------- Source ------------------------------------

import requests


r = requests.get("http://127.0.0.1:8000/list/")

print("[*] Article List")

print(r.text)

print("-------------------------------------")


params = {'author':'hide', 'title':'python Test', 'content':'testtest'}

r = requests.post("http://127.0.0.1:8000/list/", data=params)

print("[*] Insert Article")

print(r.text)

print("-------------------------------------")


r = requests.get("http://127.0.0.1:8000/list/")

print("[*] After Insertion")

print(r.text)


데이터 조회는 단순히 GET으로 list를 요청하면 된다.

그러면 값이 json으로 return된다.

값을 삽입하고 싶을 경우 POST 메소드로 list에 값을 넣어주면 되는데

그 값을

params = {'author':'hide', 'title':'python Test', 'content':'testtest'}

이러한 딕셔너리 형태로 넣어주면 된다.



보기/상세보기/추가/수정/삭제 모든 요청은 HTTP METHOD로 구분된다.


보기 : GET

상세보기 : GET

추가 : POST

수정 : PUT 또는 PATCH

삭제 : DELETE


METHOD만 맞춰주고 그에 필요한 인자를 맞춰주면 따로 뭔가를

작성할 필요 없이 잘 동작한다.

최종 소스는 다음과 같다.


import requests


def view(): # 보기

r = requests.get("http://127.0.0.1:8000/list/")

print("[*] View()")

print(r.text)


def create(): # 추가

params = {'author':'hide', 'title':'python Test', 'content':'testtest'}

r = requests.post("http://127.0.0.1:8000/list/", data=params)

print("[*] Create()")

print(r.text)

print("-------------------------------------")


def detail(): # 상세보기

r = requests.get("http://127.0.0.1:8000/list/1/")

print("[*] Detail()")

print(r.text)


def update(): # 수정

params = {'author':'adsdsaasd', 'title':'replace', 'content':'adsadas'}

r = requests.put("http://127.0.0.1:8000/list/1/", data=params)

print("[*] Update()")

print(r.text)


def delete(): #삭제

r = requests.delete("http://127.0.0.1:8000/list/3")

print("[*] Delete()")

print(r.text)


if __name__ == '__main__':

delete()


이로써 대략적인 Rest Framework 사용법을 정리해봤다.

다음 포스팅은 Authentication, Permission을 이용하여 사용자 별 인증을 하고

권한에 따른 접근제한을 해보겠다.


다음 포스팅으로 가기(권한 설정)

반응형