https://kimdoky.github.io/django/2018/07/12/drf-Serializerfields/

 

Django REST Framework - Serializer fields

on July 12, 2018 under django 26 minute read Django REST framework - Serializer fields “Each field in a Form class is responsible not only for validating data, but also for “cleaning” it — normalizing it to a consistent format.” “Form 클래스

kimdoky.github.io

File upload fields 참고

MultiPartParser FileUploadParser 찾아보자...

 

https://www.django-rest-framework.org/api-guide/parsers/

 

Parsers - Django REST framework

 

www.django-rest-framework.org

 

https://hyun-am-coding.tistory.com/entry/7-Parsers

 

7. Parsers

Parser 시스템 상호 작용 웹 서비스는 단순한 형식보다 복잡한 데이터를 전송하기 때문에 form-encoded보다 더 구조화된 form을 사용합니다. REST 프레임워크에는 다양한 미디어 유형의 요청을 수락할

hyun-am-coding.tistory.com

친절히 번역해주신 분을 찾았다. (난 영어를 못하니까)

 

http://daplus.net/python-django-rest-framework-%ED%8C%8C%EC%9D%BC-%EC%97%85%EB%A1%9C%EB%93%9C/

 

1. 들어가며

# (수정) 추후 설명하는 그림을 첨부할 예정입니다.

# 공부하며 쓰는 글이라 제일 좋은 방법이 아닐 것이며, 때로 부정확한 정보가 있을 수 있습니다.

 

지난 시간에는 DRF에서 가장 중요한 개념인 시리얼라이저를 이해하고 어떻게 와 작성하는지를 보았습니다.

이번 글에서는 DRF로 토큰 기반 회원 인증 / 가입 및 로그인을 구현해보도록 하겠습니다.

 

진행에 앞서 토큰 기반 인증에 대해 알 필요가 있습니다.

해당 개념에 대해서는 다음 블로그 링크를 첨부하는 것으로 넘어가겠습니다.

쉽게 알아보는 서버 인증 1편 - 이호연 블로그

 

또한, 요즘 서비스에서 소셜 인증을 안 쓸 수 없기 때문에

추후에 소셜 인증으로 해당 포스트를 그대로 다시 작성해보겠습니다.


2. django-rest-knox?

우리가 앞서 설치한 패키지인 django-rest-knox는

사용자 당 여러 개의 토큰을 지원하고 여러 보안 기술을 제공합니다.

 

앞서 설정했던 것처럼 settings.py의 INSTALLED_APPS에 knox를 넣어주셨다면,

아래 내용을 settings.py에 추가해야 합니다.

# mysite/settings.py
...
REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES": ("knox.auth.TokenAuthentication",),
}
...

3. 시리얼라이저 작성

다음 단계는 시리얼라이저 작성입니다.

# api/serializers.py
from rest_framework import serializers
from django.contrib.auth.models import User
from django.contrib.auth import authenticate

# 회원가입
class CreateUserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ("id", "username", "password")
        extra_kwargs = {"password": {"write_only": True}}

    def create(self, validated_data):
        user = User.objects.create_user(
            validated_data["username"], None, validated_data["password"]
        )
        return user


# 접속 유지중인지 확인
class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ("id", "username")


# 로그인
class LoginUserSerializer(serializers.Serializer):
    username = serializers.CharField()
    password = serializers.CharField()

    def validate(self, data):
        user = authenticate(**data)
        if user and user.is_active:
            return user
        raise serializers.ValidationError("Unable to log in with provided credentials.")

다른 시리얼라이저는 다 ModelSerializer로 작성하여 간단하게 처리하였고,

로그인의 경우 연결되는 모델이 없기 때문에 그냥 Serializer로 작성하였습니다.


4. 뷰 작성

다음은 views.py를 작성하겠습니다.

# api/views.py
from rest_framework import viewsets, permissions, generics, status
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.decorators import api_view
from knox.models import AuthToken
from .serializers import CreateUserSerializer, UserSerializer, LoginUserSerializer

