Python (with. Code)/Django-ninja 11

[Django Ninja] 배포용 도커파일 (Dockerfile)

Dockerfile 기본적으로 Multi-Builder 사용 (builder-image / runtime-image) 만약 linux 에서 제공하는 도구(vi 등)를 쓰고 싶다면 설치 후 runtime-image 에 복사 해야 함 프로젝트명 : mysite / 실행 log는 ./access.log 에 기록 배포는 uvicorn에 gunicorn을 worker로 사용하여 실행 (worker 갯수는 cpu 코어 갯수 * 2) 로컬에 배포 하고 싶다면 ${SERVER_IP} 를 수정 (ex. 127.0.0.1 / 0.0.0.0 ) #################### Server Build #################### FROM python:3.11-slim AS builder-image RUN apt..

[Django Ninja] Validation 구현 방법 (with. Pydantic)

서비스를 개발하면서 들어오는 파라미터에 대해 검증하는 로직을 작성하였고, 해당 필드만 검증하거나, 여러 필드를 한번에 검증해야 된다거나 등등의 여러 경우가 있었다. 사용한 여러 방법들에 대해 정리해보려고 한다. 기본적으로 Django Ninja의 Schema는 Pydantic의 BaseModel을 wrapping 하여 만들어 졌기에, validation은 BaseModel의 @validator, @root_validator 등의 기호를 사용하여 진행하였다. (pydantic 1.x) 1. 타입 검증 (Type Check Validation) 기본적으로 Type에 대한 체크는 Ninja의 Schema에서 선언시 내부적으로 타입을 체크 해준다. 만약 유효하지 않은 Type을 보낼시, 422 엔티티 에러가 발..

[Django Ninja] 설계 패턴 정하기 (feat. 리팩토링)

서론 진행 중인 Django Ninja 프로젝트에서 리팩토링을 진행 하며, 코드의 중복을 줄이거나, 객체지향적 구조로 변경 등의 방향성 외에도, 프레임워크에 맞는 특정 패턴을 기준으로 삼아보려고 하였다. Django에는 "Fat Model Skinny View"라는 대표적인 패턴이 있고, FastAPI는 주로 "Thin Models, Fat Functions" 패턴을 통해 코드의 직관성을 높이는데 집중한다. (참고로 Django Ninja는 FastAPI의 등장을 주 Motivation 중 하나로 얘기하고 있음) Django-Ninja 프로젝트에서 Django의 "Fat Model Skinny View" 설계 패턴이 어울릴까? 해당 글에서는 Django(DRF)의 Fat Models, Skinny Vie..

[Django Ninja] Path Variable & Query Parameter 사용 방법

1. Path Variable - 기본 # Case 1. Path Variable @api.get("/problem/{problem_id}", response=ProblemOut) def get_problem(request, problem_id:int): return Problem.object.get(problem_id=problem_id) 2. Path Variable - 상위 Router 상위 Router(or api)에 Path Variable이 붙어 있는 경우, Path() 를 사용하여 받는다. Path(...) 를 명시하지 않으면, Query Parameter로 인식된다. # Case 2. Path Variable - Router from ninja import NinjaAPI api = Nin..

[Django Ninja] CRUD 예제 (+bulk)

CRUD - Create - Employee 모델 객체를 생성하는 기능 - api : POST - https://127.0.0.1:8000/api/crud/employees - body : 선언한 Schema(EmployeeIn) class EmployeeIn(Schema): name:str department_id: int = None birthdate: date = None @router.post("/employees") def create_employee(request, payload: EmployeeIn): employee = Employee.objects.create(**payload.dict()) return {"id": employee.id} CRUD - Update (PUT/PATCH) -..

[Django Ninja] GIS 데이터 처리 관련 정리

Django Ninja & GIS 관련 설계 조사 정리 내용 Postgis : PostgreSQL DB의 gis 기능이 추가 된 확장 플러그인 (GIS 데이터 처리에 용이) GIS 데이터라 함은 위/경도 데이터 및 반경 내 xx 조사 등, GIS 기반의 기능 구현에 사용됨 1. Postgis 및 GIS 데이터 활용하기 위해서 일반적인 방법 - geoDjango라는 Project 기반으로 작업 가능 - PointField 등 자유롭게 활용 가능 - 단, 프로젝트 자체가 geoDjango로 진행되어야 한다는 단점이 존재 - https://docs.djangoproject.com/en/4.1/ref/contrib/gis/install/ 2. Django Ninja + Pydantic (geo_json) - D..

[Django Ninja] 정참조, 역참조 Schema 구현

Ninja 정참조 구현 models.py는 Comment 테이블에서 Post 테이블을 정참조 함 schema.py는 댓글(Comment)에서 게시글(Post) 정보를 하위 항목으로 조회 한다. # models.py class Post(models.Model): title = models.CharField(max_length=100) content = models.TextField(max_length=300) class Comment(models.Model): message = models.CharField(max_length=20) post = models.ForeignKey(Post, on_delete=models.CASCADE) # ======================================..

[Django Ninja] 커스텀 Pagination 모듈 구현기

Django Ninja에서의 Pagination은 Decorator 선언 만으로 동작 될 수 있도록 유저 편의성이 매우 좋다. (유저 편의성이 좋다는 건 대신 그만큼 커스텀하기 까다롭다는 것..) 이번 글에서는 공식 Docs에서 제공하는 일반적인 Pagination 방법 2가지를 간단히 실행해보고, 추가로 직접 CustomPagination을 구축한 방법에 대해 공유 해보려고 한다. (해당 글은 ninja 0.21.0 버전을 기준으로 작성하였음) 참고 : https://django-ninja.rest-framework.com/guides/response/pagination/ PageNumber 기반 페이지네이션 ninja.pagination 모듈에서 제공하는 PageNumber 기반 페이지네이션 방법이다..

[Django Ninja] API Docs에서 Enum 드롭 다운 표시하기

API Docs에서 Drop down 선택형 구현하기 Django Ninja에서 기본적으로 제공하는 API Docs에서 dropdown 형태의 Enum 선택이 제공되면 편할 것 같아 찾아 보던 중 기존 Django의 enum을 상속 받는 Choices 모듈이 존재하였다. - 해당 Choices 모듈을 원하는 성격에 맞춰 (ex. TextChoices, IntChoices 등) 작성 후에 model에 선언하였고, - 해당 Schema에서 Choices의 형태를 받도록 구현하였다. - 실제 DB에 저장되는 값은, CharField로 선언하였기에 문자열로 저장된다. (ex. InProgress) - Choice에 등록되지 않은 값 추가시 에러가 발생한다. (추가) Choices 는 언제 써야 할까? 코드의 유..

[Django Ninja] Schema 비교 (Schema, ModelSchema, CreateSchema)

Schema Schema란 어떤 데이터나 객체를 정의한 규칙으로 주고 받는 것을 의미한다. 다른 언어, 프레임워크에서는 DTO (Data Transfer Object) 라는 용어로도 많이 사용된다. FastAPI vs Django Ninja 스키마 방식 차이 ex) FastAPI에서 Schema 는 Pydantic을 이용해 정의된다. ex) Django Ninja의 Schema는 Pydantic을 상속 받아 작성 된 방식으로 자체적으로 만든 Schema라는 모듈로 정의됨 공식 Document 에서 제공하는 3가지 Schema를 만드는 방식에 대해 알아본다. 1. Schema 2. ModelSchmea 3. CreateSchema Schema 가장 기본적인 Schema 형태로 DRF의 Serializer와..