https://vicapor.tistory.com/107

 

Django Ninja Tutorial 2

https://vicapor.tistory.com/7 Django Ninja Tutorial 1 Django Ninja 공식 페이지 : https://django-ninja.rest-framework.com/ 장고 닌자는 FAST API에서 영감을 받아서 만들어진 Web FrameWork이다. 빠른속도..

vicapor.tistory.com

Django Ninja Tutorial 2편에 이은 3편이다. 오늘은 API CRUD를 구현해보는 튜토리얼이다. 

 

 

1. POST Method

@api.post("/tracks", response={201: TrackSchema})
def create_track(request, track: TrackSchema):
    track = Track.objects.create(**track.dict())
    return track

Json으로 이루어진 데이터가 정상적으로 통신되었을 때, 201를 응답해주고 Schema의 검증을 통해서 데이터 형식을 확인하고 데이터를 만들어준다. 

 

 

2. PUT Method

@api.put("/tracks/{track_id}", response={200: TrackSchema, 404: NotFoundSchema})
def change_track(request, track_id: int, data: TrackSchema):
    try:
        track = Track.objects.get(pk=track_id)
        for attribute, value in data.dict().items():
            setattr(track, attribute, value)
        track.save()
        return 200, track
    except Track.DoesNotExist as e:
        return 404, {"message": "Track does not exist"}

수정은 먼저 track_id를 통해 수정할 데이터를 가져오고 수정할 데이터를 data에 TrackSchema를 통해 검증한다. 

그리고 setattr을 통해 atrribute와 value를 딕셔너리 형태(Json)로 저장해놓는다. 

 

201: 성공, 400: 문제

 

 

3. DELETE Method

@api.delete("/tracks/{track_id}", response={200: None, 404: NotFoundSchema})
def delete_track(request, track_id: int):
    # curl -X DELETE http://localhost:8000/api/tracks/7729
    try:
        track = Track.objects.get(pk=track_id)
        track.delete()
        return 200
    except Track.DoesNotExist as e:
        return 404, {"message": "Could not find track"}

delete method는 검증할 데이터가 없기 때문에 track을 리턴하지 않는다.

response는 응답 온 데이터 즉 return 한 데이터를 의미한다. 검증할 리턴 값이 없기 때문에 None으로 설정해준다.

'Back-End > Django-ninja' 카테고리의 다른 글

Django Ninja Render  (0) 2021.11.30
Django Ninja Tutorial 5  (0) 2021.11.30
Django Ninja Tutorial 4  (0) 2021.11.30
Django Ninja Tutorial 2  (0) 2021.11.29
Django Ninja Tutorial 1  (0) 2021.07.09

https://vicapor.tistory.com/7

 

Django Ninja Tutorial 1

Django Ninja 공식 페이지 : https://django-ninja.rest-framework.com/ 장고 닌자는 FAST API에서 영감을 받아서 만들어진 Web FrameWork이다. 빠른속도와 쉬운 사용법 Swagger 기능 지원을 제공하고 있다. 아직..

vicapor.tistory.com

 

1편에서 이어진 튜토리얼 2이다. 1편을 먼저 확인하고 2편을 진행하면 된다. 이번 튜토리얼에서는 GET 메소드를 구현해보는 시간을 갖는다. 

 

 

1. schema.py 작성

tracks/schema.py 를 생성해주고 아래 코드를 입력해준다.

from datetime import datetime
from ninja import Schema


class TrackSchema(Schema):
    title: str
    artist: str
    duration: float
    last_play: datetime
    

class NotFoundSchema(Schema):
    message: str

이것이 Django Ninja에서 말했던 Pydantic Data Validation을 말한다. 필드에 정확한 값이 전달되는지 검증하기 위해서 사용한다. 각 field의 변수 타입을 명시해주는 것을 통해 잘못된 데이터 값이 들어오는 것을 방지한다. 

 

 

2. api.py 수정

 

1) 모든 데이터 GET

from typing import List

from ninja import NinjaAPI
from tracks.models import Track
from tracks.schema import TrackSchema, NotFoundSchema


api = NinjaAPI()

@api.get("/tracks", response=List[TrackSchema])
def tracks(request):
    return Track.objects.all()

사용방법은 아주 간단하다. 데코레이터를 통해 메소드를 표시한다. get 메소드를 통해 모든 track의 정보를 가져와보겠다. tracks라는 이름의 함수로 Track 모델의 모든 데이터을 return 한다. 

 

response=List[TrackSchema]는 1에서 작성한 Schema의 자료 값을 검증한다음 List로 반환한다. 

 

참고)

typing에 대해 더 알아보고 싶다면 아래 사이트를 참고하면 된다. 

https://www.daleseo.com/python-typing/

 

 

2) 원하는 데이터를 id값으로 GET

@api.get('/tracks/{track_id}', response={200: TrackSchema, 404: NotFoundSchema})
def track(request, track_id: int):
    try:
        track = Track.objects.get(pk=track_id)
        return track
    except Track.DoesNotExist as e:
        return 404, {"message": "Track does not exist"}

{track_id}를 통해 원하는 데이터의 정보를 가져올 수 있다. track_id는 정수가 들어가야 하므로 track_id: int를 명시 해준다.

 

(1) 데이터가 존재할 때 (정상적인 통신 : 200) -> TrackSchema을 실행한다.