# Create your views here.
@api_view(["GET"])
def HelloAPI(request):
    return Response("hello world!")


class RegistrationAPI(generics.GenericAPIView):
    serializer_class = CreateUserSerializer

    def post(self, request, *args, **kwargs):
        if len(request.data["username"]) < 6 or len(request.data["password"]) < 4:
            body = {"message": "short field"}
            return Response(body, status=status.HTTP_400_BAD_REQUEST)
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        user = serializer.save()
        return Response(
            {
                "user": UserSerializer(
                    user, context=self.get_serializer_context()
                ).data,
                "token": AuthToken.objects.create(user),
            }
        )


class LoginAPI(generics.GenericAPIView):
    serializer_class = LoginUserSerializer

    def post(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        user = serializer.validated_data
        return Response(
            {
                "user": UserSerializer(
                    user, context=self.get_serializer_context()
                ).data,
                "token": AuthToken.objects.create(user)[1],
            }
        )


class UserAPI(generics.RetrieveAPIView):
    permission_classes = [permissions.IsAuthenticated]
    serializer_class = UserSerializer

    def get_object(self):
        return self.request.user

이번 뷰는 generic 기반 클래스 뷰로 작성되었습니다.

우선 함수 기반 뷰에서 클래스 기반 뷰로 바뀌면서 수정된 점은

앞서 데코레이터로 미리 http 메소드를 정의해주었던 것을 클래스 안으로 넣었다는 것이 있습니다.

 

또한 제네릭 뷰의 경우에는

기본적인 기능을 모두 포함하는 뷰로, 자세한 설명은 추후에 첨부하겠습니다.


5. url 설정

마지막으로 url을 설정하면 완료됩니다.

# api/urls.py
from django.urls import path, include
from .views import HelloAPI, RegistrationAPI, LoginAPI, UserAPI

urlpatterns = [
    path("hello/", HelloAPI),
    path("auth/register/", RegistrationAPI.as_view()),
    path("auth/login/", LoginAPI.as_view()),
    path("auth/user/", UserAPI.as_view()),
]
```

```python
# mysite/urls.py
from django.urls import path, include
from django.contrib import admin

urlpatterns = [
    path("admin/", admin.site.urls),
    path("api/", include("api.urls")),
    path("api/auth", include("knox.urls")),
]

6. 여태까지 내용 확인해보기

백엔드 API 테스트를 위해 Insomnia 라는 툴을 다운 받아 사용할 수 있습니다.

여러가지 편한 기능이 있으니 사용하시면 좋고, 아니면 그냥 기본 제공 웹 페이지에서 진행해도 됩니다.

회원 가입이나 로그인의 경우 POST 요청으로 보내면 되며 다음과 같이 요청을 보내면 됩니다.

 

- 회원가입

- 로그인


7. Django 기본 유저 모델 확장하기

여기까지 진행한 회원 모델은 Django에서 기본적으로 제공하는 유저 모델입니다.

하지만 실제로 사용하고 싶은 유저 모델은 포인트나 주소 등 여러 부가적인 정보가 들어갈 수 있는 유저이어야 합니다.

따라서 기본 유저 모델을 확장해야 하는데, 확장하는 방법에는 여러가지가 있습니다.

Django의 사용자 모델을 수정해보자!

 

그중에서 제일 간단한 방법인

"프로필 모델 생성 후 one-to-one 연결" 방법을 사용하겠습니다.

(1) Profile 모델 생성

모델은 다음과 같이 정의하겠습니다.

내용 외 필요한 컬럼이 있다면 추가하시면 됩니다.

# api/models.py
from django.db import models

# Create your models here.
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver


class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    user_pk = models.IntegerField(blank=True)
    email = models.EmailField(max_length=500, blank=True)
    nickname = models.CharField(max_length=200, blank=True)
    point = models.IntegerField(default=0)
    like = models.CharField(max_length=200, blank=True)
    phone = models.CharField(max_length=200, blank=True)


@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance, user_pk=instance.id)


