장고 Board REST API 예제
장고 Board REST API 예제
참고 동영상: https://www.youtube.com/watch?v=UXsZVh3CjtQ&t=1312s
정리. 수알치 오상문
1. 프로젝트 시작 경로 생성
/board_api
2. 파이참에서 새 프로젝트를 venv 환경으로 만들면서 시작 위치는 /board_api 지정
3. 파이참 터미널에서 장고 설치 (예제는 기본 버전 3.2.9)
pip install django 또는
pip install django==3.1.3 버전 지정
4. 장고 restframework 및 관련 모듈 설치
[참고 사이트] django-rest-framework.org
pip install djangorestframework
pip install markdown
pip install django-filter
pip install django-rest-swagger
5. 필요하면 settings.py의 DB 정보 등을 수정
[settings.py]
ALLOWED_HOSTS = ["*"]
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'board',
]
# 예제에서 DB는 기본 sqlite3 설정을 그대로 사용
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
LANGUAGE_CODE = 'ko-kr'
TIME_ZONE = 'Asia/Seoul'
[참고] 아래 주소로 요청받으면 json 형태 자료를 돌려줌
127.0.0.1/boardview/3/ 또는
127.0.0.1:8000/boardview/3/ (8000번 포트 사용 시)
{
"id": "3",
"b_writer": "홍길동",
"b_title": "제목입니다.",
"b_date": "2021-11-11T104505+09:00"
}
6. 프로젝트 앱과 board 앱 생성 및 DB 마이그레이션
[터미널]
django-admin startproject config . <-- 점 포함
py manage.py startapp board
7. DB 테이블 생성
py manage.py makemigrations
py manage.py migrate
8. 관리자 계정 admin 생성
py manage.py createsuperuser
admin / 이메일 / 비밀번호 / 비밀번호 다시 입력하여 생성
9. Board 모델 생성
[models.py]
from django.db import models
class Board(models.Model):
b_writer = models.CharField(db_column="b_writer", max_length=255)
b_title = models.CharField(db_column="b_title", max_length=255)
b_date = models.DateTimeField(db_column="b_date", auto_now_add=True)
class Meta:
# managed = False
db_table = "myapp_board"
10. Board 테이블 마이그레이션
py manage.py makemigrations board
py manage.py migrate board
11. board view.py 작성
[view.py]
from django.http import JsonResponse
def viewjson(request):
return JsonResponse("Board REST API 1.0", safe=False)
12. board urls.py 작성
[urls.py]
from django.urls import path
from .views import viewjson
urlpatterns = [
path('viewjson/', viewjson, name='viewjson'),
]
13. 프로젝트 urls.py 작성
[urls.py]
from django.contrib import admin
from django.urls import path
from django.conf.urls import url, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include("board.urls")),
]
14. 장고 서버 실행 및 테스트
py manage.py runserver 80
웹브라우저에서 접속
http://127.0.0.1/viewjson/
15. board view.py 수정
[view.py]
from django.http import JsonResponse
from rest_framework.response import Response
from rest_framework.decorators import api_view
def viewjson(request):
return JsonResponse("Board REST API 1.0", safe=False)
@api_view(["GET"])
def index(request): # 루트 요청이면 API 도움말 메시지 출력
api_urls = {
"List": "/boardlist/",
"Detail": "/boardview/<str:pk>",
"Create": "/boardinsert/",
"Update": "/boardupdate/<str:pk>",
"Delete": "/boraddelete/<str:pk>",
}
return Response(api_urls)
16. board urls.py 수정
[urls.py]
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name="index"),
path('viewjson/', views.viewjson, name='viewjson'),
]
17. board serializers.py 작성
[serializers.py]
from rest_framework import serializers
from .models import Board
class BoardSerializer(serializers.ModelSerializer):
class Meta:
model = Board
fields = "__all__"
18. board admin.py 작성
[admin.py]
from django.contrib import admin
from .models import Board
admin.site.register(Board)
19. 장고 서버에 어드민 접속해서 board를 세 개 등록
...
20. board views.py 수정
[views.py]
from django.http import JsonResponse
from rest_framework.response import Response
from rest_framework.decorators import api_view
from .models import Board
from .serializers import BoardSerializer
def viewjson(request):
return JsonResponse("Board REST API 1.0", safe=False)
@api_view(["GET"])def index(request): # API 도움말
api_urls = {
"List": "/boardlist/",
"Detail": "/boardview/<str:pk>", # boarditem
"Create": "/boardinsert/",
"Update": "/boardupdate/<str:pk>",
"Delete": "/boraddelete/<str:pk>",
}
return Response(api_urls)
@api_view(["GET"])
def boardList(request):
boards = Board.objects.all()
serializer = BoardSerializer(boards, many=True)
return Response(serializer.data)
@api_view(["GET"])
def boardView(request, pk):
try:
board = Board.objects.get(id=pk)
except:
return Response({}, status=204) # 204 vs. 404
serializer = BoardSerializer(board, many=False)
return Response(serializer.data)
@api_view(["POST"])
def boardInsert(request):
serializer = BoardSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response("OK")
return Response(serializer.data, status=400) # Bad request
@api_view(["POST"])def boardUpdate(request, pk):
try:
board = Board.objects.get(id=pk)
except:
return Response({}, status=204) # 204 vs. 404
serializer = BoardSerializer(instance=board, data=request.data)
if serializer.is_valid():
serializer.save()
return Response("OK")
return Response(serializer.data, status=400) # Bad request
@api_view(["DELETE", "GET"]) # GET 또는 DELETE 요청 모두 처리
def boardDelete(request, pk):
try:
board = Board.objects.get(id=pk)
except:
return Response({}, status=204) # 204 vs.. 404:
board.delete()
return Response("OK")
21. board urls.py를 수정합니다.
[urls.py]
from django.urls import path
from . import views
urlpatterns = [
path('viewjson/', views.viewjson, name='viewjson'),
path('', views.index, name='index'),
path('boardlist/', views.boardList, name='boardlist'),
path('boardview/<int:pk>/', views.boardView, name='boardview'),
path('boardinsert/', views.boardInsert, name='boardinsert'),
path('boardupdate/<int:pk>', views.boardUpdate, name='boardupdate'),
path('boarddelete/<int:pk>', views.boardDelete, name='boarddelete'),]
22. 장고 서버 각 주소에 접속해서 테스트
참고로 등록 시 id는 제외한 데이터를 입력한다.
<이상>