Django에서 RestFramework 실행하기

김용녀·2022년 7월 31일
0
post-thumbnail

시작에 앞서, 저는 해당 글을 참조하여 실습하였습니다!.

들어가기에 앞서 Restful Api 개념에 대해 이해하고 실습하는것이 낫다고 생각한다.

Restful Api란?

간단히 말하면 웹에서 서버,클라이언트가 통신시 파일에 대한 어떤 요청사항이 필요한지 최적화된 방식으로 표현하도록 도와주는 개발자끼리의 약속이다.

해당 글해당영상 참조하면 자세하게 이해하는데 도움이 될것이다.

Django에서 rest_framework를 사용하는 이유

처음에 헷갈렸던것인데 Django에서 RestFramework 사용하지않고 그냥 View에서 if request == GET 문을 이용해서 api를 작성할수있다. 하지만 이런 경우에 model에서 꺼내오는 값을 뷰에서 queryset으로 받아버린다.
만약 프론트에서 다른 프레임워크를 이용한다면 쿼리셋을 받아서 이용하기에 난감해진다. 물론 장고 내에서 프론트까지 해결한다면 문제될것이 없다.
프론트에서 다른 프레임워크를 이용하려한다면,
Rest_framework를 이용해서 Model에서 꺼내오는값을 json으로 변환시켜 사용하면되는것이다.
이해가 안가신다면 해당글 을 참조해주세요

Django에서 RestFramework실행

우선 장고 프로젝트를 실행한 뒤 startapp을 통해 앱을 하나 실행시켜야한다.

python3 manage.py startapp api

장고에서 restfulApi를 쉽게 이용하도록 돕기위해 만든 djangorestframework를 깔아주자

pip install djangorestframework

그리고 이 두개를 djangoProject/settings.py에 있는 installed_app에 넣어주자

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'api',
]

우리가 사용할 post를 모델링을 하고,

from django.db import models
from django.contrib.auth.models import User


class Post(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=144)
    subtitle = models.CharField(max_length=144, blank=True)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return '[{}] {}'.format(self.user.username, self.title)

이제 Serializer라는 파일을 생성해야한다. 우리는 Django 에서 modeling후, 뷰에서 queryset으로 모델을 받은 후 템플릿에 넘길때, Html로 렌더링되면서 사용자에게 Response하게 된다.
하지만 RestfulApi에선 Json또는 Xml의 형태로 데이터를 보내야하기 때문에 queryset을 json,xml으로 매핑하는 작업이 필요하다. 그래서 Serializer를 하는것이다.

from rest_framework import serializers
from .models import Post
from django.contrib.auth.models import User

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User  
        fields = ('id', 'username', 'email')

class PostSerializer(serializers.ModelSerializer):
    user = UserSerializer(read_only=True)
    class Meta:
        model = Post
        fields = (
            'id',
            'title',
            'subtitle',
            'content',
            'created_at',
            'user',
        )
        read_only_fields = ('created_at',)

api/serializer.py 생성 후, rest_framework에서 serializers 임포트 작업이 필요하다
serializers.ModelSerializer 을 이용해 User와 Post를 serializer 시킨다
meta클래스에서 model을 설정하고 field를 설정해주면된다.

from rest_framework import viewsets
from .serializers import PostSerializer
from .models import Post
from rest_framework import permissions

class PostView(viewsets.ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer
    permission_classes = (permissions.IsAuthenticated,)
    def perform_create(self, serializer):
        serializer.save(user=self.request.user)

실질적으로 Serializer을통해 매핑시켜주는 뷰를 작성했다. Viewset을 이용해서 모델 하나를 컨트롤하는 CRUD를 1개 view로 구현시키려고한다.

  • 여기서, ViewSet이란?
    View에서 http를 처리하는 방식은 다양하다. 그 중 하나가 viewset이다. 중복코드를 없애는 방식으로 발전해왔고 해당 블로그에서 그 발전과정을 알기 쉽게 정리해놨으니 참고바랍니다.
from django.urls import path, include
from . import views
from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register('viewset',views.PostView)

urlpatterns = [
    path('',include(router.urls)),
]

라우팅을 이용해서 url매핑이 가능하다.

from django.contrib import admin
from django.urls import path, include
urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include('api.urls')),
]

프로젝트 urls.py파일에 include 후 migrate를 통해 저장시키면,


localhost:8000/api/viewset
접속시 확인할수 있다. 해당 링크는 장고에서 자체적으로 postman처럼 restfulapi작업을 돕기 위해 만든 페이지라 볼수있다.

profile
어서오세요

0개의 댓글