@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
    instance.profile.save()

여기서 @receiver로 작성된 함수들은 User 모델로부터 post_save라는 신호,

 

즉 User 모델 인스턴스 생성에 맞춰 Profile 모델 인스턴스 또한 함께 생성하라는 것입니다.

이로 인해 여러분이 처음 유저를 생성하고 username과 password만 입력해도 해당 사용자에 대한 Profile 인스턴스가 함께 생성 됩니다.

 

(2) Profile Serializer 생성

다음은 Profile 모델에 대한 시리얼라이저를 만들어보겠습니다.

기본적으로 프로필 정보 조회에 필요한 프로필 ModelSerializer가 필요합니다.

# api/models.py
from django.db import models

# Create your models here.
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver


class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    user_pk = models.IntegerField(blank=True)
    email = models.EmailField(max_length=500, blank=True)
    nickname = models.CharField(max_length=200, blank=True)
    point = models.IntegerField(default=0)
    like = models.CharField(max_length=200, blank=True)
    phone = models.CharField(max_length=200, blank=True)


@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance, user_pk=instance.id)


@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
    instance.profile.save()

 

(3) Profile View 생성

시리얼라이저를 만들었으니 뷰를 생성할 때입니다.

이번 뷰는 앞선 회원 관련 뷰와 동일하게 제네릭 뷰의 UpdateAPIView를 사용하며,

이로 인해 별도의 로직 작성 없이 간편하게 Update 기능을 구현할 수 있습니다.

# api/views.py
class ProfileUpdateAPI(generics.UpdateAPIView):
    lookup_field = "user_pk"
    queryset = Profile.objects.all()
    serializer_class = ProfileSerializer

 

(4) Profile url 설정

언제나 마지막 단계는 urls.py입니다.

프로필 업데이트에 대한 url을 제공하면 되며, 다음과 같이 작성할 수 있습니다.

# api/urls.py
from django.urls import path, include
from .views import HelloAPI, RegistrationAPI, LoginAPI, UserAPI, ProfileUpdateAPI

urlpatterns = [
    path("hello/", HelloAPI),
    path("auth/register/", RegistrationAPI.as_view()),
    path("auth/login/", LoginAPI.as_view()),
    path("auth/user/", UserAPI.as_view()),
    path("auth/profile/<int:user_pk>/update/", ProfileUpdateAPI.as_view()),
]

 

(5) 번외 admin에 Profile 등록

Django의 어드민 페이지에서 Profile 모델의 데이터를 보고 싶다면 admin.py에 등록해야 합니다.

또한 Profile 모델은 User 모델에 종속되어 있는 상황으로 User 인스턴스에 Profile 인스턴스가 포함되어 있는 형태로 보기 위해 다음과 같이 코드를 작성하여 등록합니다.

# api/admin.py
from django.contrib import admin

# Register your models here.
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.models import User
from .models import Profile


class ProfileInline(admin.StackedInline):
    model = Profile
    can_delete = False
    verbose_name_plural = "profile"


class UserAdmin(BaseUserAdmin):
    inlines = (ProfileInline,)


admin.site.unregister(User)
admin.site.register(User, UserAdmin)

 

(6) 결과 확인하기

이제 모든 개발을 마쳤으니 Profile 기능을 확인할 차례입니다.

Insomnia를 활용하여 테스트 해보겠습니다.

Django에서 update 기능을 사용할 때는 PUT 메소드로 요청을 보내야 합니다.

- User 생성 요청

- Profile 수정 요청

이제 어드민 페이지에서 확인해보겠습니다.

위처럼 superuser 외에 생성한 testuser1이 보이며,

이렇게 나오며 프로필 수정 또한 잘 된 것을 확인할 수 있습니다.


8. 마치며

여태까지 회원 가입 / 로그인 관련 API를 작성하였습니다.

 

사실 이렇게 하면 백엔드에서 할 역할은 얼추 끝이지만,

