작업환경

- Window10 WSL2(Ubuntu 20.04.3 LTS )

- Python 3.8.10

- Django 4.0.2

- Djangorestframework 3.13.1

 

<참고>

Ubuntu 버전확인 : lsb_release -a

장고 버전확인 : django-admin version

파이썬 버전확인 : python3 -V

Djangorestframework : pip show djangorestframework

 

본 문서는 윈도우10에 설치된 WSL2에서 작업한 내용입니다.

 

이 튜토리얼에서는 DRF를 사용하여 매우 간단한 Star Wars REST API를 만드는 방법을 살펴볼 것입니다. 튜토리얼이 끝나면 다음 4개의 API 엔드포인트가 실행되고 있어야 합니다.

  • /people/(GET/POST)
  • /people/{id}/(GET/PUT)
  • /species/(GET/POST)
  • /species/{id}(GET/PUT)

REST API가 완전히 작동하려면 총 5단계가 있습니다.

  • Django 및 DRF 설치 및 설정
  • Django 모델 설정
  • DRF 직렬 변환기 설정
  • 보기 및 URL 설정
  • API 사용

Django 및 DRF 설치 및 설정

django와 djangorestframework 설치합니다.

$ pip install django
$ pip install djangorestframework

Django 프로젝트와 앱을 생성합니다.

$ django-admin startproject my_django_project
$ cd my_django_project
$ django-admin startapp my_api

$ tree
.
├── manage.py
├── my_api
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
└── my_django_project
    ├── __init__.py
    ├── asgi.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

앱을 생성한 후 Framework에서 앱 구성에 대한 경로를 추가하여 앱을 등록합니다.

my_django_project/settings.py 파일에 rest_framework을  추가합니다.

INSTALLED_APPS = [
...
    'rest_framework',
    'my_api.apps.MyApiConfig'
]

runserverDjango 명령 을 사용하여 앱이 실행 중인지 확인합니다 .

$ python3 manage.py runserver
Watching for file changes with StatReloader
Performing system checks...
...
Django version 4.0.2, using settings 'my_django_project.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

브라우저로  http://127.0.0.1:8000/ 접속합니다. 아래와 같은 화면이 표시됩니다.

 

Django 모델 설정

my_api/models.py 파일에 Person 과 Species class를 추가합니다.

from django.db import models

class Species(models.Model):
   name = models.CharField(max_length=100)
   classification = models.CharField(max_length=100)
   language = models.CharField(max_length=100)

    #foreignkey 설정할 때 web에서 primary key의 name으로 보여주게됨. but db에는 id로 저장됨
    #아니면 primary key 그대로 1번 2번 이렇게 보임. 
    def __str__(self):
       return self.name
       
class Person(models.Model):
   name = models.CharField(max_length=100)
   birth_year = models.CharField(max_length=10)
   eye_color = models.CharField(max_length=10)
   species = models.ForeignKey(Species, on_delete=models.DO_NOTHING)

모델이 추가된 후 마이그레이션을 실행하여 Django가 데이터베이스에 2개의 새 테이블을 추가할 것임을 알려줍니다.

makemigrations  명령을 실행하여 migrations을 위한 my_api/migrations 디렉토리와 파일을 만듭니다.

$ python3 manage.py makemigrations
Migrations for 'my_api':
  my_api/migrations/0001_initial.py
    - Create model Species
    - Create model Person

migrate 명령을 실행하여 sqlite DB에 테이블들을 생성합니다.

$ python3 manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, my_api, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
... ...
  Applying my_api.0001_initial... OK
  Applying sessions.0001_initial... OK

DRF 직렬 변환기 설정

모델을 추가하고 테이블을 생성했으므로 이제 DRF에 모델을 직렬화합니다. 직렬 변환기는 Person 모델과 Species 모델을 API에서 사용자에게 데이터를 반환하는 데 사용할 JSON으로 변환합니다. 새 파일을 만들어 직렬 변환기를 추가합니다 my_aapi/serializers.py

from rest_framework import serializers
from my_api.models import Person, Species

class PersonSerializer(serializers.ModelSerializer):
   class Meta:
       model = Person
       fields = ('id', 'name', 'birth_year', 'eye_color', 'species')

class SpeciesSerializer(serializers.ModelSerializer):
   class Meta:
       model = Species
       fields = ('id', 'name', 'classification', 'language')

라우터 설정 및 API URL 생성

직렬 변환기가 생성된 후에는 API에 대한 view를 생성하고 Django URL에 연결합니다. 새 파일에서 생성한 각 모델에 대해 2개의 뷰 세트를 추가합니다. 뷰 세트는 여러 논리 세트를 단일 클래스로 결합해 줍니다.

my_api/views.py

from rest_framework import viewsets
from my_api.serializers import PersonSerializer, SpeciesSerializer
from my_api.models import Person, Species

class PersonViewSet(viewsets.ModelViewSet):
   queryset = Person.objects.all()
   serializer_class = PersonSerializer

class SpeciesViewSet(viewsets.ModelViewSet):
   queryset = Species.objects.all()
   serializer_class = SpeciesSerializer

뷰셋이 정의되면 이제 DRF에서 제공하는 라우터 기능을 사용하여 원하는 API 엔드포인트를 주어진 뷰셋으로 라우팅할 수 있습니다. 아래와 같이 새 파일을 만들고 라우터 구성을 추가합니다 . 

my_api/urls.py

from django.urls import include, path
from rest_framework import routers
from my_api.views import PersonViewSet, SpeciesViewSet

router = routers.DefaultRouter()
router.register(r'people', PersonViewSet)
router.register(r'species', SpeciesViewSet)

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

 

