앞서 진행했던 회원관련 api는 apiview를 활용했습니다.
이번 포스트에서는 viewset을 활용해서 api를 만들어보겠습니다.
먼저 게시글 app을 만듭니다.
python manage.py startapp boards
메인 프로젝트의 settings.py의 INSTALLED_APPS에 boards를 추가해줍니다.
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# 아래부터 추가된 부분
'rest_framework',
'accounts',
'boards',
]
게시글 모델 생성
실제 Fit-ple 프로젝트에서 진행했던 모델이 아닌 다른 분들이 빠르게 돌려보고 학습할 수 있도록 간단하게 생성하겠습니다.
from django.db import models
from accounts.models import User
class Board(models.Model):
author = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
title = models.CharField('제목', max_length=100)
body = models.TextField('본문')
created_at = models.DateTimeField('생성시간', auto_now_add=True)
modified_at = models.DateTimeField('수정시간', auto_now=True)
class Meta:
ordering = ["-created_at"]
간단하게 작성자, 제목, 본문만 받아서 테스트할 수 있도록 만들었습니다.
작성자는 전 포스트에서 진행했던 jwt를 받아서 사용할 예정입니다.
serializers.py 생성 및 작성
우선 boards 앱에 serializers.py 를 생성합니다.
touch boards/serializers.py
아래 내용을 serializers.py에 작성합니다.
from rest_framework import serializers
from .models import Board
class BoardSerializer(serializers.ModelSerializer):
class Meta:
model = Board
fields = ('author', 'id', 'title', 'body', 'created_at', 'modified_at')
views.py 작성
from rest_framework import viewsets
from rest_framework import permissions
from .serializers import BoardSerializer
from .models import Board
class BoardViewSet(viewsets.ModelViewSet):
queryset = Board.objects.all()
serializer_class = BoardSerializer
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
def perform_create(self, serializer):
serializer.save(author=self.request.user)
urls.py 생성 및 작성
앞서 작업한 viewset을 접근할 수 있도록 urls.py를 생성하여 아래 내용을 작성합니다.
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from . import views
router = DefaultRouter()
router.register(r'brd', views.BoardViewSet)
urlpatterns = [
path('', include(router.urls)),
]
메인 프로젝트의 urls.py에 boards 연결합니다.
from django.contrib import admin
from django.urls import path
from django.conf.urls import include
urlpatterns = [
path('admin/', admin.site.urls),
path('users/', include('accounts.urls')),
path('boards/', include('boards.urls')),
]
이번 포스트에서는 viewset을 활용했기 때문에 이렇게만 작업해도
http://localhost:8000/boards/brd/ 이 url을 가지고 crud 작업이 가능합니다.
다만 update와 delete는 정상적으로 작동하려면 추가적인 보안 작업을 진행해야합니다.
그렇기에 이번 포스트에서는 create 와 read만 테스트를 진행하겠습니다.
Create Test
해당 테스트를 진행하려면 저번 글에서 진행했던 로그인 api 를 한 다음 token값을 가지고 있어야 합니다.
token은 앞서 jwt 설정을 'JWT_AUTH_HEADER_PREFIX': 'Bearer' 하였기 때문에 postman에서 Authorization의 Type을 Bearer token으로 지정해줘야 합니다.
그리고 로그인 api 얻은 token값을 아래 이미지 처럼 넣어주면 됩니다.
body는 아래 이미지처럼 작성 후 테스트를 진행하겠습니다.
아래 이미지 처럼 나오면 테스트 성공입니다.
Read Test
http://localhost:8000/boards/brd/ 해당 url을 get으로 아래 이미지 처럼 요청하면 됩니다.
http://localhost:8000/boards/brd/:id/ 뒤에 원하는 게시물의 id값을 붙여서 요청하면 해당 게시글의 데이터만 확인할 수 있습니다.
해당 포스트에서 작업한 코드는 github에 올려놨습니다.
설명이 부족하거나 잘못 작성된 부분이 있으면 피드백해주시면 감사하겠습니다.
매번 수동으로 토큰을 입력해줘야하나요..? 자동으로 토큰을 추가해주는 코드는 없는건가요? 만약에 그런 코드가 없다면 프론트와 연동시에 어떻게 토큰을 넘겨줘야할지 궁금합니다..