실제 웹 사이트를 만들어보지 않으면 이게 어떻게 되는지 이해할 수 없기 때문에

다음 시간에는 번외편으로 아주아주 간단한 프론트를 만들어서

실제로 회원가입하고 로그인하는 것을 구현해보겠습니다.


출처

https://devkor.tistory.com/entry/03-Django-Rest-Framework-%ED%9A%8C%EC%9B%90-%EC%9D%B8%EC%A6%9D-%EC%9C%A0%EC%A0%80-%EB%AA%A8%EB%8D%B8-%ED%99%95%EC%9E%A5%ED%95%98%EA%B8%B0

 

03. Django Rest Framework 회원 인증, 유저 모델 확장하기

들어가며 # (수정) 추후 설명하는 그림을 첨부할 예정입니다. # 공부하며 쓰는 글이라 제일 좋은 방법이 아닐 것이며, 때로 부정확한 정보가 있을 수 있습니다. 지난 시간에는 DRF에서 가장 중요한

devkor.tistory.com

 

1. Hello World 코드 설명

# (수정) 추후 설명하는 그림을 첨부할 예정입니다.

GET 127.0.0.1:8000/api/hello/

 

지난 시간에 해당 주소로 요청을 보내면 hello world를 print하는 api를 만들었습니다.

각 단계를 다시 따라가보며 세부적인 내용을 살펴보겠습니다.

 

첫번째 단계는 views.py를 작성하는 것입니다.

현재 사용하고 있는 view의 구조는 함수 기반 뷰, 이른바 FBV 입니다.

# api/views.py

from rest_framework.response import Response
from rest_framework.decorators import api_view

# Create your views here.
@api_view(['GET']) # 해당 함수 view에서 처리할 http 메소드
def HelloAPI(request):
    return Response("hello world!") # http response 형태로 return

 

views.py에서 다룬 내용은 그냥 Django에서 다룬 것과 크게 다를 것 없이,

요청을 받아 해당 요청에 대한 응답을 제공하는 기능을 합니다.

오늘 배우게 될 serializer와 함께 하면 어떻게 할 수 있는지 이따 알아보겠습니다.

 

그 다음은 api/urls.py 입니다.

# api/urls.py

from django.urls import path, include
from .views import HelloAPI

urlpatterns = [
    path("hello/", HelloAPI),
]

크게 특별할 것 없이 view에 있는 HelloAPI를 가져와 url로 할당시켰습니다.

path 사용을 권장한다는 것을 지난 시간에 말씀드렸습니다.


2. Serializer?

Serializer는 Django Rest Framework에서 나온 새로운 요소입니다.

사전적 의미는 직렬화 하는 무언가 정도로 볼 수 있습니다.

 

직렬화라는 말이 와닿지 않는데,

이는 간단하게 파이썬 데이터를 JSON 타입의 데이터로 변환해준다 정도로 생각하시면 됩니다.

 

기본적으로 웹에서 통신을 할 때, 즉 데이터를 주고 받을 때는 어느 정도 정해진 포맷이 있습니다.

대표적인 타입이 JSON이나 XML인데, 대부분의 REST API에서는 JSON으로 주고 받기 때문에

우리는 그냥 JSON만 잘 알고 있으면 됩니다:)

 

정확한 의미의 직렬화는 Django 프로젝트에서 내가 만든 모델로부터 뽑은 queryset,

즉 모델 인스턴스를 JSON 타입으로 바꾸는 것입니다.

 

기존 일반적인 Django에서의 폼과 같은 개념이라고 비유하는 경우가 있는데,

저는 그냥 Django 모델을 JSON으로 변환하기 위한 모양 틀 정도로 이해하고 있고 그게 제일 깔끔한 것 같습니다!

간단한 코드로 예를 들어보겠습니다.(게시판 프로젝트 코드가 아닙니다)

# test/models.py
from django.db import models
# 설명만을 위한 모델로, 상당히 대충 작성 되었습니다:)
class Person(models.Model):
    id = models.IntegerField()
    name = models.CharField()
    phone = models.CharField()
    addr = models.CharField()
    email = models.CharField()