(2) 데이터가 존재하지 않을 때 (잘못된 통신 :  404) -> NotFoundSchema

 

try, except를 사용해서 데이터가 존재할 때, Track에 pk 값을 통해 원하는 데이터를 반환하고 존재하지 않을 때, messeage에 Track does not exist라는 메세지를 담아서 404와 같이 return한다. 

 

 

3) 특정 정보를 통해 원하는 데이터 GET

@api.get("/tracks", response=List[TrackSchema])
def tracks(request, title: Optional[str] = None):
    if title:
        return Track.objects.filter(title__icontains=title)
    return Track.objects.all()

1) 에서 작성한 tracks를 수정해주자. 

이제 ?title을 통해 title로 데이터를 가져올 수 있다. 항상 title이 포함되지 않기 때문에 Optional로 설정한다. 

title__icontains을 통해 title의 일부 문자만으로 데이터를 가져올 수 있게 한다.

 

 

'Back-End > Django-ninja' 카테고리의 다른 글

Django Ninja Render  (0) 2021.11.30
Django Ninja Tutorial 5  (0) 2021.11.30
Django Ninja Tutorial 4  (0) 2021.11.30
Django Ninja Tutorial 3  (0) 2021.11.29
Django Ninja Tutorial 1  (0) 2021.07.09

Django Ninja 공식 페이지 : https://django-ninja.rest-framework.com/

 

장고 닌자는 FAST API에서 영감을 받아서 만들어진 Web FrameWork이다. 

빠른속도와 쉬운 사용법 Swagger 기능 지원을 제공하고 있다. 

아직 초기 버전이지만 서비스를 하기에는 무리가 없다. 

 

Django Ninja는 Python 3.6버전 이상부터 지원한다. 

 

Pydantic을 사용한다. (데이터 값의 검증을 위해 사용한다. 클라이언트에서 서버로 보낸 데이터가 실제로 필드의 형식에 맞는지 확인하는 절차이다.)

 

async support 비동기를 지원한다.

 

공식문서에 있는 영상 튜토리얼을 통해 Django Ninja의 사용방법을 정리해본다. 

참고 영상 : Django Ninja Tutorial

 

 

1. 프로젝트 생성

 

 

1) 장고 닌자를 설치한다.

pip install django-ninja

 

 

2) 실습을 진행할 Django 프로젝트를 만든다.

django-admin startproject djninja

 

 

3) 실습에 필요한 tracks app을 만든다. 

python manage.py startapp tracks

 

 

4) settings.py 수정

INSTALLED_APPS = [
	....
    
    'tracks',
]

 

 

2. 간단한 테스트

 

 

1) tracks/api.py

from ninja import NinjaAPI

api = NinjaAPI()

@api.get("/test")
def test(request):
	return {"test": 'success'}

api를 구현할 app폴더에 api.py를 생성하고 테스트를 위해 위와 같이 작성한다. 

Django Ninja를 사용할 api라는 이름의 객체를 만들어 주었다. 

데코레이터를 통해 @api.method("접속할 url") 형식으로 적는다. 

POST POST를 통해 해당 URI를 요청하면 리소스를 생성합니다.
GET GET를 통해 해당 리소스를 조회합니다. 리소스를 조회하고 해당 도큐먼트에 대한 자세한 정보를 가져온다.
PUT PUT를 통해 해당 리소스를 수정합니다.
DELETE DELETE를 통해 리소스를 삭제합니다.

출처 : https://meetup.toast.com/posts/92

 

 

2) djninja/urls.py

...
from tracks.api import api

urlpatterns = [
	...
    path('api/', api.urls),
]

urls.py에 api 서버경로를 추가해준다. 

 

 

3) migration을 진행해준다. 

python manage.py makemigrations & python manage.py migrate

 

 

4) 서버 실행, 테스트

python manage.py runserver

서버가 실행되었으면 127.0.0.1/api/test/ 로 접속하면 "test" : 'success'를 확인할 수 있을 것이다. 

 

 

3. 실습

 

 

1) 실습에 필요한 데이터와 코드 가져오기

https://github.com/bugbytes-io/django-ninja-v1 

위 git hub로 들어가서 밑에 적어놓은 코드와 데이터를 복사해서 똑같은 구조로 만들어 준다. 

(1) data/tracks.json

(2) tracks/management/__init__.py, ingest_tracks.py

 

(똑같은 구조로 만들 것이기 때문에 폴더까지 그대로 가져와도 된다.)

 

 

2) tracks/models.py 작성

from django.db import models

class Track(models.Model):
    title = models.CharField(max_length=250)
    artist = models.CharField(max_length=250)
    duration = models.FloatField()
    last_play = models.DateTimeField()

 

 

3) migration 진행

python manage.py makemigrations & python manage.py migrate

 

 

4) ingest_tracks.py를 통해 tracks.json에서 데이터 추출

python manage.py ingest_tracks

 

 

튜토리얼 2에서 이어집니다.

 

'Back-End > Django-ninja' 카테고리의 다른 글

Django Ninja Render  (0) 2021.11.30
Django Ninja Tutorial 5  (0) 2021.11.30
Django Ninja Tutorial 4  (0) 2021.11.30
Django Ninja Tutorial 3  (0) 2021.11.29
Django Ninja Tutorial 2  (0) 2021.11.29

+ Recent posts