본문 바로가기

web/Django_rest_framework

[Django rest framework] 1. 기존 셋팅 + CRUD

이번 포스팅의 소스는 여기에 있습니다.

 

- python3.6, django 2.1, django-rest-framework 3.8 을 사용합니다.

 

이번 포스팅에서는 기본 셋팅 및 간단한 모델을 생성하여, CRUD URL을 만드는것을 목표로 합니다.

 

 

1. 프로젝트 생성 및 DRF 기본 셋팅

패키지 설정을 위해 virtualenv로 관리 합니다.

python 3.6 버전으로 django-env이라는 env를 생성합니다.

$ sudo pip install virtualenv
$ virtualenv -p python3.6 django-env
$ source django-env/bin/activate

 

env생성 및 활성화 함으로써, 전역 설치가 아닌 django-env에 패키지들이 설치되게 되어 패키지들의 버전 충돌을 피할수 있습니다.

먼저 django를 설치해 줍니다.

$ pip install django

 

 

이제 django 명령어를 사용할수 있습니다.

django-admin 을 통해서 장고 프로젝트와 app을 설치해 줍니다.

app의 이름은 blog 입니다.

$ django-admin.py startproject django_best_practice_example
$ cd django_best_practice_example
$ django-amdin.py startapp blog
$ ls

프로젝트 폴더 내 트리 구조

app까지 추가 했다면 위와 같은 구조를 가지게 됩니다.


번외 1

회사나 개인이 따로 가지고 있는 django의 템플릿이 있다면 아래와 같이 명령어를 하시면 됩니다.  템플릿에 해당하는 폴더를 복사한다고 생각하면 됩니다. 기본 설정을 미리 만들어놓고 쓰는 템플릿이라 생각하시면 됩니다.

$django-admin.py startproject --template=./템플릿경로  프로젝트명

번외 2

 

pycharm으로 개발시 env의 연결은 옵션에서 인터프린터를 연결해 주면됩니다. (pycharm 버전에 따라 경로가 다를수 있습니다. )

메뉴 중에서 preferences -> project -> python interpreter에서 위에서 생성한 env를 설정해 줍니다.

select 박스에서 show all 선택 -> + 클릭

Virtualenv Environment -> Existing environment 선택, interpreter 에서 경로를 위에서 만든 env의 경로중 /bin/python3를 선택하고 ok를 눌러주면 설정이 완료 됩니다.

 

정상적으로 설정되었다면 아래와 같이 설치된 패키지들이 보입니다.

콘솔에서 pip로 설치해도 되며, 해당 화면에서 클릭만으로 패키지를 관리할수 있습니다.


 

 

이제 DRF 패키지를 설치 해줍니다.

$ pip install djangorestframework

이로써 패키지 설치는 완료 되었습니다. 이제 아까 만들었던 blog app을 DRF을 통해 api 연결을 해보겠습니다.

 

먼저 settings.py에 app과 DRF를 설정해 줍니다.

# django_best_practice_example/settings.py

INSTALLED_APPS = [
	...
	'rest_framework',
	'blog.apps.BlogConfig'
]

 

blog에 model과 serializers을 추가해줍니다. (serializers.py는 파일을 생성해 줍니다. )

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


class Post(models.Model):
    message = models.TextField(blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    
    
# blog/serializers.py
from rest_framework.serializers import ModelSerializer
from .models import Post


class PostSerializer(ModelSerializer):

    class Meta:
        model = Post
        fields = ['id', 'message', 'created_at']

 

이제 view에 사용할 api를 선언해 줍니다.

# blog/views.py

from rest_framework.viewsets import ModelViewSet

from .models import Post
from .serializers import PostSerializer


class PostViewSet(ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer

 


ModelViewSet

FBV(function base view)와 apiview 대신 viewset 클래스를 사용하는것은 몇 이점이 있습니다.

1. 반복된 논리를 단일 클래스로 결합 할 수 있습니다.  위에서 볼수 있듯이 queryset으로 지정한것을 여러 메소들에서 사용합니다.

2. url에서 라우터(DefaultRouter)를 사용하면 url을 직접 설정할 필요가 없습니다.

 

ModelViewSet을 보면 mixins과 GenericViewSet을 상속받은것을 볼수 있습니다.

# /site-packages/rest_framework/viewsets.py

class ModelViewSet(mixins.CreateModelMixin,
                   mixins.RetrieveModelMixin,
                   mixins.UpdateModelMixin,
                   mixins.DestroyModelMixin,
                   mixins.ListModelMixin,
                   GenericViewSet):

즉 viewset과 mixins의 모든 기능들을 사용가능합니다. 특별한 경우가 아니라면 ModelviewSet을 사용해야 합니다. 가독성과 코드의 최소화, 커스텀 상속들이 자유롭기 때문에 여러명이 하는 프로젝트일수록 ModelViewSet으로 구현해야 관리가 편해집니다.


마지막으로 view에 연결할 url을 만들어줍니다.

# blog/urls.py

# -*- coding: utf-8 -*-
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import PostViewSet

router = DefaultRouter()
router.register('post', PostViewSet)

urlpatterns = [
    path('', include(router.urls)),
]

 

해당 url을 django_best_practice_example의 urls.py에 연결해 줍니다.

django_best_practice_example/urls.py가 서버의 모든 url을 관리해 주는 시작점으로 생각하시면 됩니다.

각각의 app의 url은 app만의 url로 쪼개져 관리됩니다.

# django_best_practive_example

from django.contrib import admin
from django.conf.urls import url, include

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^api/v1/', include('blog.urls'))
]

 

서버 시작전 모델을 새롭게 정의 했으므로, 디비에 해당 모델을 선언해 줘야 합니다.

django에서는 모델에 대한 관리는 migration으로 관리합니다.

https://docs.djangoproject.com/en/3.0/topics/migrations/

 

Migrations | Django documentation | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

$ ./manage.py makemigrations
$ ./manage.py migrate

makemigrations 명령어로 테이블의 변경사항을 파일로 기록합니다.

migrate로 변경사항들을 실제 디비에 적용합니다.

현재 디비는 디폴트인 sqlite3를 사용합니다.

 

이제 서버를 시작합니다.  디폴트로 127.0.0.1:8000으로 실행 됩니다.

$ ./manage.py runserver

서버 실행시의 다양한 옵션은 아래를 참고 하시면 됩니다.

https://docs.djangoproject.com/en/3.0/ref/django-admin/

 

django-admin and manage.py | Django documentation | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

 

 

127.0.0.1:8000/api/v1/post/ 링크로 들어가보면 아래와 같이 DRF의 템플릿이 나옵니다.

여기에서 CRUD를 간단하게 테스트 할 수 있습니다.

POST를 통해 새로운 객체를 생성하고

127.0.0.1:8000/api/v1/post/1/ 으로 들어가보면 해당 인스턴스의 내용과 수정/삭제를 할수 잇는것을 알수 있습니다.