# test/serializers.py
from rest_framework import serializers
from .models import Person

# ModelSerializer 뒤에서 설명합니다.
class BasePersonSerializer(serializers.ModelSerializer):
    class Meta:
        model = Person
        fields = ('id', 'name', 'phone', 'addr')

위에서 보시면 Person이라는 모델을 models.py에 만들고,

BasePersonSerializer라는 시리얼라이저를 serializers.py에 만들었습니다.(앱 내에 파일을 생성하셔야 합니다)

 

이게 어떤 뜻이냐면,

"내가 만든 Person이라는 모델에서 데이터를 뽑아서 응답으로 보낼텐데,

응답의 형태 중 하나인 Base 형태를 BasePersonSerializer라고 정의할게!" 라는 뜻입니다.

 

자세히 보시면 모델에는 email도 정의되어있는데 Base의 fields에는 email이 없습니다.

이는 개발자가 정의한 Base 형태에는 email이 없다는 뜻이죠.

그러면 사람의 이메일 정보를 요청할 때 쓸 수 있는 시리얼라이저는 어떻게 만들 수 있을까요?

# test/serializers.py
from rest_framework import serializers
from .models import Person

# ModelSerializer 뒤에서 설명합니다.
class EmailPersonSerializer(serializers.ModelSerializer):
    class Meta:
        model = Person
        fields = ('id', 'email')

이렇게 만들어 볼 수 있습니다.

 

이제 우리는 한 가지 깨달음을 얻을 수 있습니다.

시리얼라이저는 응답으로 보낼 데이터의 형태를 정해주는 하나의 틀과 같구나!


3. Serializer - View 연결하기

여기까지 잘 이해되셨다면 이후 단계에서는 더 잘 이해될 것입니다.

이제는 그럼 views.py에 실제로 시리얼라이저가 어떻게 사용되는지 알려드리겠습니다.

# test/views.py
from rest_framework.response import Response
from rest_framework.decorators import api_view
from .models import Person
from .serializers import BasePersonSerializer, EmailPersonSerializer

@api_view(['GET'])
def PersonAPI(request, id):
    now_person = Person.object.get(id=id)
    serializer = BasePersonSerializer(now_person)
    return Response(serializer.data)
# => id=1에 대해 리턴된 Response: {'id': 1, 'name': '태뽕', 'phone': '01012345678', 'addr': '주소주소'}

@api_view(['GET'])
def EmailAPI(request, id):
    now_person = Person.object.get(id=id)
    serializer = EmailPersonSerializer(now_person)
    return Response(serializer.data)
# => id=1에 대해 리턴된 Response: {'id': 1, 'email': 'email@email.com'}

어떠신가요 바로 이해가 되셨나요?

제가 시리얼라이저를 변환기, 모양 틀로 설명드린게 이런 맥락이었습니다.

 

각 view에서 무언가 데이터를 요청할 때,

지금 예시에서는 PersonAPI는 사람에 대한 데이터, EmailAPI에서는 이메일에 대한 데이터를 요청할 때 각각 원하는 형태로 응답해줘야 합니다. 하지만 모델은 하나니 필요한 데이터만 골라서 보내줘야겠죠?

이 역할을 해주는게 시리얼라이저라고 이해하시면 됩니다.

 

내가 보낼 데이터(now_person(즉, 모델 인스턴스))를 시리얼라이저에 넣어 변환시키고

그 데이터를 응답으로 보내주는 것이 시리얼라이저 - 뷰 연동 개념입니다.


4. ModelSerializer

앞서 진행한 코드에서 한가지 설명 안하고 그냥 넘어간 코드가 있습니다.

바로 시리얼라이저를 선언할 때 사용한 serializers.ModelSerializer입니다.

# test/serializers.py
# ModelSerializer 뒤에서 설명합니다.
class BasePersonSerializer(serializers.ModelSerializer):
    class Meta:
        model = Person
        fields = ('id', 'name', 'phone', 'addr')