앱의 URL 파일을 가리 키도록 Django URL을 연결합니다.

my_django_project/urls.py

from django.urls import path, include

urlpatterns = [
   path('star-wars/', include('my_api.urls')),
]

라우터에 의해 생성된 URL에는 모든 API 메소드(GET, POST 및 PUT)가 있습니다. 라우터가 자동으로 URL을 핸들러 .get(), .list(), 및 .create()뷰셋에 매핑하기 때문입니다. API를 테스트하고 모든 것이 예상대로 작동하는지 확인합니다.

API 사용 시작

브라우저로 http://127.0.0.1:8000/star-wars/species/ 에 접속하면 API를 사용할 수 있습니다.

API를 사용하여 데이터를 데이터베이스에 추가합니다. 데이터가이 성공적으로 생성되면 서버는 아래와 같이 페이로드와 함께 201 성공 메시지로 응답합니다.

"Raw data" 탭을 사용하여 다른 데이터를 추가합니다.

 

http://127.0.0.1:8000/star-wars/people/ 접속하여 People API에 액세스할 수도 있습니다 . Person 모델에는 Species 모델에 대한 외래 키가 있으므로 Browsable API는 드롭다운을 제공합니다.

[POST] 버튼을 클릭하면 새로운 Person Dooku가 생성됩니다.

[Raw data] 탭을 사용하여 다른 사람을 추가해 보겠습니다. 그 사람에 대해 species의 id를 입력해야 합니다.

[POST] 버튼을 클릭하면 이제 데이터베이스에 새로운 Chewbacca 가 입력됩니다.

 

Chrome 브라우저에 JSONView 확장 프로그램을 설치하면 정리된 JSON을 볼 수 있습니다. 
모든 API 엔드포인트가 올바르게 작동하는지 확인합니다.

아래 내용을 브라우저에 입력한 후 접속하면 species 에 등록된 데이터를 조회할 수 있습니다.

http://127.0.0.1:8000/star-wars/species/?format=json

아래 내용을 브라우저에 입력하면 species의 id 가 1인 데이터를 조회할 수 있습니다.

http://127.0.0.1:8000/star-wars/species/1/?format=json

아래 내용을 브라우저에 입력하면 people 데이터를 조회할 수 있습니다.

http://127.0.0.1:8000/star-wars/people/?format=json

아래 내용을 브라우저에 입력하면 people의 id 가 1인 데이터를 조회할 수 있습니다.

http://127.0.0.1:8000/star-wars/people/1/?format=json

더 자세히 알아보려면 DRF 웹사이트의 문서를 확인합니다 .

React Memo를 사용한 방법에 대한 다른 GinkgoBits 튜토리얼을 확인합니다.

 

 

curl 명령어

 

* GET

아래 내용을 command line으로 실행하면 species 에 등록된 데이터를 조회할 수 있습니다.

curl -X GET http://127.0.0.1:8000/star-wars/species/?format=json

curl -X GET http://127.0.0.1:8000/star-wars/species/?format=json | jq
[
  {
    "id": 1,
    "name": "Human",
    "classification": "Mammal",
    "language": "Galactic Basic"
  },
  {
    "id": 2,
    "name": "Wookie",
    "classification": "Mammal",
    "language": "Shyniwook"
  }  
  ]

아래 내용을 command line으로 실행하면 species 에 등록된 id가 1인 데이터를 조회할 수 있습니다.

curl -X GET http://127.0.0.1:8000/star-wars/species/1/?format=json

 

아래 내용을 command line으로 실행하면 people 에 등록된 데이터를 조회할 수 있습니다.

curl -X GET http://127.0.0.1:8000/star-wars/people/?format=json

 

아래 내용을 command line으로 실행하면 people 에 등록된 id가 1인 데이터를 조회할 수 있습니다.

curl -X GET http://127.0.0.1:8000/star-wars/people/1/?format=json

 

httpie 명령어로도 수행할 수 있습니다.

아래 명령어를 수행하면  species 에 등록된 데이터를 조회할 수 있습니다.

$ http GET 127.0.0.1:8000/star-wars/species/
HTTP/1.1 200 OK
Allow: GET, POST, DELETE, HEAD, OPTIONS
... ...
X-Content-Type-Options: nosniff
X-Frame-Options: DENY

[
    {
        "classification": "Mammal",
        "id": 1,
        "language": "Galactic Basic",
        "name": "Human"
    },

 

* POST

curl POST 명령어로 데이터를 등록합니다. 아래 명령어를 수행하면 species 에 데이터를 추가합니다.

$ curl -X POST -H "Content-Type: application/json" -d '{"name":"R2","classification":"robot", "language":"droid language"}' http://127.0.0.1:8000/star-wars/species/

{"id":6,"name":"R2","classification":"robot","language":"droid language"}

httpie 명령어로도 데이터를 등록할 수 있습니다.

아래 명령어를 수행하면 species 에 데이터를 추가합니다.

http POST http://127.0.0.1:8000/star-wars/species/ name=3pio classification=robot language="droid language"

$ http POST http://127.0.0.1:8000/star-wars/species/ name=3pio classification=robot language="droid language"
HTTP/1.1 201 Created
Allow: GET, POST, DELETE, HEAD, OPTIONS
... ...
X-Frame-Options: DENY

{
    "classification": "robot",
    "id": 8,
    "language": "droid language",
    "name": "3pio"
}

 

 

 

 

 

 

'장고(Django)' 카테고리의 다른 글

Django framework (2)  (0) 2022.02.15
Python + Django 사용법  (0) 2022.02.09
장고란 무엇인가요?  (0) 2022.01.06

+ Recent posts