Django Ninja 실습-Uploading Files, 스키마 정의 방법

배추·2025년 9월 7일
0

🥷 Django

목록 보기
6/6

Django Ninja에서 file을 업로드하는 방법과 스키마 정의 방법에 대해 알아봅니다.


▶︎Uploading Files

템플릿

  • traks/templates/index.html 생성
<body>
    <h1>Uploading Files</h1>

    <form method="post" action={% url 'api-1.0.0:upload' %} enctype="multipart/form-data">
        <input type="file" name="file">
        <button type="submit">Submit</button>
    </form>
    
</body>
  • action={% url 'api-1.0.0:upload' %}
    • Django url 템플릿 태그 {% url ... %} 사용.
    • URL 이름 'api-1.0.0:upload'를 참조해 실제 URL 경로(문자열)로 변환.
      • 네임스페이스(api-1.0.0)와 URL 이름(upload) 조합
    • 즉, 이 태그는 'api-1.0.0:upload'라는 이름으로 등록된 URL 경로를 찾아서 HTML에 그 경로로 바꿔서 넣어줍니다.
  • enctype="multipart/form-data"
    • 파일 업로드 시 꼭 필요한 인코딩 타입.
    • 지정하지 않으면 파일이 전송되지 않음.
  • <input type="file" name="file">
    • 사용자가 파일을 선택하는 입력 필드.
    • 서버에서 이 이름(file)으로 파일을 받음.

views.py

from django.shortcuts import render

def index(request):
    return render(request, 'index.html')
  • index.html 렌더링.

urls.py

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', api.urls),
    path('index/', index, name='index'), # index 페이지 라우팅
]

api.py: 파일 업로드 엔드포인트

@api.post('/upload', url_name='upload') 
# 데코레이터에 url_name 매개변수를 전달 
# index.html 파일에서 사용
def upload(request, file: UploadedFile = File(...)):
    data = file.read().decode()
    return {'name': file.name, 'data': data}
  • 데코레이터에 url_name 매개변수를 전달.
    • url_name 옵션은 템플릿에서 URL 참조가 가능하게 한다.
  • file: UploadedFile = File(...)
    • 클라이언트가 보낸 파일을 받음. (Django Ninja 방식)
  • .read()
    • 업로드된 파일 내용을 바이트로 모두 읽어 메모리로 가져온다.
  • .decode()
    • 바이트를 문자열로 변환 (인코딩 주의)

+) Django와 Django Ninja 방식의 차이

Django 전통 URL 네임스페이스와 이름

  • urls.py에서 url 경로에 이름 지정 가능.
    • path('upload/', upload, name='upload')
  • 템플릿 {% url 'upload' %} → 'upload/' 경로로 변환.
  • 네임스페이스(예: 'blog:detail')를 사용하면 앱별 URL 이름 중복 방지 가능.
    • 네임스페이스와 이름 조합으로 정확한 URL 참조.

Django Ninja 방식

  • Django Ninja는 URL 라우팅을 데코레이터 기반으로 한다.
    • @api.post('/upload', url_name='upload')
  • url_name='upload' 옵션으로 URL 경로가 아닌 이름 지정.
  • 템플릿에서 {% url 'upload' %}로 참조 가능.

▶︎Django Ninja에서 스키마 정의 방법

1. Schema

  • 일반적인 Pydantic Schema 객체를 직접 정의하는 방식.
  • Django 모델과 직접 연결되지는 않는다.
from datetime import datetime
from ninja import Schema

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

2. ModelSchema

- Django의 모델 클래스를 기반으로 스키마를 자동 생성.
- 모델 필드를 명시해서 편리하게 사용할 수 있다.

from ninja import ModelSchema
from tracks.models import Track

class TrackSchema(ModelSchema):
    class Config:
        model = Track
        model_fields = ['title', 'artist', 'duration', 'last_play']

3. create_schema

  • 함수로 간편 생성 가능.
from ninja.orm import create_schema
from tracks.models import Track

TrackSchema = create_schema(Track, fields=['title', 'artist', 'duration', 'last_play'])
profile
난 🥬

0개의 댓글