원래 가장 기본적인 형태의 시리얼라이저 선언 방법은 serializers.Serializer를 상속 받는 것입니다.

이 형태로 선언하면 다음과 같이 코드를 작성할 수 있습니다.

# test/serializers.py
class BasePersonSerializer(serializers.Serializer):
    id = serializers.IntegerField()
    name = serializers.CharField()
    phone = serializers.CharField()
    addr = serializers.CharField()

    def create(self, validated_data):
        """
        검증한 데이터로 새 `Person` 인스턴스를 생성하여 리턴합니다.
        """
        return Snippet.objects.create(**validated_data)

    def update(self, instance, validated_data):
        """
        검증한 데이터로 기존 `Person` 인스턴스를 업데이트한 후 리턴합니다.
        """
        ...
        ...
        return instance

위에서 작성한 시리얼라이저보다 훨씬 길고 복잡해졌죠?

원래 시리얼라이저를 선언할 때는

1. 데이터 형태에 대한 필드(앞선 방법에서는 fields, 지금은 일일이 선언),

2. 그리고 그 데이터를 어떻게 처리할건지에 대한 메소드가 필요합니다.

 

이 메소드는 create나 update와 같이 이미 선언되어있는 메소드를 재작성하는 것이며,

views.py에서 직접 create나 update를 해야 할 것을 시리얼라이저에서 대신 해주는 것이라고 보면 됩니다.

대략 그런 역할을 선언해주고 필드에 대한 상세적인 내용을 직접 정의해야 했다면

 

serializers.ModelSerializer는 이 내용들을 알아서 해준 형태의 시리얼라이저라고 보시면 됩니다.

따라서 웬만하면 저희는 간편한 ModelSerializer의 형태로 선언하겠습니다. ★★


5. 마치며

여태까지 Django Rest Framework에서 가장 중요한 개념인 시리얼라이저에 대해 배웠습니다.

코드 작성 없이 보면서 따라가느라 조금 지루하셨을텐데,

다음 포스트에서는 이렇게 열심히 공부한 개념을 실제 게시판 프로젝트에 적용하겠습니다.

가장 첫 단계인 회원 인증부터 시작합니다:)


출처

https://devkor.tistory.com/entry/03-Django-Rest-Framework-Serializer-View-%EA%B0%9C%EB%85%90-%EC%9D%B5%ED%9E%88%EA%B8%B0?category=734691 

 

02. Django Rest Framework, Serializer, View 개념 익히기

Hello World 코드 설명 # (수정) 추후 설명하는 그림을 첨부할 예정입니다. GET 127.0.0.1:8000/api/hello/ 지난 시간에 해당 주소로 요청을 보내면 hello world를 print하는 api를 만들었습니다. 각 단계를 다시..

devkor.tistory.com

 

1. 시작하며

Python: 3.6.3
IDE: VS Code

본 포스트는 Django 튜토리얼은 해보았다는 가정 하에 작성되었습니다.
만약 Django가 아예 처음이라면 장고걸스튜토리얼을 먼저 해보시길 바랍니다.

 


2. Django 개발 환경 세팅

원활한 Django 개발을 위해서는 파이썬 가상환경 세팅이 필요합니다.

다음과 같은 명령어로 venv 생성 및 패키지 설치, 초기 세팅을 진행합니다.

$ mkdir Rest-CRUD
$ cd Rest-CRUD
$ python3 -m venv venv
$ source venv/bin/activate
$ (venv) pip install django
$ (venv) django-admin startproject mysite .
$ (venv) python manage.py startapp api

 

여기까지 진행했을 때 디렉토리 구조는 다음과 같습니다.

- Rest-CRUD
    - api
    - manage.py
    - mysite
    - venv

 

여기에 추가로 djangorestframework 패키지django-rest-knox를 설치하겠습니다.

djangorestframework는 당연하게도 Django Rest Framework를 위함이며,

django-rest-knox는 추후에 진행할 회원가입/인증에 사용될 패키지입니다.

