DRF로 api 서버 개발(2) - 게시글

Dongwon Ahn·2020년 7월 20일
4

DRF로 API Server 개발

목록 보기
3/8
post-thumbnail

앞서 진행했던 회원관련 api는 apiview를 활용했습니다.
이번 포스트에서는 viewset을 활용해서 api를 만들어보겠습니다.

게시글 관련 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')
  • 여기서 id는 django에서 모델 생성할 때 자동으로 생성되는 것입니다. 추후 프론트쪽에서 조회할 수 있도록 같이 보여지게 fields에 추가해놨습니다.

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)
  • [permissions.IsAuthenticatedOrReadOnly] 인증없으면 read 작업만 가능하도록 permissions을 설정합니다.
  • ModelViewSet에서 create는 CreateModelMixin를 가져와서 사용합니다. (참고)
  • 추후 create요청할때 body 정보에 author 데이터가 없기 때문에 perform_create를 가져와서 위와 같이 수정합니다.

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만 테스트를 진행하겠습니다.

API 테스트

Create Test
해당 테스트를 진행하려면 저번 글에서 진행했던 로그인 api 를 한 다음 token값을 가지고 있어야 합니다.

token은 앞서 jwt 설정을 'JWT_AUTH_HEADER_PREFIX': 'Bearer' 하였기 때문에 postman에서 Authorization의 Type을 Bearer token으로 지정해줘야 합니다.

그리고 로그인 api 얻은 token값을 아래 이미지 처럼 넣어주면 됩니다.

body는 아래 이미지처럼 작성 후 테스트를 진행하겠습니다.
아래 이미지 처럼 나오면 테스트 성공입니다.

  • 여기서 author는 작성자의 user pk 값이며, id값은 해당 게시글의 pk 값입니다.

Read Test
http://localhost:8000/boards/brd/ 해당 url을 get으로 아래 이미지 처럼 요청하면 됩니다.

  • 앞서 PAGINATION 작업을 했기 때문에 최대 10개까지 나옵니다.

http://localhost:8000/boards/brd/:id/ 뒤에 원하는 게시물의 id값을 붙여서 요청하면 해당 게시글의 데이터만 확인할 수 있습니다.


해당 포스트에서 작업한 코드는 github에 올려놨습니다.
설명이 부족하거나 잘못 작성된 부분이 있으면 피드백해주시면 감사하겠습니다.

profile
Typescript를 통해 풀스택 개발을 진행하고 있습니다.

4개의 댓글

comment-user-thumbnail
2021년 3월 25일

매번 수동으로 토큰을 입력해줘야하나요..? 자동으로 토큰을 추가해주는 코드는 없는건가요? 만약에 그런 코드가 없다면 프론트와 연동시에 어떻게 토큰을 넘겨줘야할지 궁금합니다..

1개의 답글