작업환경
- 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 |