$ (venv) pip install djangorestframework
$ (venv) pip install django-rest-knox

 

당장 쓸 패키지가 아닌데도 미리 설치한 이유는

settings.py를 한번에 건드리기 위함입니다(귀찮을테니ㅎㅎ).

# mysite/settings.py

ALLOWED_HOSTS = ['127.0.0.1']

INSTALLED_APPS = [
    ...
    'api',
    'rest_framework',
    'knox',
]

TIME_ZONE = 'Asia/Seoul'

 

위와 같이 앱을 등록하고 각종 설정을 마치면 migration 단계가 남았습니다.

$ (venv) python manage.py makemigrations
$ (venv) python manage.py migrate

 

여기까지 세팅이 완료되었다면 실행해봅시다!

$ (venv) python manage.py runserver

 

실행하여 로컬호스트 주소로 들어가면 잘 아는 Django 기본 화면이 나오게 됩니다.

여기까지는 그냥 Django 프로젝트랑 다를 바 없기 때문에 그래도 아주 간단한 api 하나 만들고 마치도록 하겠습니다.

GET 127.0.0.1:8000/api/hello/

 

해당 주소로 요청을 보내면

hello world를 print하는 api를 만들겠습니다.

 

첫번째 단계는 views.py를 작성하는 것입니다.

view를 작성하는 방법에는 여러가지가 있고 추후에 정리하겠으며, 지금은 그냥 하셔도 됩니다.

# api/views.py

from rest_framework import viewsets, permissions, generics, status
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.decorators import api_view

# Create your views here.
@api_view(['GET'])
def HelloAPI(request):
    return Response("hello world!")

 

그 다음 api/urls.py 파일을 만들겠습니다.

# api/urls.py

from django.urls import path, include
from .views import HelloAPI

urlpatterns = [
    path("hello/", HelloAPI),
]

마지막으로는 mysite/urls.py에 url을 등록하겠습니다.

(참고)

urls.py에서 urlpatterns를 작성하는 방법

최신버전부터 기존의 정규표현식으로 작성되던 url 기반에서 path 기반으로 변경되었으며

되도록 이 방식을 따르길 권장합니다.

# mysite/urls.py

from django.urls import path, include
from django.contrib import admin

urlpatterns = [
    path("admin/", admin.site.urls),
    path("api/", include("api.urls"))
    ]

이제 실행시키고, 127.0.0.1:8000/api/hello/ 로 접속하시면 다음과 같은 화면을 볼 수 있습니다.

와 처음 보는 형태의 화면이죠?

Django Rest Framework에서 기본적으로 제공하는 이 화면은

api 형태의 요청에 대한 응답을 다음과 같이 표시해줍니다.

api 테스트 툴 대신 충분히 사용할 만한 기능입니다.

 

여기까지 아주 간단하게 Django Rest Framework에 대한 감 잡기 및 설정까지 마쳤습니다.

다음 포스트에서는 위의 코드에 대한 조금 더 자세한 설명과 view를 작성하는 여러 방법에 대해 다뤄보겠습니다.


출처

https://devkor.tistory.com/entry/02-Django-Rest-Framework-%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-%EC%84%B8%ED%8C%85?category=734691

1. 프론트엔드와 백엔드

요즘 웹 개발의 흐름은 react.js, vue.js의 JS 기반 프론트엔드 프레임워크가 지배하고 있다고 느껴집니다.

웹 개발을 할 때 react.js나 vue.js 없이 개발하는 사례가 거의 없는거 같아요. 

(프론트를 거의 안해봐서 잘 모르겠지만)

워낙 쉽게 모든 걸 할 수 있고, 기존 jquery, js로 구현하기 어려웠거나 불편했던 것의 해결, 유지 보수 등이 좋아 인기가 많은 것 같습니다.

이러다 보니 웹을 만드는 프로젝트를 할 때(비즈니스 레벨 혹은 학교 팀 프로젝트 레벨이더라도)

