본문 바로가기
WEB/Django

Django 파이썬 웹 프로그래밍(6) API

by Guardy 2020. 7. 26.
728x90

저번 글에서 만든 TitleSearch API를 사용해보도록 하겠다.

우리는 urls.py에서 tsearch/ 로 들어왔을 때 views.py의 TitleSearch로 넘겨주었다.

TitleSearch는 다음과 같다.

class TitleSearch(APIView):

    def get(self, request, format=None):

        title_search = request.query_params.get('title_search', None)

        if title_search is not None:
            post = models.Post.objects.filter(title__contains=title_search)

            serializer = serializers.PostSerializer(post, many=True)

            return Response(data=serializer.data, status=status.HTTP_200_OK)

        else:

            return Response(status=status.HTTP_400_BAD_REQUEST)

TitleSearch는 get Method일 때, title_search라는 파라미터를 받아들여서 이를 이용해서 검색을 한다.

검색이 정상적으로 되는지 확인하기 위해 우리는 admin page에서 글을 세 개 정도 만들어보자.

만들었으니 parameter를 줘서 api 주소에 접속해보자.

http://127.0.0.1:8000/post/tsearch/?title_search=김가디

물론 브라우저에 다음과 같이 치면 한글을 urlencoding을 해주기 때문에 찾을 수 있으나

백엔드나 프론트엔드에서 api를 이용할 때는 urlencoding을 하여 다음과 같은 주소로 변경해야한다.

http://127.0.0.1:8000/post/tsearch/?title_search=%EA%B9%80%EA%B0%80%EB%94%94

접속하면 다음과 같이 뜬다.

rest framework를 쓰면 API를 사용할 때 다음과 같은 화면을 보여줘, 개발자에게 편리함을 제공한다.

어쨌든 API가 정상적으로 search_text가 포함된 title을 찾는 것을 확인할 수 있다. 

 

게시글을 올리는 API도 만들어보자.

views.py에 다음 소스코드를 추가한다.

class Post(APIView):
    def post(self, request, format=None):
        serializer = serializers.PostSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(data=serializer.data, status=status.HTTP_201_CREATED)
        else:
            return Response(data=serializer.errors, status=status.HTTP_400_BAD_REQUEST)

urls.py에 다음 소스코드를 추가하여 해당 url 접속 시 post api를 가르키도록 하자.

    url(
        regex=r'^post/$',
        view=views.Post.as_view(),
        name='post'
    ),

저장 후 http://127.0.0.1:8000/post/post/ url 접속 시 다음과 같은 화면이 뜬다.

우리가 GET은 정의하지 않았기 때문에 다음과 같은 에러코드가 뜨는 것이다.

아래의 Content에 json형태로 게시글 데이터를 보내면 게시글이 올라가는 지 확인을 해보자.

그 전에 Serializer를 다음과 같이 수정한다.

from rest_framework import serializers
from . import models

class CommentSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Comment
        fields = (
            'comment',
            'owner_nick',
            'created_at'
        )

class PostDetailSerializer(serializers.ModelSerializer):
    comments = CommentSerializer(many=True)
    class Meta:
        model = models.Post
        fields = (
            'title',
            'owner_nick',
            'comments',
            'text',
            'created_at',
        )

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Post
        fields = (
            'title',
            'owner_nick',
            'text',
            'created_at',
        )

PostDetailSerializer는 우리가 검색을 했을 때 댓글까지 보여주는 serializer이다.

PostSerializer는 게시글을 업로드할 때 사용하는 serializer이다.

또한 편리함을 위해 DateTimeField를 DateField로 수정해준 뒤 makemigration과 migrate를 통해 DB에 반영한다.

다음과 같이 입력하고 POST 해보자.

DB에 게시글이 올라갔는지 확인하기 위해 Admin Page로 이동해 확인해본다.

정상적으로 올라간 것을 확인할 수 있다.

댓글도 비슷하게 만들어주면 된다.

urls.py와 다음과 같이 추가

    url(
        regex=r'(?P<post_id>[0-9]+)/comments/$',
        view=views.CommentOnPost.as_view(),
        name='CommentOnPost'
    ),

view.py에 다음과 같이 추가

class CommentOnPost(APIView):

    def post(self, request, post_id, format=None):
        try:
            found_post = models.Post.objects.get(id=post_id)

        except models.Post.DoesNotExist:
            return Response(status=status.HTTP_404_NOT_FOUND)

        serializer = serializers.CommentSerializer(data=request.data)

        if serializer.is_valid():
            serializer.save(post=found_post)
            return Response(data=serializer.data, status=status.HTTP_201_CREATED)
        else:
            return Response(data=serializer.errors, status=status.HTTP_400_BAD_REQUEST)

댓글이 정상적으로 DB에 올라가고, 게시글도 향하는 것을 알 수 있다. 

728x90