Seongwon Lim

[Django] Rest framework 다루기 (1) 본문

Django

[Django] Rest framework 다루기 (1)

limsw 2022. 5. 9. 21:08
반응형

What is DRF?

DRF는 Django Rest Framework의 약자로 장고 REST 프레임워크는 웹 API를 구축하기 위해 장고에서 제공하는 강력한 프레임워크이다. 해당 포스팅 글은 장고가 설치되어 있다는 가정 하에 진행되는 글이므로 장고가 미설치된 경우 pip install django명령어를 통해 장고를 먼저 설치한다.

1. 가상 환경 세팅하기

먼저 프로젝트를 수행할 디렉토리를 생성한 뒤 파이썬 가상환경을 구성한다.

가상 환경이란 하나의 PC에서 프로젝트 별로 독립된 파이썬 실행 환경을 구성하는 것이다. 가상 환경을 사용하지 않으면 PC 내의 모든 프로젝트에서 운영체제에 설치된 하나의 파이썬 런타임을 사용하고 패키지를 공유한다.

 

패키지의 공유는 프로젝트 간 모듈 의존성을 높이고 이는 패키지 버전 간 충돌이 발생을 초래할 수 있다. 이를 방지하고자 파이썬은 가상 환경을 제공하여 프로젝트 별로 별개의 환경을 구성할 수 있도록 돕고 있다.

 

가상 환경 구성 방법은 다음과 같다.

  • python3 -m venv venv 혹은 python -m venv venv 명령어를 입력하면 venv 라는 폴더가 생성된다.
  • 가상 환경을 활성화 시키려면 source venv/bin/activate 명령어를 입력하면 된다.

2. 장고 프로젝트 생성하기

  • django-admin startproject account
  • cd account
  • django-admin startapp login

account라는 이름의 프로젝트를 생성하고 login라는 이름의 앱을 생성했다.

3. settings.py 수정하기

구성한 login 앱 사용을 위한 account/settings.py 파일을 수정한다.

INSTALLED_APPS = [
		...
    'login.apps.LoginConfig' # 추가
]

4. 데이터베이스 생성을 위한 migrate

  • python3 manage.py migrate

기본 세팅의 경우 db.sqlite3 파일이 생성된다. (sqlite3 데이터베이스는 앱과 같이 응용 프로그램에서 사용하는 가벼운 관리형 데이터베이스이다.)

5. 모델 정의하기

API 로 제공할 모델을 생성하기 위해 login/models.py 안에 다음과 같이 모델을 정의한다.

from django.db import models

# Create your models here.
class Account(models.Model):
    name = models.CharField(max_length=50)
    email = models.CharField(max_length=200)
    password = models.CharField(max_length=200)
    created_at = models.DateTimeField(auto_now_add=True)
		
    def __str__(self):
        return self.name
  • __str__ : 해당 함수는 인스턴스를 콘솔에 출력할 때 출력될 인스턴스를 정의한다.

6. 모델을 DB에 반영하기 위한 마이그레이션(migrations)

데이터베이스에 모델을 반영할 수 있도록 변경된 내용을 감지하여 데이터베이스에 적용하는 makemigration 명령을 수행한다.

  • python3 manage.py makemigrations

그리고 python3 manage.py migrate 명령어를 한번 더 수행하여 모델을 데이터베이스에 적용한다.

7. Django admin 관리자 사용하기

장고는 admin 기능을 제공해준다. 해당 기능을 이용하면 간편하게 데이터베이스의 CRUD를 제어할 수 있다.

django admin을 사용하기 위해서는 슈퍼 유저 가 필요하다. 슈퍼 유저는 python3 manage.py createsuperuser 명령어를 이용하여 생성할 수 있다.

패스워드를 admin1234로 설정 했는데 이름과 비슷하다는 경고 문구가 나왔다.
하지만 실제 프로젝트를 구현하는 것은 아니므로 무시한 뒤 admin 계정을 생성했다.

사이트에 접속하기 위해서는 login/admin.py 파일을 수정해야 한다.

from django.contrib import admin
from login.models import Account

# Register your models here.
admin.site.register(Account)

8. 장고 서버 실행하기

이제 서버를 실행해보자. python3 manage.py runserver 명령어로 서버를 실행할 수 있다. 기본 포트는 8000번 포트이다.

localhost:8000 접속 결과

장고에서 제공하는 기본 화면이 나타난다. admin 페이지로 이동하기 위해서는 뒤에 admin 경로를 붙이면 된다.