프론트엔드 프레임워크를 담당하는 사람(들)이 꼭 있습니다.

짧은 식견으로는 라우팅이나 기존 새로고침을 통해 제공해야 했던 데이터의 변경을 프론트엔드에게 넘겨주고,

엔드에서는 그저 DB에 접근해 요청에 맞는 데이터를 제공하는 API 서버를 개발하도록 된 것으로 생각됩니다.

이렇게 개발하게 되면 얻을 수 있는 장점은 프론트엔드 개발자와 백엔드 개발자 간 협업이 상당히 쉬워진다는 것입니다. 프론트엔드 개발자는 UI나 로직을 구현하면 되고, 필요한 데이터가 발생한다면 백엔드 개발자가 만들어놓은 API를 가져다 쓰면 됩니다.

 

혼자 개발을 한다면 이 둘을 굳이 분리할 필요가 없겠지만,

개발자 둘이 한 몸이 되지 않는 이상 코드 공유부터 수정, 테스트까지 정말 불편한 일들이 많을 것입니다.

 

특히 백엔드의 API 서버는 단지 웹에만 적용되지 않고,

앱이나 여러 http 프로토콜로 통신하는 프로젝트에 그대로 적용될 수 있어 활용성이 정말 좋습니다. 

REST API가 API 개발에서 제일 대표적인 방법이며, 이에 대한 설명은 다른 분들이 더 잘해주셔서 이를 첨부하겠습니다.


2. 왜 Django Rest Framework??

REST API를 개발하기 위한 프레임워크는 정말 다양합니다.

최근 정말 인기 있는 node.js의 express, python의 flask, java의 spring boot까지.

정말 다양한 언어로 개발된 프레임워크들이 있고

모든 분야가 그렇듯 다 경험 해보고 본인이 쓰기 편한 것으로 개발하시면 됩니다.

저 또한 express, flask, 그리고 Django Rest Framework 이렇게 세 종류를 경험해보았고

이 중에서 Django Rest Framework를 주 활용 스택으로 선택한 이유는 다음과 같습니다.

 

(1) Django!

: Django의 가장 큰 장점은 "Django스럽다" 라고 말할 수 있습니다. 이게 무슨 뜻이냐 하면, 개발해야하는 여러 대표적인 기능들이 거의 모두 이미 개발되었으니 그냥 가져다 쓰면 된다는 것입니다. 처음엔 오히려 이것저것 복잡해서 낯설고 친해지는데 오래 걸릴 수 있지만, 나중에는 이미 구현된 이 기능 하나하나에 정말 큰 고마움을 느낄 것입니다.

 

(2) Django의 강력한 ORM

: Django를 사용하다보면 내가 데이터베이스를 쓰고 있던가 싶을 정도로 개발자가 쓰기 좋게 잘 추상화 되어있습니다. 상당히 python 스럽고 직관적인 방법으로 데이터에 접근, 필터링할 수 있으며, 다른 프레임워크로는 얻을 수 없는 경험이라고 생각됩니다.


3. 프로젝트 소개

본 프로젝트에서는 Django Rest Framework를 활용하여 게시판을 만들어보겠습니다.

게시판을 만들면서 당연히 CRUD를 구현하게 될 것이고, 이 과정을 시작하면서 최대한 다양한 방법을 제시하고 그 중에서 한 가지 방법으로 통일하여 쭉 작업할 예정입니다.

 

또한 항상 프로젝트의 시작이 되면서 은근 귀찮고 어려운 회원 가입 / 로그인 인증도 개발할 예정입니다.

당연히 코드도 깃헙을 통해 공유드립니다.

 

기왕이면 해당 프로젝트 하나만 쭉 따라하면서 공부해도 

Django Rest Framework를 여러분들이 마스터 할 수 있기를 바랍니다:)


출처

https://devkor.tistory.com/entry/01-%EB%93%A4%EC%96%B4%EA%B0%80%EB%A9%B0-Django-Rest-Framework%EB%A1%9C-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B0?category=734691

+ Recent posts