장고(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을 이용하여 사용자 별 인증을 하고
권한에 따른 접근제한을 해보겠다.
'Coding > Python' 카테고리의 다른 글
Python3 requests SSL 오류 해결 방법 (0) | 2018.02.03 |
---|---|
장고(Django) Restframework 인증 권한 설정 방법 (0) | 2018.01.10 |
빗썸(Bithumb) API 사용하는법 (0) | 2018.01.05 |
Python Blind Sql Injection Tool with Multiprocessing (0) | 2017.12.24 |
파이썬 pymysql fetchone() (0) | 2017.11.09 |