localhost:8000/admin 접속 결과

이전에 생성한 슈퍼 유저 계정을 이용해서 페이지에 접속할 수 있다.

관리자 페이지에 접속한 모습이다. LOGIN 앱에 Accounts 모델이 생성된 것을 확인할 수 있다.

9. Serializer 적용하기

Serializer는 Queryset, Model, Instance 등의 복잡한 데이터를 JSON, XML등의 타입으로 쉽게 변환 가능한 데이터 타입으로 변경시켜주는 모듈이다.

Serializer를 사용하면 유효성 검사, Queryset에서의 데이터 불러오기 등의 기능을 효율적으로 수행할 수 있다. 설치 방법은 다음과 같다.

  • pip3 install djangorestframework

모듈을 설치한 뒤 settings.py 파일에 rest framework를 다음과 같이 추가한다.

INSTALLED_APPS = [
		...
    'rest_framework',
]

그 다음으로 REST 프레임워크에 우리 모델을 어떻게 serialize 해야할 지 정의하기 위해  login/serializers.py 에 아래와 같이 코드를 작성한다.

from rest_framework import serializers
from .models import Account

class AccountSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Account
        fields = ('id', 'name', 'email', 'password', 'created_at')
  • fields를 모두 정의하고 싶을 때에는 fields = '__all__'으로 정의한다.

10. Viewset 만들기

Viewset은 여러 가지 API의 기능을 통합해서 하나의 API 세트로 제공하는 것이다. Viewset을 이용하면 중복 되는 코드를 줄일 수 있어 코드의 효율성을 높일 수 있다.

이번 글에서는 Viewset을 이용한 CRUD는 상세히 다루지 않으며 GET요청을 위한 간단한 구성 방법만 다룰 예정이다.

 

먼저 데이터 전달 및 API 기능을 담당하는 뷰를 정의한다. Account 모델에 있는 서로 다른 인스턴스들을 보여주기 위해선 우선 모든 Account 인스턴스를 쿼리하고 이를 Serializer 할 수 있어야 한다. 그러므로 다음과 같이 login/views.py 를 정의한다.

from django.shortcuts import render

# Create your views here.
from rest_framework import viewsets

from .serializers import AccountSerializer
from .models import Account

class AccountViewSet(viewsets.ModelViewSet):
    queryset = Account.objects.all()
    serializer_class = AccountSerializer

뷰를 구성한 뒤 url 연결을 위해 account/urls.py 파일을 다음과 같이 수정한다.

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

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('login.urls'))

]

login 앱의 url을 프로젝트의 url에 매핑한다는 의미이다.

다음으로 login 앱에 urls.py 파일을 생성 후 다음과 같이 작성하여 url과 view를 연결한다.

# login/urls.py
from django.urls import include, path

from rest_framework import routers
from . import views

router = routers.DefaultRouter()
router.register(r'accounts', views.AccountViewSet)

urlpatterns = [
    path('', include(router.urls)),
    path('api-auth/', include('rest_framework.urls', namespace="rest_framework"))
]

이제 서버를 실행하여 REST API를 테스트 할 수 있다.

  • python3 manage.py runserver 명령어를 이용해서 서버를 실행한다.

결과 확인하기

localhost:8000 으로 들어온 화면

localhost:8000/accounts 으로 들어온 화면


Rest framework 홈페이지를 이용해서 바로 데이터베이스에 데이터를 추가할 수 있다.

2개의 데이터를 추가한 뒤 localhost:8000/accounts 경로로 GET 요청을 보내면 다음과 같이 결과를 얻을 수 있다.


또한 localhost:8000/accounts/1 경로로 GET 요청을 보내면 id=1에 해당하는 유저 정보를 가져올 수 있다.

현재 수행한 결과들은 사용자의 모든 정보를 나타내고 있다. 그러나 패스워드와 같이 민감한 정보는 외부로 노출시키면 보안에 위험이 있으므로 포함하지 않아야 한다.

위에서 serializers.py 파일을 다룰 때 fields에 어떤 인스턴스를 담을 지 정했기 때문에 해당 부분에서 password를 제거한 뒤 다시 요청을 보내보면 password를 제외한 인스턴스가 응답으로 오는 것을 확인할 수 있다.

# serializers.py
fields = ('id', 'name', 'email', 'created_at') # password를 제거

출처

 

'Django' 카테고리의 다른 글

[Django] Rest framework 다루기 (2)  (0) 2022.05.09
[Django] CORS 에러 해결하기  (0) 2022.05.07
Comments