Python/Django Ninja 12

[Django-Ninja] API 문서 Docs 커스텀

Ninja Docs기본적으로 Ninja에서는 가벼운 설정으로 Swagger나 Redoc을 지원하며https://django-ninja.dev/guides/api-docs/ 문서를 관리하기 위한 다양한 부가 기능들이 존재한다.문서 권한 설정문서 숨기기커스텀 태그 (openapi_extra 속성 v1이상 지원)커스텀 Docs 만들기 (링크) 등 도 가능하다. 문서 숨기기기본적으로 /api/openapi.json 을 바탕으로 -> /api/docs 의 문서를 생성해준다. 이를 Production 등에 활용시 다음과 같이 설정하면, url을 감춰준다.from ninja import NinjaAPIapi = NinjaAPI(docs_url=None) 참고 링크https://github.com/vitalik/dja..

Python/Django Ninja 2024.05.18

[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-imageRUN apt-get ..

Python/Django Ninja 2024.04.21

[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 엔티티 에러가 발생한다...

Python/Django Ninja 2023.10.04

[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 View ..

Python/Django Ninja 2023.07.01

[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 - Routerfrom ninja import NinjaAPIapi = NinjaAPI..

Python/Django Ninja 2023.06.03

[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)- Dj..

Python/Django Ninja 2023.05.24

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

Ninja 정참조 구현models.py는 Comment 테이블에서 Post 테이블을 정참조 함schema.py는 댓글(Comment)에서 게시글(Post) 정보를 하위 항목으로 조회 한다.# models.pyclass 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)# ================================..

Python/Django Ninja 2023.04.29

[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 기반 페이지네이션 방법이다.방법..

Python/Django Ninja 2023.04.16

[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 는 언제 써야 할까? 코드의 유..

Python/Django Ninja 2023.04.09