- 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/
$ ./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/
127.0.0.1:8000/api/v1/post/ 링크로 들어가보면 아래와 같이 DRF의 템플릿이 나옵니다.
여기에서 CRUD를 간단하게 테스트 할 수 있습니다.
POST를 통해 새로운 객체를 생성하고
127.0.0.1:8000/api/v1/post/1/ 으로 들어가보면 해당 인스턴스의 내용과 수정/삭제를 할수 잇는것을 알수 있습니다.
'web > Django_rest_framework' 카테고리의 다른 글
[Django rest framework] 3. pagination (0) | 2020.06.18 |
---|---|
[Django rest framework] 2. token / authentication (0) | 2020.06.07 |
[Django rest framework] 튜토리얼을 시작하며. (0) | 2020.06.02 |
django Rest framework APIView / Mixins / Viewset (0) | 2020.03.29 |
django rest_freamework에서 리턴값을 json으로 보내자. (0) | 2020.03.27 |