Django

장고 Board REST API 예제

수알치 2021. 11. 24. 20:41

장고 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는 제외한 데이터를 입력한다. 

<이상>

반응형